AdafruitのRiRTCを入れてRTCで時間を管理してみた

投稿者: | 2018年11月19日

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