AdafruitのRiRTCを入れてRTCで時間を管理してみた。
ハードウェアとソフトウェア
使ったハードウェアとソフトウェアは次の通り。
RASPBERRY PI 3 MODEL B+
https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/
RASPBIAN STRETCH WITH DESKTOP AND RECOMMENDED SOFTWARE
Image with desktop and recommended software based on Debian Stretch
Version:November 2018
Release date:2018-11-13
Kernel version:4.14
Release notes:Link
https://www.raspberrypi.org/downloads/raspbian/
Adafruit PiRTC - PCF8523 Real Time Clock for Raspberry Pi
https://www.adafruit.com/product/3386
I2Cの設定
raspi-configでInterfacing OptionsからP5 I2Cを選び、I2Cを使えるようにしておく。
RASPBIAN STRETCH WITH DESKTOP AND RECOMMENDED SOFTWAREを入れたら必要なものがすべて入っていたようで次のパッケージを指定してみたら既に入っているとして何もしなかった。
$ sudo apt-get install python-smbus i2c-tools
きちんとi2cで接続出来ているかの確認。
$ sudo 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- $
うまくいっているので次に /boot/config.txt に記述を加える。
dtoverlay=i2c-rtc,pcf8523
ハードウェアクロックの同期
リブートした後、今度はハードウェア・クロックを同期させる。
$ sudo hwclock -w
rtcの時間とRaspberry piの時間がシンクロしていることを確認する。ソフトウェアの時計(カーネルの保持している時計)とハードウェアの時計(rtcモジュールの時間)との差があらわれる。この場合は同じかあって1秒程度の差である。
$ date; sudo hwclock -r 2018年 11月 19日 月曜日 18:13:25 JST 2018-11-19 18:13:25.576444+0900
秒の値が同じかズレていても1秒程度である。
システムまわりの設定
次に /etc/default/hwclock の設定を変更し最後の行のコメントアウトを外してrtc0を利用できるようにしておく。
HCTOSYS_DEVICE=rtc0
ブート時に使われるfake-hwclockを取り除く。
$ sudo apt-get remove fake-hwclock $ sudo update-rc.d fake-hwclock remove
次に/lib/udev/hwclock-setに次の変更を加える。何故かここが悪さをしているのでコメントアウトした。なぜこの記述があるのかちょっとわからない。少なくとも今回のシステム環境ではこれがあると正しく動かない。
7,9c7,9 < if [ -e /run/systemd/system ] ; then < exit 0 < fi --- > #if [ -e /run/systemd/system ] ; then > # exit 0 > #fi
これでブート後にハードウェアの時計を参照して立ち上がるようになる。
本当にrtcモジュールが効いているのか確認するためにネットワークをオフにしてリブートする。成功していると秒数の単位で同じか1秒程度遅れた時間になっているはずである。もしうまくいっていないと20秒から30秒の違い(リブートの時間程度)が出ているはずである。下記はうまくいった場合の値である。
$ date; sudo hwclock -r 2018年 11月 19日 月曜日 18:45:58 JST 2018-11-19 18:45:58.231944+0900