Ricoh 150 сброс уровня тонера при помощи arduino

Тема в разделе "Глядите, что я сделал", создана пользователем serenky, 11 фев 2018.

  1. serenky

    serenky Нерд

    Так получилось, что новый картридж отпечатал у меня 315 листов и скоропостижно закончился. Мерзкая красная лампочка на кнопке включения загорелась и не гасла. Хотя производитель в документации указывает на 700 листов. Я целую неделю ходил возмущенный до крайней степени, такой подлянкой от «всемирно известного бренда». Я даже позвонил в магазин в надежде на решение данного вопроса. Но мне ясно и четко объяснили, что данный вид облуживания, не предусмотрен производителем. Будьте добры покупайте новое. В конце концов я превозмогая свою лень начал разбираться, при том, что возникла реальная необходимость в принтере.
    Googleговорил, что в картридже тонера еще должно быть много, и требуется всего лишь обнулить уровень тонера, при помощи программатора. Схем программаторов приводилось много. В принципе схемы не сложные и вполне воспроизводимые. Но особого желания паять программатор не было, а на полочке лежала и ждала своего времени плата arduino, чем не программатор.
    Вся информация о количестве тонера, номер картриджа, количества отпечатанных листов и т.д. содержится в чипе памяти 24L02, установленным на небольшой плате. Чип может быть разным 24C02, 24C01, 24L01, сути это не меняет. Для дальнейшей работы желательно снять плату с картриджа, но не обязательно, если есть возможность прицепится к контактным площадкам платы. Для первого раза необходимо удалить две точки крепления платы.

    [​IMG]

    Далее подключаем по схеме:

    [​IMG]

    Я подключал при помощи «зажимов». Только необходимо защитить саму микросхему, с обратной стороны контактных площадок. В моем случае выглядело примерно так.

    [​IMG]

    Подтягивающие резисторы обязательно.

    Для работы с такой памятью существует библиотека arduinoEeprom24C01_02 библиотека. Для определения адреса по шине i2cиспользуется библиотека i2c_scanner. Я все «завернул» в один скетч, так что можно использовать его. Заливаем его в arduino, после автоматически определяется адрес подключенного устройства. Вводим букву «R» мониторе порта для чтения подключенной памяти, или букву «W» - для записи.

    [​IMG]

    Далее вставляем назад плату, закрепляем на клей или скотч, или др. При необходимости засыпаем тонер, и пользуемся.

    Скетч представлен ниже.


    Код (C++):


    #include <Wire.h>

    #include <Eeprom24C01_02.h>



    #define  eepromSize   //  eeprom 2 Kbit (256x8) eeprom / закомментировать если eeprom 1 Kbit (128x8)


    byte incomingByte;

    #ifdef eepromSize

    byte inputBytes[] = {0x32, 0x00, 0x01, 0x03, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                         0x16, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x59, 0x36, 0x35, 0x36, 0x4D, 0x41, 0x30, 0x34, 0x37, 0x33, 0x34, 0x20, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                        };

    #else

    byte inputBytes[] = {0x32, 0x00, 0x01, 0x03, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                         0x16, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x59, 0x36, 0x35, 0x36, 0x4D, 0x41, 0x30, 0x34, 0x37, 0x33, 0x34, 0x20, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                        };
    #endif

    const byte count = (sizeof(inputBytes) / sizeof(inputBytes[0])) - 1;
    byte adr;


    void setup()
    {
      // Initialize serial communication.
      Serial.begin(115200);
      Wire.begin();

      adr = i2c_scan();
      if (adr != 0) {
        Serial.println("W-write eeprom (reset)");
        Serial.println("R-read eeprom");
      }

    }
    void READ () {
      static Eeprom24C01_02 eeprom(adr);
      eeprom.initialize();
      int s = 0;
      Serial.println("Read bytes:");
      for (int i = 0; i <= count; i++)
      {
        byte outputBytes = eeprom.readByte(i);
        if (outputBytes < 16) Serial.print("0");
        Serial.print(outputBytes, HEX);
        s++;
        if (s == 16) {
          Serial.println("");
          s = 0;
        }
        else  Serial.print(" ");
      }
    }

    void WRITE () {
      static Eeprom24C01_02 eeprom(adr);
      eeprom.initialize();
      // Write a byte at address 0 in EEPROM memory.
      Serial.println("Write byte to EEPROM memory...");
      for (int i = 0; i <= count; i++) {
        eeprom.writeByte(i, inputBytes[i]);
        delay(10);  // Write cycle time (tWR). See EEPROM memory datasheet for more details.
      }
      Serial.println("Ok.");
    }


    byte i2c_scan () {

      byte error, address;
      int nDevices;

      Serial.println("Scanning...");

      nDevices = 0;
      for (address = 1; address < 127; address++ )
      {
        // The i2c_scanner uses the return value of
        // the Write.endTransmisstion to see if
        // a device did acknowledge to the address.
        Wire.beginTransmission(address);
        error = Wire.endTransmission();

        if (error == 0)
        {
          Serial.print("I2C device found at address 0x");
          if (address < 16)
            Serial.print("0");
          Serial.print(address, HEX);
          Serial.println("  !");
          Serial.println("");
          nDevices++;
          return address;
        }
        else if (error == 4)
        {
          Serial.print("Unknown error at address 0x");
          if (address < 16)
            Serial.print("0");
          Serial.println(address, HEX);
        }
      }
      if (nDevices == 0)
        Serial.println("No I2C devices found\n");
      else
        Serial.println("done\n");
      return 0;
    }

    void loop()
    {
      if (Serial.available() > 0 & adr != 0) {
        incomingByte = Serial.read();
        if (incomingByte == 'W') WRITE();
        if (incomingByte == 'R') READ ();

      }
    }
     
    Последнее редактирование: 7 июн 2018
    hahaha, IvanUA и Tomasina нравится это.