Raspberry Pi は RTC を持っていないため、 NTP サーバにつながらないと時刻取得ができず、時刻が狂った状態で動作することになります。しかし、場合によってはインターネットに出られない環境で動かしたいこともあるはずです。そんなときのために、 RedSleeve が動いている Raspberry Pi に、ミニ RTC モジュールを導入する方法を解説します。ミニ RTC モジュールを導入した Raspberry Pi を NTP サーバとし、他の Raspberry Pi に時刻を提供すれば、全て Raspberry Pi な環境を作ることができます。
ここで用いるミニ RTC モジュールは以下の製品ですが、リンク先を参照していただけると分かるように、既に販売終了となっております…。
実は、いつか投稿しようと半年ほど前に書いた文章を、再度検証しながら投稿しているため、こんなことになっています。他の製品でも流用可能な部分もあると思いますので、一応記録として残しておきます。
ミニ RTC モジュールの取り付け
以下の画像のように、ミニ RTC モジュールが内側を向くように、 GPIO の 1,3,5,7 番ピンに取り付けます。
i2c-tools のインストール
これがないと動きません。
[root@localhost ~]# yum install i2c-tools
モジュールの読み込み
モジュールを読み込むためのファイルを作成します。 2 つのファイルを 1 つにまとめても大丈夫だと思います。
[root@localhost ~]# echo 'i2c-dev' > /etc/modules-load.d/i2c-dev.conf [root@localhost ~]# echo 'rtc-ds3232' > /etc/modules-load.d/rtc-ds3232.conf
ここで再起動するか、 modprobe でモジュールを読み込みます。
[root@localhost ~]# modprobe i2c-dev [root@localhost ~]# modprobe rtc-ds3232
ミニ RTC モジュールの接続確認
ミニ RTC モジュールが 0x68 に接続されていることを確認します。
[root@localhost ~]# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
デバイスの通知
0x68 に ds3231 が接続されていることを通知します。
[root@localhost ~]# echo 'ds3231 0x68' > /sys/class/i2c-adapter/i2c-1/new_device
接続の確認
hwclock で時刻が出れば正しく接続されています。
[root@localhost ~]# hwclock -r Mon Nov 30 17:35:30 2015 -0.438350 seconds
初めて繋いだ場合には、おかしな時刻が表示されるので、システムの時刻に同期させます。
[root@localhost ~]# hwclock -w
起動時の時刻取得の設定
検索すると /etc/rc.local に書くようなものがたくさん見つかりますが、早めに時刻を取得して欲しいので、以下のような .service ファイルを作ります。
[root@localhost ~]# cat /etc/systemd/system/rtc.service [Unit] Description=Prepare Hardware Clock Before=chronyd.service rsyslog.service network.target [Service] Type=oneshot ExecStartPre=/bin/bash -c "/bin/echo 'ds3231 0x68' > /sys/class/i2c-adapter/i2c-1/new_device" ; /bin/sleep 1 ExecStart=/sbin/hwclock -s ExecStop=/sbin/hwclock -w RemainAfterExit=yes [Install] WantedBy=multi-user.target
起動時に自動実行されるようにします。
[root@localhost ~]# systemctl enable rtc
動作の確認
chronyd を起動時に自動起動しないようにするなど、 NTP による時刻同期が行われないようにします。
[root@localhost ~]# systemctl disable chronyd
ここで再起動します。再起動後、時刻取得が正常に行われていることを確認します。
[root@localhost ~]# systemctl status rtc rtc.service - Prepare Hardware Clock Loaded: loaded (/etc/systemd/system/rtc.service; enabled) Active: active (exited) since Mon 2015-11-30 17:43:54 JST; 1min 31s ago Process: 257 ExecStart=/sbin/hwclock -s (code=exited, status=0/SUCCESS) Process: 198 ExecStartPre=/bin/sleep 1 (code=exited, status=0/SUCCESS) Process: 185 ExecStartPre=/bin/bash -c /bin/echo 'ds3231 0x68' > /sys/class/i2c-adapter/i2c-1/new_device (code=exited, status=0/SUCCESS) Main PID: 257 (code=exited, status=0/SUCCESS) CGroup: /system.slice/rtc.service Jan 01 09:00:03 localhost systemd[1]: Starting Prepare Hardware Clock... Nov 30 17:43:54 localhost systemd[1]: Started Prepare Hardware Clock.
[root@localhost ~]# hwclock -r ; date Mon Nov 30 17:46:19 2015 -0.161533 seconds Mon Nov 30 17:46:19 JST 2015
chronyd を自動起動しないようにした場合には、元に戻します。
[root@localhost ~]# systemctl enable chronyd
これでミニ RTC モジュールの導入は終わりです。なお、 chronyd でローカルタイムを配信したい場合、 chrony.conf の local stratum 10 という行を有効にします。 ntpd のように server 127.127.1.0 ではないので注意!
ピンバック: [RaspberryPI]時計について – 技術情報