記事
【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 の内部構造を当たる#

@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 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