RaspberryPi + RTC 導入方法まとめ
RaspberryPi3Bの時間が起動時毎回おかしいのでRTC(リアルタイムクロック) を導入しました。
スタンドアロン状態でセンサから値をMysqlに取り込む装置を作っていたところ、時刻が大変なことになっていました。
なのでとりあえずRTCを導入してみました。
使用機器
- RaspberryPi3B
- RTC DS1307(ピン付きの完成品)
コイン電池(CR1220)が必要。
i2cで通信するのでRaspberryPiからの制御が容易。
はじめに注意すること
- NTP,fake-hwclockと共存させようとすると上手く動かない(解決済み)
- rc.localがデフォルトではうまく動作しない(解決済み)
導入方法
電池をDS1307に入れてRaspberryPiのIOに挿してある前提で進めます。
また必要であれば
$ sudo raspi-config
からi2cを有効化しておいて下さい。
【1】必要なツールをインストール
$ sudo apt-get install i2c-tools // 制御に使用
$ sudo apt-get install ntpdate // ntpクライアント時刻設定に使用
【2】/etc/modulesに「i2c-dev」と「rtc-ds1307」を追加
$ sudo echo i2c-dev >> /etc/modules
$ sudo echo rtc-ds1307 >> /etc/modules
【3】接続されたアドレスを確認(私の環境では0x68でした。)
$ sudo i2cdetect -y 1
【4】次は管理者から実行
# modprobe rtc-ds1307
# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
# i2cdetect -y 1
この時点でアドレスが変わっていると、ちゃんとシステムの管理下に置かれていることになります。
【5】NTPとfake-hwclockの停止
$ sudo apt-get install chkconfig
$ sudo chkconfig ntp off
$ sudo apt-get remove fake-hwclock
$ sudo dpkg --purge fake-hwclock
【6】起動スクリプトの修正
/etc/rc.local に以下の内容を追加
ちなみに起動時のrc.localは管理者権限で実行されるのでsudoは必要ありません。
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
ntpdate -v ntp.nict.jp
if [ $? = 0 ]; then
hwclock -w # システムクロック => RTC
else
hwclock -s # システムクロック <= RTC
fi
【7】rc.localの有効化
そのままではrc.localが上手く動作しません。
$ sudo raspi-config
から
"Wait for Network at Boot"を選択し、
"Slow Wait for network connection before completing boot"を選択して下さい。
これで上手く動くはずです。
参考URL
http://my-web-site.iobb.net/~yuki/2016-11/raspberry-pi/rtc/
http://my-web-site.iobb.net/~yuki/2016-11/raspberry-pi/rtc-ok/
https://qiita.com/nuwaa/items/298ada62c4209ea7f9ca
http://www.pentacreation.com/blog/2016/12/161209.html