「Raspberry Pi 3 (ラズパイ3)」 RTC 追加

はじめに

「Raspberry Pi 3 (以下Pi3)」 用にRTCモジュールHiLetgo 3.3V/5V DS3231 高精度 RTC モジュール リアルタイム クロック モジュールを購入しました。 無事にPi3に取付、設定ができました。

設定方法に関して2021年6月版を追加していますので、新しい情報が必要な方はこちらへ(2021.6.20追記)。

RTCを購入

前述のHiLetgoのRTCはAmazonで注文しました (配送に時間がかかりますが購入時は送料込で200円未満と安価でした)。 発送は香港からで、プチプチが内側に貼られている封筒に現品(下の写真)だけが入れられて送られてきました。ちなみにAmazonにはDS3231を搭載した同様の外観のRTCが他にも出品されているようでした(リンク先には別の製品も含まれています)。国内発送のものですと多少高いですが早く入手できるようです。
DS3231 高精度 RTC モジュール リアルタイム クロック モジュール

袋から出したところです。
DS3231 高精度 RTC モジュール リアルタイム クロック モジュール 外観 横から
写真ではICのマークが読めませんが、ちゃんと DS3231 でした。
DS3231 高精度 RTC モジュール リアルタイム クロック モジュール 外観 表から

RTCをPi3に接続するためにI2Cを設定

Pi3への取付に先立って、GPIO2, GPIO3をI2CのSDA, SCLとして使うように設定をします。
例によって、sudo raspi-configを実行します。 (自分はコマンドラインからraspi-configを入力し、Enterとしました。)
5 Interfacing Options を選択
raspi-config I2C設定 Interfacing Options

P5 I2Cを選択
raspi-config I2C設定

Would you like the ARM I2C interface to be enabled? で「はい」を選択
raspi-config I2C Confirmation

The ARM I2C interface is enabled で「了解」を選択。 その後raspi-configを抜けます。
raspi-config I2C Accept

sudo i2cdetect -y 1 を実行します。 I2Cデバイスはありません。
i2cdetect rtc なし

一旦 sudo shutdown してからACアダプタをコンセントから抜いて電源をOFFします。

Pi3にRTCを取付

写真のようにピンヘッダーに差し込みPi3にRTCを取付します。
Raspberry Pi 3 RTC 取付

手持ちのケースの蓋も問題なく取付できました。
Raspberry Pi 3 RTC 取付 ケース

ACアダプタを再度コンセントに刺して電源をON。

sudo i2cdetect -y 1 を実行すると、アドレス68にデバイス(RTC)が現れました。
i2cdetect RTC 68

Advertisement

RTCを使うための設定を行う

RTCを利用できるように設定を行っていきます。
こちらのサイト(英文) を参考にしました (全く同じというわけではありません)。

以降su コマンド でrootで入って作業を進めます。

RTCデバイスを認識させる
/boot/config.txt の最後に次の行を追加します。
dtoverlay=i2c-rtc,ds3231

その後、
shutdown -r を実行して再起動します。

su コマンド でrootで入って以下の作業を進めます。

i2cdetect -y 1 を実行すると、RTCのドライバが組み込まれたのでアドレス68にUUが表示されています。
i2cdetect rtc UU

以降もそのままrootでの作業です。

フェイクハードウェア時刻を止める
次のコマンドを実行
apt-get purge fake-hwclock

RTCに現在時刻を設定
次のコマンドでRTCに現在の時刻(システム時刻)を設定します。
hwclock -w

ntpd(NTPデーモン)をntpdateに変更
次のコマンドでntpdの使用をやめて、ntpdateを使うようにします。 前述の参考にしたサイトで書かれているリブート時にRTCが2066/01/01 に設定される問題が発生したためです。

apt-get purge ntp
apt-get install ntpdate

ブート時のRTCに関する処理を追加
/etc/rc.localの最後にexit 0 が書かれている行があるので、そのすぐ上に下記を追加します。
これによって、boot時にNTPが有効であればシステム時刻とRTCがNTPの時刻に設定され、NTPが無効であればRTCの時刻がシステム時刻に設定されます。

#RTC
/sbin/hwclock -s
sleep 15
/usr/sbin/ntpdate -b ntp.nict.jp && /sbin/hwclock -w

実はsleep 15を入れないとブートの際のrc.localを実行する際、ntpdateの行でエラーが出てしまいました。 ネットワーク関係の設定が間に合っていないようなのですが今回は時間待ちで対応しています (待ち時間を試行したところ、sleep 7でエラー発生、sleep 8でエラー発生なしでした。そこで、マージンを加えて15にしています)。

/etc/default/hwclockの変更
リブート時にRTCが2066/01/01に再設定されてしまうので、 /etc/default/hwclock のHWCLOCKACCESS=の行をyesからnoに変更します (前述の参考にしたサイトに合わせました)。

#HWCLOCKACCESS=yes
HWCLOCKACCESS=no

cronにNTPによるシステム時刻とRTCの時刻の更新を設定
crontab -e を実行して、次の2行を最後に追加します。
1行目はシステム時刻をインターネット時刻に6時間ごとにスルー(Slew)で合わせるものです。
2行目はシステム時刻を週に1度RTCに設定しなおすものですが必須ではありません。 無くてもシャットダウンの時にはシステム時刻がRTCに書き込まれるためですが、まあ保険です。

*   0,6,12,18 * * * /usr/sbin/ntpdate -B ntp.nict.jp
0  5              * * 0 /sbin/hwclock -w

再起動
シャットダウンして起動しなおすとRTCが適用されているはずです。
インターネットの接続を一時的に止めたり、わざと時刻をずらしたりして動作を確認しました。

RTCの組み込み状態の確認
dmesg | grep rtc と cat /proc/driver/rtc を実行すると表示されます。
dmesg | grep rtc

まとめ

以上の手順でRTCモジュールをPi3に接続、設定し、きちんと使えるようになりました。電源が切れても時刻が大きく狂うことがなく便利です。


関連記事
「Raspberry Pi 3」 買いました。
「Raspberry Pi 3 (ラズパイ3)」 Raspbian Jessieのインストール手順
「Raspberry Pi 3 (ラズパイ3)」 Raspbian Jessieのインストール手順 続き
「Raspberry Pi 3 (ラズパイ3)」 RTC 追加

ラズパイカテゴリの最新記事