<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 メニューに戻る