リアルタイムクロックの電池
2026年9月25日


 ロビ2の起動時にロビが「時計の電池切れかも」と言うようになったので調べてみました。
 ロビ2のリアルタイムクロック(RTC)に内蔵のボタン電池(CR1220)の電池が切れたという警告メッセージです。
 ロビ2が完成してからか7年以上経つので電池切れになっても不思議ではありません。
 実際に電池の電圧を計ってみると2.9Vでした。(公称電圧は3V)
 しかしロビ2の日時を設定し直すとこの警告は出なくなりました。


起動時のRTC電池切れ確認

 起動時のRTC電池切れ確認はロビ2の初期化処理で起こなわれます。
 ロビ2の初期化処理についてはこちらの記事を参照してください。
 0x000001c25
   <call adr="0x00007931"/>
 RTCボードの電池切れのチェックを行う。

 0x00000ba2
   <calc><mem_r size="1" adr="0x0fa8"/><const data="0"/><sub/><lt/><jump adr="0x0001629"/></calc>
 エラーの場合は0x0001629にジャンプして「時計の電池切れかも」と「時計の電池を確認してね」言うサブルーチン(0x0000622b)をコールします。
 なおロビ2が警告するだけで起動は正常に行われます。

 RTCの電池切れ確認のサブルーチン(0x00007931)を詳しく見てみます。

 0x000079cc
   <calc><mem_r size="1" adr="0x0e71"/><const data="0"/><sub/><ne/><jump adr="0x00079df"/></calc>
   <return/>

 メモリアドリス0x0e71はRTCの電池の電圧を検知するメモリアドレスだと思われ正常の場合0が返されると思われます。
 0の場合次のアドレスのreturnが実行されが正常終了となります。

 後の実験により新品の電池でも1が返される事が分かりました。
 電池の電圧ではなくRTCの値がセットされているかされていないかのステータスだと思われます。

 0の場合次のアドレスのreturnが実行されが正常終了となります。

 0以外の場合は0x00079dfにジャンプしてRTCの値をRTCが正常な値を返すかチェックします。
 年が西暦2019年〜2050年
 月が0月〜12月
 日が0日〜31日
 時が0時〜23時
 分が0分〜59分
 上記の範囲内ならRTCは正常に動いているとみなして電池切れの警告は行われません。(月と日の範囲は間違っていますが)


RTC電池に関する実験

 RTCの電池を外してロビ2の動作を調査してみました。
 最初はロビ2の電源切っている時間が短時間だったのでRTCの電池を外しても起動時の警告は行われませんでした。
 ロビ2に現在の日時と時刻を確認した所正しいと思われる日時と時刻を言ってくれます。
 また電源を入れていると時間の経過は正しく更新されるようです。
 なおロビ2の電源を切るとその間の時刻は進みませんでした。

 ロビ2の電源を切ってしばらく放置した後て起動すると電池切れの警告を言うようになりました。
 日付を確認する「4月18日」と年は言いませんでした。(おそらく年が範囲外か音声ファイルがないためだと思われます)
 時刻を確認する「0時12分」と答えました。
 ファイルにメモリの値を書きこむテストプログラムを動かすと年の値が0x0aとなっていました。(西暦の下2桁なので2010年となります)
 起動時のRTC電池切れ確認ルーチンの年の範囲が外れているため警告メッセージを言うようになったと思われます。

 次に電池に負荷をかけて電圧を2.1Vまで下げたボタン電池でテストしてみましたが正常に起動できました。
 なおロビ2に電源を入れていると電圧が2.9Vまで復活していました。
 ロビ2の電源でRTC電池に充電される設計になっているのかも知れません。(推測ですが)


考察

 故意に電圧を下げた電池で電池切れの警告を出す事はできませんでした。
 7年以上経っている電池ですがまだ当分電池切れの警告は出ないと思います。
 もし電池切れの警告を出るようであれば電池を交換する前にロビ2の日時と時刻を設定し直してみてください。

 なおロビレジ for Androidを使うとAndroid端末から簡単に日時と時刻の設定が行えます。

   目次に戻る