この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP.Hです!
今回は、I2C接続のRTC(リアルタイムクロック)の使い方を紹介したいと思います。Raspberry Piはインターネットに繋がる環境であれば、ntpで自動的に時刻を合わせてくれますが、インターネットが繋がらないと正しい時刻に設定されません。その場合、RTCを使うと多少誤差はでますが、正しい時刻に設定してくれます。
- 使用するハードウェア
- I2Cを有効にする
- ハードウェアを登録する
- Timesyncd(NTP)を停止する
- fake-hwclockを削除する
- ハードウェアクロック(RTC)に正しい時刻を設定する
- ハードウェアクロック(RTC)から起動時に時刻設定をする
それでは、リアルタイムクロックの使い方を説明していきます。
使用するハードウェア
今回は下記のDS1307を使用します。DS3231でも動作すると思われます(試していません)。どちらもI2Cを使用して、接続します。GPIOピンの5pinがまとめてささるコネクタになっていて便利です。
I2Cを有効にする
I2Cが有効になってない場合は、sudo raspi-config
コマンドを実行して、I2C機能を有効にします。 5 Interfacing Options ⇒ P5 I2C と進み, YESを選択します。その後、リブートします。
ハードウェアを登録する
時刻がどのような設定になっているかは、下記のコマンドで確認できます。
$ timedatectl status
時刻情報が表示され、RTC timeの項目がn/aになっているのがわかります。
sudo nano /boot/config.txt
でconfig.txtを開き、一番最後に下記を追記します。
※DS3231を使う場合は、ds1307⇒ds3231に変更します。
‥‥‥ ‥‥‥ dtoverlay=i2c-rtc,ds1307
再起動して、再度timedatectl status
コマンドで状態を確認します。
RTC time の項目に時間が表示されていると思います。これでハードウェアの登録は完了です。
Timesyncd(NTP)を停止する
インターネット環境で、自動的に時刻を合わせるモジュールです。これがアクティブ状態だと、うまく動作しませんので、停止します。
$ sudo systemctl stop systemd-timesyncd
$ sudo systemctl disable systemd-timesyncd
fake-hwclockを削除する
fake-hwclockは、シャットダウンする直前の時間を保存して、起動時に表示する機能です。これもRTCの動きに影響が出ますので、削除します。
$ sudo apt-get remove fake-hwclock
$ sudo dpkg --purge fake-hwclock
ハードウェアクロック(RTC)に正しい時刻を設定する
まず、システムクロックに正しい時刻を設定します。その後、システムクロックの値をハードウェアクロック(RTC)に書き込みます。下記コマンドで、システムクロックに正しい時刻を設定します。
※上記のNTPを停止した状態で行ってください。
$ sudo date -s "2019/1/1 11:22:33"
続いて、下記コマンドで、システムクロックの値をハードウェアクロック(RTC)に書き込みます。
$ sudo hwclock -w
ハードウェアクロック(RTC)から起動時に時刻設定をする
インターネットに繋がっていない状態やNTP停止状態でRaspberry Piの電源をOFF ⇒ ONにすると、正しい時刻ではなくなってしまいます。そのため、起動時に毎回、ハードウエアクロック(RTC)から時刻を読み、システムクロックに設定する必要があります。下記の2つの設定が必要になります。
sudo nano /etc/default/hwclock
でhwclockファイルを開き、#HCTOSYS_DEVICE=rtc0
のコメントを外します。
# Set this to the hardware clock device you want to use, it should # probably match the CONFIG_RTC_HCTOSYS_DEVICE kernel config option. HCTOSYS_DEVICE=rtc0
sudo nano /lib/udev/hwclock-set
でhwclock-setファイルを開き、一番はじめのif文をコメントアウトします。
#!/bin/sh # Reset the System Clock to UTC if the hardware clock from which it # was copied by the kernel was in localtime. dev=$1 #if [ -e /run/systemd/system ] ; then # exit 0 #fi if [ -e /run/udev/hwclock-set ]; then exit 0 fi if [ -f /etc/default/rcS ] ; then . /etc/default/rcS fi
これで、起動時にハードウェアクロックから時刻を読み込む設定になります。以上です。