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

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

Raspberry Pi OS Version 2021-05-07対応

更新日 : 2021年9月5日

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には電源管理に便利な様々な機能が搭載されています。そちらの記事も参考にしてみて下さい。

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

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

RPZ-IR-Sensor (Raspberry Pi用 温度/湿度/気圧/明るさ/赤外線 ホームIoT拡張ボード)

動作をプログラミング可能な、Raspberry Pi/Zero(ラズパイ)用ホームIoT拡張ボードです。温度、湿度、気圧、明るさセンサー、赤外線送受信機能を搭載。温度が上がったらエアコンをオンにする、暗くなったら照明を点灯する、外出先から家電の操作をする、気温や日照時間を記録する、といった使い方が可能です。LEDにステータスを表示したり、スイッチを押したら特定の処理をすることもできます。

PythonでRaspberry PiのGPIO、LED、スイッチ制御

Raspberry Pi(ラズパイ)では、GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することができます。本記事では、基本的なLEDとスイッチについて、Pythonプログラムで制御する方法を解説します。LEDにステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。