はじめに
「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が他にも出品されているようでした(リンク先には別の製品も含まれています)。国内発送のものですと多少高いですが早く入手できるようです。
袋から出したところです。
写真ではICのマークが読めませんが、ちゃんと DS3231 でした。
RTCをPi3に接続するためにI2Cを設定
Pi3への取付に先立って、GPIO2, GPIO3をI2CのSDA, SCLとして使うように設定をします。
例によって、sudo raspi-configを実行します。 (自分はコマンドラインからraspi-configを入力し、Enterとしました。)
5 Interfacing Options を選択
P5 I2Cを選択
Would you like the ARM I2C interface to be enabled? で「はい」を選択
The ARM I2C interface is enabled で「了解」を選択。 その後raspi-configを抜けます。
sudo i2cdetect -y 1 を実行します。 I2Cデバイスはありません。
一旦 sudo shutdown してからACアダプタをコンセントから抜いて電源をOFFします。
Pi3にRTCを取付
写真のようにピンヘッダーに差し込みPi3にRTCを取付します。
手持ちのケースの蓋も問題なく取付できました。
ACアダプタを再度コンセントに刺して電源をON。
sudo i2cdetect -y 1 を実行すると、アドレス68にデバイス(RTC)が現れました。
RTCを使うための設定を行う
RTCを利用できるように設定を行っていきます。
こちらのサイト(英文) を参考にしました (全く同じというわけではありません)。
以降su コマンド でrootで入って作業を進めます。
RTCデバイスを認識させる
/boot/config.txt の最後に次の行を追加します。
dtoverlay=i2c-rtc,ds3231
その後、
shutdown -r を実行して再起動します。
su コマンド でrootで入って以下の作業を進めます。
i2cdetect -y 1 を実行すると、RTCのドライバが組み込まれたのでアドレス68に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 を実行すると表示されます。
まとめ
以上の手順でRTCモジュールをPi3に接続、設定し、きちんと使えるようになりました。電源が切れても時刻が大きく狂うことがなく便利です。
関連記事
「Raspberry Pi 3」 買いました。
「Raspberry Pi 3 (ラズパイ3)」 Raspbian Jessieのインストール手順
「Raspberry Pi 3 (ラズパイ3)」 Raspbian Jessieのインストール手順 続き
「Raspberry Pi 3 (ラズパイ3)」 RTC 追加
コメントを書く