記事

【Java Ring】06. 原因はバッテリにあった!

内蔵バッテリを交換したら,もしかしたら⋯

 前回の​記事では,​iB-IDE から​ Java Ring に​話しかけた​ところ,​ POR 補正後の​再ステータス取得で​ CRC エラーが​起きている,と​いう​ところまで​整理しました。

 ​今回は,​その​ CRC エラーに​ついて​もう​少し​調べてみます。

Invalid CRC16 は​本当の​原因ではない!#

 まず,​私は​ Invalid CRC エラーが​すべての​原因だと​考えていました。​人間は​エラー文の​最後を​最終的な​問題と​して​考えてしまいがちですが,​今回の​場合は​そうでは​ありません。

 第一に,​データを​送信した​後に​表示されるのは,Attempting to correct the POR! です。​ これを​検知した​ IDE は,​すぐさま次の​試行を​し,​その​結果と​してまた​同じ​エラーを​受け取ります。​ そして​最後に​ Bad CRC ... と​いう​エラーに​遷移します。

 第二に,​何回か​条件を​変えて​試している​うちに,​CRC エラーが​発生するのは​毎回ではないことが​分かりました。​ どうやら,​CRC エラーと​なるのは,​大体 3/5 で,​それ以外の​場合は​以下の​別の​エラーが​帰っています:

<8 0 40 0>[0]This exception occurred: com.dalsemi.onewire.OneWireException: POR of Device is set., Retrying to send the apdu after POR...
com.dalsemi.onewire.OneWireException: POR of Device is set.
	at com.dalsemi.onewire.container.JibComm.checkStatus(JibComm.java:644)
	at com.dalsemi.onewire.container.JibComm.transferJibData(JibComm.java:426)
	at com.dalsemi.onewire.container.OneWireContainer16.sendAPDU(OneWireContainer16.java:2033)
	at com.dalsemi.onewire.container.OneWireContainer16.getFirmwareVersionString(OneWireContainer16.java:668)
	at com.ibutton.opt.ide.IDEFrame.oneWireArrival(IDEFrame.java:1260)
	at com.dalsemi.onewire.utils.OneWireMonitor.notifyOfArrival(OneWireMonitor.java:181)
	at com.dalsemi.onewire.utils.OneWireMonitor.pollDevices(OneWireMonitor.java:490)
	at com.dalsemi.onewire.utils.OneWireMonitor.run(OneWireMonitor.java:225)

 ここで,​初めて​ POR エラーが​本当の​問題ではないか,と​いう​可能性を​考えました。

Java Ring の​内部​構造を​当たる#

Kingpin

 @Stake Inc. の​ Kingpin 氏の​論文に​よると,​どうやら​ Java Ring ​(の​ iButton)には​ Lithium Backup なる​部​品が​入っている​ことが​分かります。​ 名前から​して,​リチウム電池である​ことが​分かります。

 この​リチウム電池の​用途は​不明です。​同文献に​よると,​Java Ring には​ 32 kHz で​振動する​クォーツが​入っており,​ それが​ Realtime Clock に​寄与していたとの​ことですから,​恐らく​これに​使用されているのは​明らかです。​ 問題は,​RAM の​保持に​これが​使用されているか​どうかです。

 RAM の​保持に​リチウム電池が​使用されていると​仮定します。​恐らく​ Cardlet​(プログラム)は​ RAM に​入っているでしょうし,​ POR 状態の​フラグも​ RAM に​保持されている​可能性が​高いです。​ そう​考えた​場合,もし RAM が​切れていた​場合,​POR から​復帰できなくなると​いう​症状が​発生しても,​全く​おかしく​ありません。

 ​私の​持っている​ Java Ring は,​遅くとも​ 1998 年までに​製造された​ものです。​ 私の​知る​限り 25 年以上​保つ​コイン型の​電池は​有りません。​ そう​考えたら,バッテリを​交換したら​ POR から​復帰できるかもしれない,​私は​そう​思いました。

バッテリ交換?#

 暫く​調べていると,​YouTube(https://www.youtube.com/watch?v=eyg_7VpKyrU) で​ iButton の​バッテリを​交換している方を​発見しました。​ この方の​持つ iButton は,​以下のような​エラーで​通信が​できなくなってしまった​そうです: Invalid CRC16 の例

 Invalid CRC read from device と​いう​ことですから,​私の​エラーと​関連していると​考えて​良さそうです。​ しかも,​バッテリを​交換した​ことで​この​状態から​復帰している​ことも​大変興味深い。

 つまり,​ここまで​散々​追ってきた​ CRC エラーは,​ソフトウェア側の​実装や​ CRC 計算式の​問題ではなく,​ 単に​ iButton 内蔵バッテリの​劣化が​原因である​可能性が​出てきました。

私は​ソフト・ウェア屋さんです#

 ここで​問題に​なるのは,​Java Ring の​中の​ iButton は​ステンレスの​カンカンの​中に​封入されていると​いう​ことです。​ 普通の​電池ボックスのように,​蓋を​パカっと​開けて​交換できるわけでは​ありません。​ しかも,​電池の​位置が​どこに​あるのか検討も​つきません。

 動画を​見る​限り,​iButton の​外装を​こじ開けて​(カンを​切断しています)​中の​セルを​交換する​必要が​ありそうです。​ これは​電子工作と​いうより,​かなり​物理寄りの​作業です。​ もちろん,​開封に​失敗すれば​ Java Ring 自体を​破壊する​可能性が​あります。

 とは​いえ,​現状のままでは​ POR 補正後の​応答が​壊れてしまい,​先へ​進めません。​ どうやら,​私も​バッテリを​交換する​必要が​あるようです。

まとめ#

いかがでしたか?

 この​記事では,​Java Ring で​起きている​ CRC エラーと​似た​症状を​扱っている​ iButton の​バッテリ交換動画を​見つけました。​ どうやら,​問題は​ソフトウェアだけではなく,​内蔵バッテリの​劣化である​可能性が​高そうです。

 次回は,​この​バッテリ交換を​どう​進めるか​考えてみたいと​思います。

ではでは。

前回: 【Java Ring】05. POR エラー!
次回: 【Java Ring】07. ナイトスクープにて,​お会いましょう!

参考#

  • Kingpin, "A Practical Introduction to the Dallas Semiconductor iButton™", @Stake Inc., 2000