Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

Raspberry Piでリアルタイムクロック(RTC)を使って時間を合わせる

i2c real time clock

この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです

ブログ管理者のP.Hです!

今回は、I2C接続のRTC(リアルタイムクロック)の使い方を紹介したいと思います。Raspberry Piはインターネットに繋がる環境であれば、ntpで自動的に時刻を合わせてくれますが、インターネットが繋がらないと正しい時刻に設定されません。その場合、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

これで、起動時にハードウェアクロックから時刻を読み込む設定になります。以上です。