目的
Raspberry PiにRTCモジュールを接続してハードウェアクロック[1]Linuxには「システムクロック」と「ハードウェアクロック」と呼ばれるふたつの時計があります。として適用します。
基本的にRaspberry Pi OS(Linuxベース)機能の範囲で認識・動作させることができます。本記事の範囲ではプログラミングも必要ありません。
情報
Raspberry Pi
Raspberry Piについては以下の記事を参照ください。
RTCモジュール
使用するI2C接続のRTCモジュールは以下の記事で使用しているものと同じものです。
ここでも改めて紹介しておきます。
ピンヘッダは実装されていませんので、別途実装しました。左右に端子がありますが、私はとりあえずP2側にのみピンヘッダを付けました。
また、バックアップ用の電池も購入しました。指定のLIR2032です。この電池は二次電池で本モジュールに5V給電中は充電されます。
尚、同型・同電圧であってもCR2032等の一次電池は絶対に使用しないでください。最悪は発火など大きな事故となる可能性もあります。
ロジックレベル変換基板
Raspberry PiのGPIOは3.3Vですが、DS1307は5Vですのでレベル変換が必要になります。Picoの記事同様、以下のモジュールを使用しました。
Raspberry Pi 3 Model Bとの接続
Raspberry PiとRTCモジュールの接続は以下の通りです。
ブレッドボードとジャンパーワイヤーを使用して接続した実際の様子は以下の通りです。今回の記事には関係がないOLEDディスプレイモジュールやGPSのUSBドングルも接続されています。
今回使用したジャンパーワイヤー、ブレッドボードは以下のものになります。
※上記のものはコスパ重視のものです。品質重視の場合は以下をお勧めします。
※ジャンパーワイヤーはひとつ目のものだけあれば問題ありません。ふたつ目のものはオス・オスのケーブルが足りなくなったこと及び短めのものも欲しいなと思い別途購入したものです。
設定
I2C機能の有効化
デフォルトではI2C機能が無効になっているため有効化します。
$ sudo raspi-config
DS1307デバイスドライバのロードとI2Cデバイス設定
DS1307デバイスドライバのカーネルモジュールをロードします。
$ sudo modprobe rtc-ds1307
I2Cスレーブアドレスを指定し、設定を行います。
$ sudo sh -c "echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device"
動作確認
正しく認識されていれば、以下のようなカーネルメッセージが出力されます。
$ dmesg ※中略 [ 258.369913] rtc-ds1307 1-0068: registered as rtc0 [ 258.371615] rtc-ds1307 1-0068: setting system clock to 2022-01-09T15:31:13 UTC (1641742273) [ 258.373497] i2c i2c-1: new_device: Instantiated device ds1307 at 0x68
上記メッセージの通りシステムクロックからRTCに自動的に時刻同期が行われます。
$ sudo hwclock -r 2022-01-10 16:04:14.212219+09:00
OS起動時にRTC有効化する
OS起動時にRTC有効化が行われるように設定を行います。
/etc/modulesに「rtc-ds1307」を追加します。
$ sudo vi /etc/modules
以下は追加例です。
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
i2c-dev
rtc-ds1307
次にI2Cスレーブデバイスの設定を追加します。/etc/rc.localに追加するということも考えられますが、デフォルトではネットワークがつながらないとrc.localが実行されない模様です。raspi-configでネットワーク接続の条件を外すこともできるようですが、今回はsystemdを使用します。
まず、I2Cスレーブデバイスの設定を行うシェルスクリプトを作成します。
$ sudo vi /usr/local/sbin/rtc-setting
#!/bin/sh -e
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock --hctosys
exit 0
3行目の「hwclock –hctosys」はハードウェアクロックでシステムクロックを同期させるためのコマンドです。
パーミッションを設定します。
$ sudo chmod 755 /usr/local/sbin/rtc-setting
次に、Unitファイルを作成します。
$ sudo vi /etc/systemd/system/rtc.service
[Unit]
Description=RTC setting
After=systemd-modules-load.service
[Service]
ExecStart=/usr/local/sbin/rtc-setting
Restart=on-failure
[Install]
WantedBy=multi-user.target
パーミッションを設定します。
$ sudo chmod 644 /etc/systemd/system/rtc.service
試しに起動してみます。
$ sudo systemctl start rtc.service
ステータスを確認します。問題なければ以下例のように表示されます(最後の2行がポイント)。
$ systemctl status rtc.service ● rtc.service - RTC setting Loaded: loaded (/etc/systemd/system/rtc.service; disabled; vendor preset: enabled) Active: inactive (dead) 1月 10 16:03:17 raspberrypi systemd[1]: Started RTC setting. 1月 10 16:03:21 raspberrypi systemd[1]: rtc.service: Succeeded.
OS起動時に自動的にサービス起動するように有効化します。
$ sudo systemctl enable rtc.service Created symlink /etc/systemd/system/multi-user.target.wants/rtc.service → /etc/systemd/system/rtc.service.
OSを再起動して問題ないことを確認できれば完了です。
$ sudo reboot
注釈
↑1 | Linuxには「システムクロック」と「ハードウェアクロック」と呼ばれるふたつの時計があります。 |
---|
コメント