<Raspberry Pi-46>
Raspbery-24,27,45で紹介した日付・時刻の取得はRaspberry Piのシステムクロックで行っていました。
Raspbery Piには、ハードウェアクロックがないので、電源を落とすとシステムクロックが止まり
次に電源を入れると、電源を落としたときからの時刻となります。(下の画像参照)
ネット接続している場合はこの限りではありません。
Raspbianは、デフォルトで ntpd が動作していて時刻を同期するので正確な時刻を取得出来ます。
しかし、Raspbery Pi単体(ネット環境もない)で正確な時刻がほしいところです。
それには、RTCモジュール使えばいいようです、試してみましたので紹介します。
下の左画像は現在時刻08:55、09:01に電源をOFF。右画像は現在時刻の09:06に電源を入れたのに09:01です。
そのRTCモジュールですが、アマゾンでHiLetgo DS3231 AT24C32 時計モジュール 200円(送料無料)を購入しました。
中国からの発送なので時間が掛かりました、6/13注文して6/22にポスト投函されていました。
下の画像のように簡易包装で、取説もありません。
本体の画像
回路図
早速、接続します。搭載されているPOWER LEDが赤く点灯しています。
i2cdetect -y 1でアドレスを確認します。
このモジュールは、RTCのDS3231とEEPROMのAT24C32が搭載しているのでアドレスが2つ表示
68:DS3231 57:AT24C32
<RTCモジュールの時刻を読込むまで>
1.modprobeコマンドで rtc-ds3232機能を有効にする。
pi@raspberrypi:~ $ sudo modprobe rtc-ds3232
(参考)
modprobe rtc-ds3232 カーネルモジュールをロード(取り込み)
modprobe -r rtc-ds3232 アンロード(取り外し)したりする
2.ds3231の I2Cアドレス 0x68を new_deviceに設定して Raspbian OSに認識させる。
pi@raspberrypi:~ $ echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
(参考)
teeコマンドは処理結果を、画面に表示すると共にファイルへの出力も行うコマンドです
下の方法もあるようですが上のほうがいいようです。
pi@raspberrypi:~ $ echo ds3231 0x68 > sudo /sys/class/i2c-adapter/i2c-1/new_device
3.RTCモジュールの時刻を読み込む
pi@raspberrypi:~ $ sudo hwclock -r
4.ネット接続して正確な時刻を確認
pi@raspberrypi:~ $ date
5.その時刻を、RTCモジュールに書き込む
pi@raspberrypi:~ $ sudo hwclock -w
6.確認のためRTCモジュールの時刻を読み込み
pi@raspberrypi:~ $ sudo hwclock -r
以上ですが、ここで電源をOFFしてからONするとRTCモジュールの時刻はリセットされるので
RTCモジュールにバックアップ用電池を取り付ける。但しこのままCR2032を取付けると
充電されてしまうので、充電されないよう下の画像のようにチップ抵抗を取外す。
(VCC 3.3Vなら電位の関係で取り外さなくてもいいかも知れません)
ネットでぐぐると、下の「外していない」チップ抵抗を外すとあります。
この「外していない」チップ抵抗はRaspberry Pi側のSDA、SCLと並列に接続されますが
影響があれば外せばいいと思います。
半田コテをチップ抵抗に当て、はんだを盛ってコテを滑らせば取れる
取外した様子
CR2032をセット
<RTCモジュール時刻バックアップ確認>
ほんとに、Raspberry PiとRTCモジュールの電源をOFFしても時刻がバックアップされるか
見てみます。
1.rtc-ds3232機能を有効、アドレス 0x68を new_deviceに設定して Raspbian OSに認識させておく。
2.現在の時刻を確認(pi@raspberrypi:~ $ date)
3.確認したら、RTCモジュールに書き込む(pi@raspberrypi:~ $ sudo hwclock -w)
4.RTCモジュールの時刻を読込み確認(pi@raspberrypi:~ $ sudo hwclock -r)
5.LANケーブルを外しRaspberry Pi(RTCモジュールも)の電源をOFF(もちろんバックアップ電池は付けたまま 09:30)
6.一定時間経過したら(10:00)、Raspberry Pi(RTCモジュールも)の電源をONする。(LANケーブルは外したまま)
7.rtc-ds3232機能を有効、アドレス 0x68を new_deviceに設定して Raspbian OSに認識させる。
pi@raspberrypi:~ $ sudo modprobe rtc-ds3232
pi@raspberrypi:~ $ echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
8.pi@raspberrypi:~ $ date(5.の操作したときの時刻が表示している、実際は操作手間があるので遅れる)
9.pi@raspberrypi:~ $ sudo hwclock -r(バックアップ成功していたら、現在時刻が表示する)
10.pi@raspberrypi:~ $ sudo hwclock -s(Raspberry Piシステムクロックに書き込む)
11.pi@raspberrypi:~ $ dateで確認
以上、RTCモジュール時刻バックアップ出来ることが確認出来ました。
尚、デスクトップ上右端の現在時刻は少し待てば変わります。
Raspberry Piの電源を入れた時、この動作を実行するには、上記7.〜10.を/etc/rc.localに記述すれば出来ます。
/etc/rc.localファイル
-------------------------------------------------------------------------------
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
#----ここから
sudo modprobe rtc-ds3232
echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock -r
sudo hwclock -s
#----ここまで
exit 0
-------------------------------------------------------------------------------
それから、このRTCモジュールは温度データも取得出来るようです。
但し、下の2行を実行しない(時計機能を動作させない)
sudo modprobe rtc-ds3232
echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
Raspberry Piを再起動してi2cdetect -y 1でアドレスを確認します。
次にsudo i2cget -y 1 0x68 0x11(整数部)、sudo i2cget -y 1 0x68 0x12(少数部)
ここで0x1fは(0001 1111)なので16+8+4+2+1=31 0x40は(0100 0000)なので64/256=0.25
31+0.25=31.25℃
ちなみに、下の2行を実行すると68がUUとなります。
sudo modprobe rtc-ds3232
echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
sudo i2cget -y 1 0x68 0x11、sudo i2cget -y 1 0x68 0x12実行でエラーとなります
Raspberry メニューに戻る