Raspberry PiにRTC(DS1307)を接続 【解決編】

はじめに

2016年11月、Raspberry Pi2にRTCモジュールを接続しました。

「Raspberry PiにRTC(DS1307)を接続」に記載した手順では、正常に動作しませんでした。この問題が解決したので、その方法を記載します。

RaspberryPi2 ボード

RaspberryPi2 ボード

 

NTPサービスを停止してみる

NTPサービスが原因らしいので、「chkconfig」コマンドでNTPサービスを停止します。

pi@pi2note:~ $ sudo chkconfig --list |grep ntp
ntp 0:off 1:off 2:on 3:on 4:on 5:on 6:off

pi@pi2note:~ $ sudo chkconfig ntp off

pi@pi2note:~ $ sudo chkconfig --list |grep ntp
ntp 0:off 1:off 2:off 3:off 4:off 5:off 6:off

 


もう一度、テストしてみます。しばらく時間を空けて、ネットワーク切断状態で電源を入れます。NTPサービスが停止しているので、ブート時に正しく時刻が設定されるはずです。

pi@pi2note:~ $ date
2016年 11月 8日 火曜日 14:35:49 JST
pi@pi2note:~ $ sudo hwclock -r
2016年11月08日 14時36分07秒 -0.104642 seconds

ハードウェア・クロックに設定された日時が、システム・クロックに設定できました。
これで想定通りの動作をしましたが、ネットワーク接続状態ではNTPサーバーの日時を設定したいという思いがあります。


ここで、前回説明したLinux時計に関するコマンドの説明図をもう一度掲載します。

Linuxの時計

Linuxの時計

 

NTPクライアントの利用

NTPクライアントとして、「ntpdate」コマンドがありますのでインストールします。

sudo apt-get install ntpdate

/etc/rc.local は、RTCの登録のみとします。

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

 

「ntpdate」コマンドで時刻を取得した後、「date」コマンドと「hwclock -r」コマンドで、システム・クロックとハードウェア・クロックを確認します。

ネットワーク切断状態の場合

pi@pi2note:~ $ date
2016年 11月  8日 火曜日 15:14:49 JST
pi@pi2note:~ $ sudo hwclock -r
2016年11月08日 15時20分33秒  -0.459156 seconds

pi@pi2note:~ $ sudo ntpdate -v ntp.nict.jp
 8 Nov 15:15:42 ntpdate[899]: ntpdate 4.2.6p5@1.2349-o Mon Jul 25 22:35:35 UTC 2016 (1)
Error resolving ntp.nict.jp: Name or service not known (-2)
 8 Nov 15:15:42 ntpdate[899]: Can't find host ntp.nict.jp: Name or service not known (-2)
 8 Nov 15:15:42 ntpdate[899]: no servers can be used, exiting

pi@pi2note:~ $ date
2016年 11月  8日 火曜日 15:15:47 JST
pi@pi2note:~ $ sudo hwclock -r
2016年11月08日 15時21分13秒  -0.533089 seconds

NTPサーバーからの時刻取得に失敗しても、RTCのハードウェア・クロックは変更されません。

ネットワーク接続状態の場合

pi@pi2note:~ $ date
2016年 11月  8日 火曜日 15:16:16 JST
pi@pi2note:~ $ sudo hwclock -r
2016年11月08日 15時21分40秒  -0.201920 seconds

pi@pi2note:~ $ sudo ntpdate -v ntp.nict.jp
 8 Nov 15:16:26 ntpdate[1047]: ntpdate 4.2.6p5@1.2349-o Mon Jul 25 22:35:35 UTC 2016 (1)
 8 Nov 15:21:56 ntpdate[1047]: step time server 133.243.238.244 offset 321.085190 sec

pi@pi2note:~ $ date
2016年 11月  8日 火曜日 15:21:59 JST
pi@pi2note:~ $ sudo hwclock -r
2016年11月08日 15時22分10秒  -0.759603 seconds

NTPサーバーからの取得した時刻がシステム・クロックに設定され、RTCハードウェア・クロックには影響していません。

うまく動作しそうです!!

RPIにRTCボードの接続

RPIにRTCボードの接続

ブート時にNTPクライアントかRTCで時刻設定する

ブート時に、時刻を設定するようにします。

/etc/rc.local に直接記述せずに、別のシェルを呼び出すようにします。

sh /root/bootup/setsystime.sh
exit 0

/root/bootup ディレクトリに setsystime.sh を作成します。

pi@pi2note:~ $ sudo ls -l  /root/bootup
合計 4
-rwxr-xr-x 1 root root 221 11月  6 11:57 setsystime.sh
pi@pi2note:~ $ sudo cat /root/bootup/setsystime.sh
#!/bin/sh
#
# --- RTC device
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
#
ntpdate -v ntp.nict.jp
if  [ $? = 0 ]; then
  hwclock -w # system time --> rtc
else
  hwclock -s # system time <-- rtc
fi
#
date

ネットワーク切断状態の場合

NTPクライアントの時刻取得できませんので終了コードは「1」となり、「hwclock -s」でシステム・クロックにRTCハードウェア・クロックを設定します。

ネットワーク接続状態の場合

NTPクライアントから時刻取得しますので終了コードは「0」となり、「hwclock -w」で取得した時刻をRTCハードウェア・クロックに設定します。

@pi2note:~ $ date
2016年 11月  8日 火曜日 15:59:55 JST

pi@pi2note:~ $ sudo hwclock -r
2016年11月08日 16時00分00秒  -0.177556 seconds

 


これで、問題が解決してRTC接続が完了しました。