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

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

更新日 : 2024年2月28日

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-PIRS)

人感センサー(PIR/焦電赤外線センサー)は、人や動物の動きを検知できます。そこで、Raspberry Pi(ラズパイ)、カメラと組み合わせて、人や動物が通ったら写真や動画を撮影する方法を解説します。実際に動作するプログラムも用意しています。人感センサー搭載のRPZ-PIRS拡張基板を利用します。

加速、減速を細かく指定してステッピングモーターを回転させる (Raspberry Pi + RPZ-Stepper)

RPZ-Stepperでは、速度域を3つに分けて、それぞれについてモーターの加速、減速の速さを指定することが可能です。例えば、負荷が重いので動き出しをゆっくり加速したい場合が考えられます。また、ステッピングモーターは回転数が上がるほどトルクが下がる特徴があります。そのため、早い速度域では加速を遅くして脱調を回避できます。

RPZ-PowerMGR (Raspberry Pi/Jetson Nano用 電源管理/制御/RTC拡張基板)

スイッチで電源ON/OFF、指定時刻に電源ON/OFF、シャットダウン後自動電源OFFを可能にする拡張基板です。Raspberry Pi(ラズパイ)やJetson Nanoの電源の課題を解決し、省電力運用を可能にします。RTCで電源OFF時も時刻を保持します。USB Type-C端子を搭載し、モバイルバッテリーでも利用できます。