Raspberry PiでRTCを使って時刻管理 (RPZ-PowerMGR)

RTC(時計)を使って、Raspberry Pi(ラズパイ)の時刻を管理する方法の解説です。RTCを使うと、インターネットに繋がっていなくても正確な時刻で運用できます。電源OFFから起動した際に自動的に時刻を設定する方法も説明します。

更新日 : 2024年9月29日

Raspberry Pi時刻の問題

Raspberry Piを使っていて、「インターネットに繋がっていないと時刻がずれる」問題に遭遇したことはないでしょうか?

Raspberry PiにはRTCと呼ばれる時計機能が無いため、電源OFFの間は時刻が止まってしまいます。電源ONすると、OFFした時刻から再開されますが、実際の時刻とずれてしまいます。

インターネットに繋がっていれば、NTPサーバーから取得した時刻に自動的に合わせてくれるので大丈夫なのですが、インターネットに繋がっていない場合は問題になります。

RTCを使うと電源OFFの間も時刻を保持してくれるので、インターネットに繋がっていなくても正確な時刻で運用することができます。

本記事ではRTCを搭載しているRPZ-PowerMGR拡張基板を使いますが、I2C接続の外付けRTCであれば同様の方法が使えます。(DS1307、DS3231Mなど)

なお、Raspberry Pi 5ではRTCが搭載されたため、電源ケーブルを挿した状態でシャットダウンしても再開時に時刻がずれなくなりました。電源ケーブルを抜いた場合に時刻を保持する場合は別途バックアップバッテリーが必要です。

RTC以外にも、RPZ-PowerMGRには指定時刻に電源ON/OFFするスケジュール機能や、モバイルバッテリーから起動したり、待機電力を最小限にするなど便利な機能があります。こうした機能を使いたい場合はRaspberry Pi 5でもRPZ-PowerMGRの利用を検討しても良いと思います。

時刻を保持する仕組み

どのように時刻を保持するのか、仕組みを解説します。

RPZ-PowerMGRはRaspberry Piの40ピンコネクターに装着する拡張基板(HAT)です。

下の図にあるように、RPZ-PowerMGR上に搭載されているRTCにより時刻が保持されます。通常は外部電源から供給される電力でRTCが動作しますが、電源と切断さてもバックアップコンデンサーの電力で動作し続けます。

セットアップ

基板とはI2Cで通信しますので、以下の記事を参考にI2Cを有効化して下さい。Raspberry Piの設定を開いてI2Cを有効にチェックし、再起動すればOKです。

Raspberry PiでI2C/SPIの有効化方法と仕組み

I2C/SPIの仕組み、Raspberry Pi(ラズパイ)で有効化する方法を解説しています。I2C/SPI対応のセンサーやディスプレイ、ADコンバーターなどを利用することで、Raspberry Piの可能性がさらに広がります。Raspberry Pi OSインストール後は無効になっているので、こちらを参考に有効化して下さい。

RPZ-PowerMGRのセットアップの全手順は製品ページを参照してください。本記事ではRTCの設定および時刻管理について解説します。




RTCを有効化

Raspberry Pi OSには、外付けしたI2C接続のRTCを管理する機能が備わっています。RTCを有効にするには、config.txtファイルを編集します。パスはOSバージョンによって異なりますので、以下を参照してください。

OSバージョンパス
Bookworm(最新版)/boot/firmware/config.txt
Bullseye (Legacy版)、Bookworm(最新版)の一部/boot/config.txt

config.txt ファイルをスーパーユーザーで開いて以下の1行を追加します。

dtoverlay=i2c-rtc,ds1307

RPZ-PowerMGRはDS1307互換デバイスとして動作するので「ds1307」を指定しました。使用するRTCに合ったデバイスを指定しましょう。

指定可能なデバイスは以下のコマンドで確認できます。

dtoverlay -h i2c-rtc

Raspberry Pi 5の場合のみ、内蔵のRTCを無効化する設定をconifg.txtに追記します。

dtparam=rtc=off

設定ファイルの編集方法が分からない場合は、以下の記事を参考にして下さい。

config.txtを変更したらRaspberry Piを再起動します。再起動後、ターマンるを開き、以下$に続くコマンドを実行して、I2Cアドレス0x68が「UU」と表示されていればうまく設定できています。これはRTCがシステムで管理されていることを示しています。(他のRTCでは0x68以外のアドレスになる場合もあります。)

$ i2cdetect -y 1

時刻を手動設定

インターネットに接続されていない場合は、手動で時刻を設定する必要があります。以下のように3つのコマンドを実行します。(インターネットに接続されている場合は自動で実行されるのでこの手順は行わなくて構いません)

1つめのコマンドは、NTPを無効にしないと時刻を設定できないので無効化しています。3つめのコマンドはNTPを再度有効化するために入れていますが、インターネットに接続することが無いのであれば実行しなくても構いません。

