RTC(時計)を使って、Raspberry Pi(ラズパイ)の時刻を管理する方法の解説です。RTCを使うと、インターネットに繋がっていなくても正確な時刻で運用できます。電源OFFから起動した際に自動的に時刻を設定する方法も説明します。
Raspberry Pi OS Version 2021-01-11対応
更新日 : 2021年1月17日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"
なお、コントロールツールに作成済の「85-hwclock.rules」ファイルが含まれているので、それを/etc/udev/rules.dにコピーしても構いません。
sudo cp 85-hwclock.rules /etc/udev/rules.d
これで、電源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の電源をON/OFF
- 指定時刻にRaspberry Piの電源をON/OFF
- Raspberry Piの消費電力測定&モバイルバッテリー稼働時間の計算
- Raspberry Pi技術情報一覧

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にステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。