PX-G920 廃インク吸収パッドのカウンターリセット | かっぱのひとりごと

かっぱのひとりごと

日々の思いをつぶやいています。


テーマ:

五月に掃除した、我が家のプリンタ「PX-G920」

内部の部品調整時期のメッセージがずっと出てましたが、ついに、廃インク吸収パッドのカウンターがオーバーしてしまったようで、インクランプと用紙ランプが交互にピコピコ点滅を繰り返すようになりました。

電源ボタン以外は全く受け付けない状態です。

 

「12年も使ったし、そろそろ買い替えるか」

という気持ちと、

「まだどこも悪くないのに、強制的に買い換えさせられるのはムカつく」

という気持ちが戦った結果、

 

「何とかカウンターをリセットしよう」

ムカつく気持ちが勝ちました。

 

1.SSC Service Utility を試みる

PX-G900 = 海外モデルの Epson Stylus Photo R800 らしいので、R800で実行してみたけど、どうも通信がうまくいっていないようで無理でした。PX-G900 と G920 は別物の扱いのようです。

 

2.Epson adjustment program R800 を試みる

いきなり「dllが無い」と言われ困る。

Win98 XP あたりで動くことが分かったので、嫁が学生の時に使っていた、びぶ朗(FM-V BIBLO NE3/45LR)を引っ張り出して動かすも、認識するのだが、

「communication error occurred.」と出てアウト。

 

3.Epson Maintenance Reset Utility を試みかけてやめる

EPSON の US サイトにあったりセットプログラム。

だけど、一回限りで一時的にしか復活しない仕様のようなので、やめる。

 

4.WIC というものを発見。

金がかかるのでやめる。

(そもそも、対応機種ではなかったみたい)

 

諦めかかったのだけど、「カウンターの数値って、EEPROMに書き込んでるんとちゃうか?外付けやったら書き換えられるんとちゃうか?」

 

早速バラしました。

左がメイン、右が電源基板

 

あった!

「S24CS02A」 I2C の EEPROM

これなら Arduino で読み書きできる。

 

でも、この中のどの数値を書き換えるかわからん。わかっているのは、カウンターの数値が

0番 : 14787 
80番 : 17115 

を超えると、ロックがかかる。ということだけ。

とりあえず2バイトずつ取り出してそれらしい数値があれば書き換えるか。とか思ってたんだけど

なんと、『Epson Stylus Photo R800 Service Manual』 なるものを発見!らっき~!

そこには


􀂄 Home side : 14787 count or more
􀂄 Opposite-to-home side : 17115 count or more


􀂄 Home side: 24<H>, 25<H>
􀂄 Opposite-to-home side: 26<H>,27<H>

 

と書いてある。

では、ROMのデータを読んでみよう。

取り外して DIP に変換。

 

スケッチはラジオペンチさんの「ArduinoでI2Cの外付けEEPROMを使う」のものを少し改造。アドレス指定を 16bit → 8bit に変更(最後に記載)

 

接続図(ラジオペンチさんの図をそのままお借りしました。ずぼらしました。すみません。)

シリアルモニタにダンプされたデータ。

アドレス:データ

􀂄 Home side (14787 count or more)

0x24 : 0xCF

0x25 : 0x19

􀂄 Opposite-to-home side (17115 count or more)

0x26 : 0x96

0x27 : 0x20

となっているのですが、

Home side を

0x19CF にしても 0xCF19 にしても 14787 にならない。

Opposite-to-home side もそう。

 

もう計算方法がよくわからないので

『全部 0 にすればリセットしたことになるだろう』

という、適当な理由で「0」に書き換えました。

 

基板は 1.27mm ピッチ、DIP は 2.54mm ピッチ。

若干アクロバティックな方法で接続しました。

 

で、組み直して(ねじが一本余ったけど気にしない)、電源を入れる。

お~ピコピコ点滅しなくなったよ。

動き出したよ。

・・・

なんかエラーで止まったよ。通信エラーっぽい。

 

電源を入れなおす。

・・・

ばっちりっす!今のところ問題なく動いています。

