【Raspberry Pi 3 Model B】RTCモジュール(DS1307)を接続する

シングルボードコンピュータ(SBC)

目的

Raspberry PiにRTCモジュールを接続してハードウェアクロック[1]Linuxには「システムクロック」と「ハードウェアクロック」と呼ばれるふたつの時計があります。として適用します。

基本的にRaspberry Pi OS(Linuxベース)機能の範囲で認識・動作させることができます。本記事の範囲ではプログラミングも必要ありません。

情報

Raspberry Pi

Raspberry Piについては以下の記事を参照ください。

【Raspberry Pi 3 Model B】環境構築 その1 (OSインストールまで)
目的 シングルボードコンピュータ(SBC)学習にあたって、Raspberry Piの開発環境構築を行います。 ※といってもOSインストールまでなら、現状ではかなり洗練化が進んでおり難しいことはほとんどありません。 Raspberry Piで...
【Raspberry Pi 3 Model B】環境構築 その2 (初期設定、解像度設定、SSH有効化、他)
以下記事の続きです。 前回記事ではRaspberry Pi OSが起動するところまで紹介しました。引き続き、表示されるポップアップ内容に従い初期設定を行います。あわせて画面解像度の設定とSSH有効化などについても説明します。 初回起動時の設...

RTCモジュール

使用するI2C接続のRTCモジュールは以下の記事で使用しているものと同じものです。

【C-First】RTCモジュール(DS1307)で時刻を計時する
目的 C-FirstとRTCモジュール(DS1307)をI2C接続し、時刻を計時します。また、時刻情報をOLEDディスプレイに表示し毎秒更新します。 ※当該RTCモジュールにはEEPROMも実装されています。EEPROMの制御は別の機会に。...
【Raspberry Pi Pico】RTCモジュール(DS1307)で時刻を計時する
目的 Raspberry Pi PicoとRTCモジュール(DS1307)をI2C接続し、時刻を計時します。また、時刻情報をOLEDディスプレイに表示し毎秒更新します。 実は以下の記事でC-Firstボードで同様の対応をしていますが、都合に...

ここでも改めて紹介しておきます。

ご迷惑をおかけしています!

ピンヘッダは実装されていませんので、別途実装しました。左右に端子がありますが、私はとりあえずP2側にのみピンヘッダを付けました。

https://www.amazon.co.jp/gp/product/B008QUVM4E/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=icankot-22&creative=1211&linkCode=as2&creativeASIN=B008QUVM4E&linkId=7153165506a69c17ba16bab3cc672a70

また、バックアップ用の電池も購入しました。指定のLIR2032です。この電池は二次電池で本モジュールに5V給電中は充電されます。

Amazon.co.jp

尚、同型・同電圧であってもCR2032等の一次電池は絶対に使用しないでください。最悪は発火など大きな事故となる可能性もあります。

ロジックレベル変換基板

Raspberry PiのGPIOは3.3Vですが、DS1307は5Vですのでレベル変換が必要になります。Picoの記事同様、以下のモジュールを使用しました。

Amazon.co.jp: HiLetgo 10個セット IIC I2C ロジック レベル 変換 双方向モジュール 5V Arduinoに対応 : 産業・研究開発用品
Amazon.co.jp: HiLetgo 10個セット IIC I2C ロジック レベル 変換 双方向モジュール 5V Arduinoに対応 : 産業・研究開発用品

Raspberry Pi 3 Model Bとの接続

Raspberry PiとRTCモジュールの接続は以下の通りです。

※ピン配置図は公式サイトより引用

ブレッドボードとジャンパーワイヤーを使用して接続した実際の様子は以下の通りです。今回の記事には関係がないOLEDディスプレイモジュールやGPSのUSBドングルも接続されています。

今回使用したジャンパーワイヤー、ブレッドボードは以下のものになります。

Amazon | 【おだ商店】 ブレッドボード 『830P基板 3個 400P基板 2個の合計5個セット』 | ブレッドボード | 産業・研究開発用品 通販
【おだ商店】 ブレッドボード 『830P基板 3個 400P基板 2個の合計5個セット』がブレッドボードストアでいつでもお買い得。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通常配送無料(一部除く)。

※上記のものはコスパ重視のものです。品質重視の場合は以下をお勧めします。

https://www.amazon.co.jp/gp/product/B00DSKCS68/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=icankot-22&creative=1211&linkCode=as2&creativeASIN=B00DSKCS68&linkId=30278f5234f53dadcedda411ec9e2c8f
https://www.amazon.co.jp/gp/product/B083LT3759/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=icankot-22&creative=1211&linkCode=as2&creativeASIN=B083LT3759&linkId=2be05508b56a70afa72a4078702db692
https://www.amazon.co.jp/gp/product/B094ML2RLP/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=icankot-22&creative=1211&linkCode=as2&creativeASIN=B094ML2RLP&linkId=766a1958f9bc467f3d4c7c58b40de4ca

※ジャンパーワイヤーはひとつ目のものだけあれば問題ありません。ふたつ目のものはオス・オスのケーブルが足りなくなったこと及び短めのものも欲しいなと思い別途購入したものです。

設定

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には「システムクロック」と「ハードウェアクロック」と呼ばれるふたつの時計があります。

コメント

タイトルとURLをコピーしました