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

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

Raspberry Pi OS Version 2022-04-04対応

更新日 : 2022年10月14日

Raspberry Pi時刻の問題

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

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

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

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

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

RTC以外にも、RPZ-PowerMGRには電源管理、省電力運用に必要な機能が搭載されていて便利です。

時刻を保持する仕組み

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

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

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




セットアップ

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

Raspberry PiでI2Cの設定と使い方

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

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

RTCを有効化

Raspberry Pi OSには、外付けしたI2C接続のRTCを管理する機能が備わっています。RTCを有効にするには、/boot/config.txt ファイルをスーパーユーザーで開いて以下の1行を追加します。

dtoverlay=i2c-rtc,ds1307

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

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

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

dtoverlay -h i2c-rtc

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が指定の時刻に設定されます。

起動時にRTC時刻を反映

このままだと、電源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しても起動時に正確な時刻がシステムに反映されるようになりました。

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

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

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

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

BME280センサーとRaspberry Piで気温、湿度、気圧を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、BME280センサーで気温、湿度、気圧を測定する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定や記録ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

CO2濃度に応じてLEDの色を変化させ、リレーで外部機器をON/OFFする

Raspberry PiとRPZ-CO2-Sensorを使ってCO2(二酸化炭素)濃度を測定し、LEDの色を変化させる応用例です。LEDを見ることで、換気の必要性がひと目でわかります。濃度が一定以上になったらリレーで換気ファンなどの外部機器をONすることも可能です。

Raspberry Piと赤外線でエアコンの自動ON、消し忘れ機能を実現

普段、エアコンを消し忘れてしまい夜間つけっぱなしにしてしまったり、冬場に朝エアコンを入れても暖かくなるのに時間がかかったことは無いでしょうか?本記事では、Raspberry Piと拡張基板を利用して、毎晩のエアコン消し忘れ機能、および朝に温度が低い場合に自動で暖房を入れる機能を実現します。