おそらく、PX-G900 ~ G930 まで、行ける方法だと思います。

需要があるかわかりませんが、いちおうGoogle Drive にスケッチをアップしておきます。

ソースはこちら。

「PX-G920リセット」フォルダの「S24CS02A_rw.zip」です。

------


スケッチはこちら。
/*
ベース
 * I2C EEPROMの読み書きテスト
 * 対応素子:24LC32, 24LC64, 24LC128, 24LC256, 24LC512
 * 2015/07/03 ラジオペンチ http://radiopench.blog96.fc2.com/
 * ダンプ出力にASCII文字を追加
 
S24CS01A_02A用に改造(のっち)
容量が小さいのでアドレス指定が 8bit
 */
 
#include <wire.h> //I2C ライブラリ
 
unsigned int startADR = 0x0000;
unsigned int endADR = 0x00FF; // アドレス上限
unsigned int ADR;
byte data;
char ascii[16]; // ASCII文字表示用バッファ
 
void setup() {
  Wire.begin();
  Serial.begin(9600);
 
/* // EEPROMに値を書き込みたい場合はコメントアウトを外す
    Serial.print("Writing");
      i2cEEPROM_write( 0x50, 0x24, 0); // データーを書込
      i2cEEPROM_write( 0x50, 0x25, 0);
      i2cEEPROM_write( 0x50, 0x26, 0);
      i2cEEPROM_write( 0x50, 0x27, 0);
*/  // ここまで
    
  Serial.println(); // 書き込み完了で改行
  Serial.println(); //
 
  Serial.println("EEPROM dump"); // EEPROMのダンプ開始
  Serial.println("ADDR  0  1  2  3  4  5  6  7  8  9  A  B
  C  D  E  F ASCII CHARACTER");
 
  // 全アドレス範囲をダンプ
  for (ADR = startADR; ADR <= endADR; ADR++) {

    if ((ADR % 16) == 0) { // 行の先頭なら
      printADR(ADR);       // アドレス表示
      for (int n = 0; n <= 15; n++) {
        ascii[n] = ' '; // ASCII文字表示バッファを初期化
      }
    }
    data = i2cEEPROM_read(0x50, ADR); // 外付けEEPROM読出
    Serial.print(data >> 4, HEX); // 上位4ビット
    Serial.print(data & 0x0F, HEX); // 下位4ビット
    Serial.print(" ");              // スペース入れ
    if ((data > 0x20) & (data < 0x7F)) { // 表示可能文字
      ascii[ADR & 0x0F] = data; // 表示バッファに記録
    }
    if ((ADR % 16) == 15) { // 行末なら
      for (int n = 0; n <= 15; n++) { // ASCIIで表示
        Serial.print(ascii[n]);
      }
      Serial.println(); // 改行
    }
  }
}
 
void loop() {   // 無限ループで停止
}
 
void i2cEEPROM_write(int i2cADR, unsigned int eeADR, byte
data ) {
  Wire.beginTransmission(i2cADR); // i2cアドレス指定
  Wire.write((byte)(eeADR & 0xFF)); // EEPROMアドレス指定
  Wire.write(data);
  Wire.endTransmission();
  delay(5); // 書き込み完了待ち
}
 
byte i2cEEPROM_read( int i2cADR, byte eeADR ) {
  Wire.beginTransmission(i2cADR); // i2cアドレス指定
  Wire.write((byte)(eeADR & 0xFF)); // EEPROMアドレス指定
  Wire.endTransmission();
  Wire.requestFrom(i2cADR, 1); // 1バイトデータリクエスト
  while (Wire.available()) { 
    data = Wire.read();  // データ受信
  }
  return data;
}
 
void printADR(unsigned int a) { // アドレスを4桁表示
  String b = "";
  if (a < 0x1000) {
    b = "0";
  }
  if (a < 0x100) {
    b = "00";
  }
  if ( a < 0x10) {
    b = "000";
  }
  Serial.print(b);
  Serial.print(a, HEX);
  Serial.print(" ");
}

のっちさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

SNSアカウント

Ameba人気のブログ

Amebaトピックス