ラズパイ2023年10月更新 bookworm ⑩ ラズパイ5のRTC
ラズパイ5になってRTCが搭載されました。バックアップ用電池は別売ですが、純正品が用意されています。OSが立ち上がっていると、NTP(ネットワーク・タイム・プロトコル)サーバと通信し、正しい日時がきざまれます。RTCの内容も補正が必要なら適切に処理されるようです。
●環境
- ハードウェア Raspberry Pi 5(4GBモデル)
- OS Raspberry Pi OS (64ビット)、リリース日December 5th 2023
- Windows10 22H2にて、ssh(OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023)および、VNC Viewerを動作させている
●RTC(リアル・タイム・クロック)
バックアップ電源(電池)のつながったRTCがあれば、ラズパイ5に電源が入っていなくても、時を刻みます。したがって、ネットワークがつながっていなくても、OSが立ち上がれば、正しい日時を得ることができます。
こちらのページによると、ラズパイ5は、revisionが1.0で、 codesは、4GBがc04170、8GBがd04170です。つまり、世界中で、ひとつのハードウェア・モデルが製造販売されています。
Raspberry Pi 5のこのページにはReal Time Clock (RTC)に解説があります。電源用USB-Cコネクタの横にある、2PのコネクタJ5に充電可能な電池をつなげるようになっています。
制御は、その下に見えるRenesasのICが担当しているようです。公式のページの写真にはdialogのロゴが見えますが、ここは、ルネサスが2021年に買収した英国の半導体製造会社です。
●boot/overays/README
READMEには、追加するハードウェアRTCのi2c-rtc関係のデバイス・ドライバの利用方法が書かれています。ラズパイ5のRTC関係はないようです。
●Raspberry Pi 5にリアルタイムクロック。だから何?
この記事によれば、「RTCドライバは起動時に通常のLinux hwclock
の動作に従います」と書かれています。確認してみました。
$ hwclock -v
hwclock from util-linux 2.38.1
System Time: 1709003706.555883
Trying to open: /dev/rtc0
hwclock: cannot open /dev/rtc0: Permission denied
No usable clock interface found.
hwclock: Cannot access the Hardware Clock via any known method.
$ sudo hwclock -v
hwclock from util-linux 2.38.1
System Time: 1709005422.129282
Trying to open: /dev/rtc0
Using the rtc interface to the clock.
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
ioctl(4, RTC_UIE_ON, 0): Invalid argument
Waiting in loop for time from /dev/rtc0 to change
...got clock tick
Time read from Hardware Clock: 2024/02/27 03:43:43
Hw clock time : 2024/02/27 03:43:43 = 1709005423 seconds since 1969
Time since last adjustment is 1709005423 seconds
Calculated Hardware Clock drift is 0.000000 seconds
2024-02-27 12:43:42.119819+09:00
短絡すぎるかもしれませんが、ラズパイ5は、RedHatのようなシステムと同等の「時」の管理ができるようになったということかもしれません。
今までも、pythonでdatetimeモジュールを使って日時を取得できていました。これは、ネットワークでNTPサーバとやり取りをしているので正しい時を得られていたからです。
●起きだす実験
$ python bme280_LCD.py
目に見える形でプログラムを一つ動かします。LCDに結果を表示しています。
ブートローダ設定を編集します。
$ sudo -E rpi-eeprom-config --edit
2行を追加します。
POWER_OFF_ON_HALT=1
WAKE_ON_GPIO=0
CTRL-O、CTRL-Xでエディタを抜けたら次のメッセージが表示されました。
/sys/class/rtc/rtc0/wakealarmに、ラズパイ5を非常に低電力状態 (約3mA)に切り替える時間を書き込みます。ここでは180秒です。
$ echo +180 | sudo tee /sys/class/rtc/rtc0/wakealarm
+180
$ sudo halt
ネットワーク接続が切れ、
- LCDの表示はそのままでで、内容は更新されなくなり
- ラズパイ5につないでいるディスプレイが暗転し
- ラズパイのボード上の緑のLEDが赤色に変化
3分後、何も起こりません。停止したままです。
電源スイッチを押して起動し、60秒を書き込んでみました。
$ echo +60 | sudo tee /sys/class/rtc/rtc0/wakealarm
+60
/sys/class/rtc/rtc0のwakealarmの内容は、Unixtimeがテキストで記述されます。
1709088781
現在の時刻は、2024-02-28 13:04:32 1709093072 は、未来の時間です。
こんどは、600秒の設定をします。
$ echo +600 | sudo tee /sys/class/rtc/rtc0/wakealarm
読み出した時刻は、約10分後になっていました。
1709093712 は、2024-02-28 13:15:12
1分ほどして読み出します。
1709093712
変化はありません。つまり、10分後の時間が設定されており、どこかべつのところでカウントダウンが行われているようです。
<10分ほど休憩中>
13:15:33には、ラズパイが立ち上がっていました。
$ dmesg | grep rtc
[ 0.382033] rpi-rtc soc:rpi_rtc: registered as rtc0
[ 0.383543] rpi-rtc soc:rpi_rtc: setting system clock to 2024-02-28T04:15:24 UTC (1709093724)
bme280_LCD.py の実行は止まったままです。勝手にアプリの実行は継続はしないようです。
再度試します。 14:00に、
$ echo +600 | sudo tee /sys/class/rtc/rtc0/wakealarm
+600
$ sudo halt
(休憩中)
14:10 起動しました。正常にこの仕組みは動くようです。つまり、低電力状態に移行し、その後ラズパイを正常な状態に戻ったら、何らかの処理プログラムを起動するという手順で、定期的な監視用のプログラムを動かすなどができそうです。