はじめに
Raspberry Pi 4(RPi4)を普通のPCとして使用できない理由の一つは、リアルタイムクロック(RTC:時計)を搭載していない事ですが、安価なArduino用のRTCモジュールがRPi4でも使えます。
購入品情報
Arduino用にずいぶん前に購入していた時計モジュールをRPi4に接続してみました。
このモジュールは5V /3.3V のどちらでも動作するので、RPi4にも直結できます。5Vの時は充電できるバックアップ電池を使う必要があり、充電できない普通のCR2032を使う場合は改造が必要ですが、3.3Vのときは改造は不要です。
接続
といってもインタフェースがI2Cなので、Raspberry Pi のI2Cと電源3.3VとGNDの4本をケーブルで繋ぐだけです。
RPi4 RTC Module
3.3V 1―――― 2 VCC 赤
SDA 3 ―――― 3 SDA オレンジ
SCL 5 ―――― 4 SCL 黄色
GND 9 ―――― 1 GND 茶色
設定
ラズパイメニュからRaspberry Pi の設定を開き、インターフェイス タブでI2Cを有効にしてOKを押します。
これで、I2Cが使えるようになります。再起動の必要はありません。
次に端末を開き、以下のコマンドでRTCモジュールが認識されているか確認します。
pi@raspberrypi:~ $ /usr/sbin/i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- --57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
このモジュールは、RTCとEEPROMが搭載されているので、二つのアドレスが表示されていればOKです。
アドレスの0x57がEEPROMで、アドレスの0x68がRTC DS3231です。
インストール
RTCのチップはDS3231ですが、rtc_ds1307 のデバイスが使用できます。一応対応を確認してから、デバイスとI2Cのアドレスを関連付けます。
pi@raspberrypi:~ $ sudo modprobe -c |grep ds3231
alias i2c:ds3231 rtc_ds1307
alias of:N*T*Cmaxim,ds3231 rtc_ds1307
alias of:N*T*Cmaxim,ds3231C* rtc_ds1307pi@raspberrypi:~ $ echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
再度I2Cに接続されているデバイスを確認すると、さっきの68のところがUUに代わっていればOKです。
pi@raspberrypi:~ $ /usr/sbin/i2cdetect -y 1
(中略)60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
(後略)
RTCの動作確認
RTCへの現在時刻の設定は、 hwclock -w コマンドで行います。
pi@raspberrypi:~ $ sudo hwclock -w
2021-03-24 22:27:00:48.602690+09:00
うまく機能していれば、システム時刻をRTCに書き込みます。
うまく機能していない場合は
hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --verbose option to see the details of our search for an access method.
と表示されます。
RTCからの時刻の読み出しは、 hwclock -r コマンドです。
pi@raspberrypi:~ $ sudo hwclock -r
2021-03-24 22:27:00:48.636663+09:00
時刻が読みだされたら動作確認は終了です。
起動時スクリプト
RPi OSは、起動時に毎回ネットワーク経由で時刻を入手してきてそれを使用する設定(fake-hwclock)になっています。これを起動時にRTCクロックから入力するように変更します。変更するファイルは /etc/crontab と /etc/rc.local の二つのファイルです。
pi@raspberrypi:~ $ sudo vi /etc/rc.local
(中略)
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 1
/sbin/hwclock --hctosys(中略)
exit 0
pi@raspberrypi:~ $ sudo vi /etc/crontab
(中略)0 13 * * * root /sbin/hwclock --hctosys
(中略)
今後RTCを使うなら”fake-hwclock”をアンインストール
1.”fake-hwclock”をアンインストールします。
pi@raspberrypi:~ $ sudo apt-get purge fake-hwclock
2.“/boot/config.txt”を編集 最後に二行追加
pi@raspberrypi:~ $ sudo vi /boot/config.txt
# RTC_DS3231
dtoverlay=i2c-rtc,ds3231
3.“/etc/udev/rules.d/85-hwclock.rules”を新規作成 1行記述
pi@raspberrypi:~ $ sudo vi /etc/udev/rules.d/85-hwclock.rules
KERNEL=="rtc0", RUN+="/sbin/hwclock --rtc=$root/$name --hctosys"
4.確認
RPi4をネットワークから切り離して電源をオフにし、しばらくしてから再起動します。そしてディスクトップの時計が、正しい時刻になっていたら成功です。
戻す場合
編集した2つのファイルを戻して、fake-hwclock を再度インストールします。
pi@raspberrypi:~ $ sudo apt-get fake-hwclock
再起動して元に戻ることを確認して下さい。
おわりに
RPi4はRTCを積んでいないで、ネットから時刻が取れない場合はファイルの作成時間や、ログの時間が起動していた最後の時からの続きになり、ぐちゃぐちゃになってしまいます。
ほんとはRPi4を低消費電力のスリープ状態にできれば、RTC は無くても良いのですが、RPi4はスリープやスタンバイにできないので、ネットワーク接続が無い状況でPCとして使う場合はRTCが必須だと思います。(時刻はとても重要です。)
RTCのチップの原価は100円しないと思うけどなんで付けていないんだろう。ネット接続が前提のChrome OSなら判りますが、そもそもセキュリティの甘いRaspberry Pi では、必要な時以外ネットから切り離していた方が安心だと思います。後は電源が自動でOFFにできるようになれば、ノートPCとして使えそうです。
おしまい
購入品情報
RPi4にRTCが付けば、ネットワークにつなっがっていない状態でも正確な時刻が使えるようになり、普段使いのPCやノートPCとして使えるようになります。
RTC 3個で1000くらい(@333円)
はこれを使っています。
充電可能なバッテリー
バッテリバックアップする場合の電池はこちらから。 一個450円くらい。
4個で1120円 くらい
バッテリのケースをはずして薄く仕上げるにはリード付きのこっちの方が良いと思います。 780円 ちょっと高い。
(今度買ってみよう)
接続ケーブル 1000円くらい
参考
データシート