RedSleeve へのミニ RTC モジュールの導入

2015年11月30日 ミニRTCモジュール

Raspberry Pi は RTC を持っていないため、 NTP サーバにつながらないと時刻取得ができず、時刻が狂った状態で動作することになります。しかし、場合によってはインターネットに出られない環境で動かしたいこともあるはずです。そんなときのために、 RedSleeve が動いている Raspberry Pi に、ミニ RTC モジュールを導入する方法を解説します。ミニ RTC モジュールを導入した Raspberry Pi を NTP サーバとし、他の Raspberry Pi に時刻を提供すれば、全て Raspberry Pi な環境を作ることができます。

ここで用いるミニ RTC モジュールは以下の製品ですが、リンク先を参照していただけると分かるように、既に販売終了となっております…。

ミニRTCモジュール–販売終了 – スイッチサイエンス

実は、いつか投稿しようと半年ほど前に書いた文章を、再度検証しながら投稿しているため、こんなことになっています。他の製品でも流用可能な部分もあると思いますので、一応記録として残しておきます。

ミニ RTC モジュールの取り付け

以下の画像のように、ミニ RTC モジュールが内側を向くように、 GPIO の 1,3,5,7 番ピンに取り付けます。

2015年11月30日 ミニRTCモジュールを取り付けたRaspberry Pi

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 ではないので注意!


1 thought on “RedSleeve へのミニ RTC モジュールの導入

  1. ピンバック: [RaspberryPI]時計について – 技術情報

コメントを残す

メールアドレスが公開されることはありません。