![]()
23.RTCの追加 (2020.10.2)
普通のPCにあってRaspberry Piに無いものな~んだ?
それがRTC、Real Time Clockと呼ばれるハードウェアクロック(時計)です。Raspberry Piはインターネットに接続している環境なら、起動時に時間情報をネットから得てセットします。そのためスタンドアロンでブートした場合には、日時が毎回リセットされてしまいます。制御機器として使用するような場合には、必ずしもインターネットに接続できる環境にあるとは限らず、時刻情報を使って制御するような用途では使えません。RTCを追加してもさほどコストアップになるとは思えないので、個人的には未だに未搭載と言うのはどうかと思います。(結構重要な機能だと思うのですが・・・)
そこで、今後の展開も考えて、手持ちのRaspberry PiにRTCを追加することにしました。入手したのは下図のようなものです。適当に安価なものをとネットで探して選びました。DS1307と言う商品で、マルツオンラインで940円(税抜)でした。概ね1000円前後で購入できるのではないかと思います。基板にはクロックカウントのためのバッテリーとして、コイン電池CR1220が別途必要になります。本体はかなりコンパクトで、Raspberry PiのGPIOコネクタに直接挿すことができるようになっていて、導入しやすいように配慮されています。

RTCはI2C(今後はIICの記述を統一します)で通信するようになっていて、あらかじめRaspberry Piで使用できるように設定をしておきます。既にI2Cは導入しているため、RTCの設定のみを行います。DS1307のアドレスを確認すると、下図のように68Hと出ました。もうひとつ20Hのアドレスもありますが、これは前の22.で紹介したもので、新たに追加したIOエキスパンダのアドレスです。続いてRTCをシステムに登録します。再びI2Cのアドレスを確認すると表示がUUに変わりました。システムの管理下になったことを意味しています。

最後に現在の日時をRTC(hwclock)に書き込みます。読み出して時刻がセットできたことを確認してみます。上図の最後がその時の日時情報です。RTCが動作することを確認するために、一度電源オフ(通電しない状態)にします。しばらくしてから、ネットから切断した状態で電源オンします。起動すると前回終了した日時が表示されます。
このままでは起動しても現在日時にはなりませんので、起動時にRTCの情報をシステムクロックに設定するようにします。色々な方法があるようですが、簡単で確実そうな情報がありましたので、それに従って作業することにしました。各設定ファイルの変更にはテキストエディタのnanoを使います。変更後には「ctrl+o」キーでファイルを保存できます。
1.ハードウェアの登録
sudo nano /boot/config.txtでconfig.txtを開き、一番最後に下記を追記します。
dtoverlay=i2c-rtc,ds1307
再起動してターミナルを使い、timedatectl statusコマンドで状態を確認します。 RTC
time の項目に時間が表示されていれば登録は完了です。
2.NTPの停止
インターネット環境において、自動的に時刻を合わせるモジュールがNTPです。これがアクティブ状態だと正常に動作しないため停止します。
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd
3.fake-hwclockの削除
fake-hwclockは、シャットダウン直前の時間を保存して起動時に表示する機能です。これもRTCの動きに影響が出るため削除します。
sudo apt-get remove fake-hwclock
sudo dpkg --purge fake-hwclock
4.RTCに現在時刻を設定
あらかじめシステムクロックに正しい時刻を設定し、次にシステムクロックの値をハードウェアクロック(RTC)に書き込みます。
sudo date -s "2020/10/1 1:10:30"
sudo hwclock -w
※時刻は設定時の正しい日時を設定すること。
5.ハードウェアクロック(RTC)から起動時に時刻設定をする
インターネットに接続していない、またはNTP停止状態でRaspberry
Piの電源をONにして起動すると、正しい時刻が設定されなくなります。そこで、起動時に毎回ハードウエアクロック(RTC)から時刻を得て、システムクロックに設定する必要があります。そのために下記の2つの設定変更が必要になります。
sudo nano /etc/default/hwclockでhwclockファイルを開き、
#HCTOSYS_DEVICE=rtc0のコメントを外します(頭の#を削除)。
HCTOSYS_DEVICE=rtc0
sudo nano
/lib/udev/hwclock-setでhwclock-setファイルを開き、最初のif文をコメントアウトします(頭に#を付ける)。
#if [ -e /run/systemd/system ] ; then
# exit 0
#fi
これで起動時にRTCの日時がシステムクロックに設定されるはずです。しばらく通電しない状態でRaspberry Piを放置し、ネットに接続しない環境で電源オンして起動したところ、デスクトップに表示される時刻が正しく設定されていることが確認できました。これからはスタンドアロンでも安心して使用することができます。
<補足>
RTCを使わずNTPサーバーで時刻合わせする方法に戻すには次のようにします。
参照するサーバーを登録するためにtimesyncd.confを書き換えます。(編集ソフトにはnanoを使っています)
sudo nano /etc/systemd/timesyncd.conf
●timesyncd.confの内容に太字部分を加えます。
[Time]
#ntp=
NTP=ntp.jst.mfeed.ad.jp ntp.nict.jp
FallbackNTP=time.google.com
#FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
●NTPを有効化します。
sudo timedatectl set-ntp true
デーモンを再ロードして、サービスの再起動を行います。
sudo systemctl daemon-reload
sudo systemctl restart systemd-timesyncd.service
![]()