2つめのコマンドで時刻を手動設定しています。ここでは例として、2020年12月20日、15時30分に設定していますが、自分の指定したい時刻を入力してください。

$ sudo timedatectl set-ntp false
$ sudo timedatectl set-time "2020-12-20 15:30:00"
$ sudo timedatectl set-ntp true

時刻管理

RTCを含め、Raspberry Piの時刻管理はtimedatectlコマンドで行います。ます、以下のようにオプションを指定せずに実行すると、現在の状態が表示されます。

$ timedatectl
               Local time: 日 2020-12-20 15:30:03 JST
           Universal time: 日 2020-12-20 06:30:03 UTC
                 RTC time: 日 2020-12-20 06:30:03
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: no
              NTP service: active
          RTC in local TZ: no

Local timeが現在時刻です。

Universal timeは世界協定時で、日本時間より9時間遅れた時間となります。

RTC timeはRTCの時刻です。Raspberry Piでは通常、RTCに世界協定時を設定して利用します。Universal timeとRTC timeが同じ(タイミングによって1秒ずれる場合があります)であればOKです。

System clock synchronizedは、NTPサーバーから時刻を取得してシステムに反映されるとyesになります。

インターネットに繋がっている場合、特になにもしなくても、Raspberry Pi OSが時刻を取得してLocal time、Universal time、RTC timeが現在時刻に設定されます。

インターネットに繋がっていない場合は、手動設定で説明したようにset-timeコマンドでLocal time、Universal time、RTC timeが指定の時刻に設定されます。

hwclockコマンド

rulesファイル内で使用しているhwclockコマンドについて簡単に紹介します。-rオプションでRTCの時刻を読み出して表示します。-wオプションでシステム時刻(Universal time)をRTCに書き込みます。-sオプションでRTC時刻を読み出してシステム時刻をRTCに合わせます。

$ sudo hwclock -r     (RTCの時刻を表示)
$ sudo hwclock -w     (システム時刻をRTCに書き込む)
$ sudo hwclock -s     (RTC時刻を読み出してシステム時刻に設定する)



起動時にRTC時刻が反映されない場合

最新のRaspberry Pi OSではこの設定は不要です。古いバージョンなどで、電源OFFした後Raspberry Piを起動した際に、RTCの時刻(RTC time)がシステム時刻(Locat time、Universal time)に反映されない場合はこちらの設定をお試しください。

自動的に反映させるようにするには、/etc/udev/rules.dディレクトリに「85-hwclock.rules」という名前のファイルを作成し、以下の内容を書き込みます。

KERNEL=="rtc0", RUN+="/sbin/hwclock --rtc=$root/$name -s"

なお、コントロールツールのGitHubページに作成済の「85-hwclock.rules」ファイルがあるので、それを/etc/udev/rules.dにコピーしても構いません。以下のコマンドで設定が完了します。

$ sudo wget -P /etc/udev/rules.d https://raw.githubusercontent.com/IndoorCorgi/cgpmgr/master/85-hwclock.rules

これで、電源OFFしても起動時に正確な時刻がシステムに反映されるようになります。

まとめ

RTC(時計)を使って、Raspberry Pi(ラズパイ)の時刻を管理する方法の解説は以上です。RTCを使うと、インターネットに繋がっていなくても正確な時刻で運用できます。

これ以外にも、RPZ-PowerMGRには電源管理に便利な様々な機能が搭載されています。そちらの記事も参考にしてみて下さい。

定期撮影ラズパイカメラをモバイルバッテリーで長期運用 (RPZ-PowerMGR)

Raspberry Pi(ラズパイ)と純正カメラを使用して、定期的に撮影するタイムラプス機能を実装する方法を解説します。RPZ-PowerMGR拡張基板を使うことで、指定時刻に起動し、撮影後は自動的にシャットダウン&電源OFFします。待機時の消費電力をカットすることで、モバイルバッテリーで長期運用が可能になります。

ラズパイで赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)

Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法について解説しています。サンプルプログラムを用意しているので、簡単に受信、登録、送信動作をさせることができるほか、データ解析も可能です。赤外線を使ってエアコン、照明、テレビなどの家電を制御することが可能になります。

RPZ-PIRS (Raspberry Pi用 人感/明るさセンサー/赤外線 拡張基板)

Raspberry Pi(ラズパイ)に人感、明るさセンサー、赤外線送受信機能を搭載できる拡張基板です。人感センサーで人や動物を検知してカメラで撮影したり、赤外線で照明をONするような使い方が可能です。周囲の明るさをモニターできる他、外付温湿度/気圧センサー(別売り)を接続することで、温度、湿度、気圧の測定機能を追加できます。7色表示可能なRGB LEDにステータスを表示したり、スイッチを押すことで特定の動作をさせることができます。