みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

Raspberry Piに時計を持たせる~1.9ドルのRTC DS3231を使う

時刻 とき の記憶を つかさ どりし 物体 もの ──── RTC

Raspberry Piはインターネット経由で現在時刻を取得します。

ところで、インターネットに接続せずスタンドアロンで使った場合どうなるのでしょうか? なんとRaspberry Piは時刻がわからず、現在時刻がむちゃくちゃにずれてしまいます。

スタンドアロンで使うとき、これは困りますよね😥

そこで、Raspberry Piとは独立して時間を持ってくれるRTC(リアルタイムクロック)を買ってみました。 例によって、中国のお店が外国に販売するショッピングモールAliexpressで買いました。

www.aliexpress.com

こちらのモジュールはDS3231というRTCを搭載しているようです。

DS3231とはアメリカMaxim社製のRTCだと思うのですが、このAliexpressのお店の説明文にはどこにもRTCのメーカー名は書いてありません。 実はノーブランドの互換品だったという可能性もありますが、趣味の世界なので目をつぶりましょう。 Maximの正規品が確実に欲しいという方は、Maximの正規代理店から買いましょう。

このお店の説明によれば、誤差は月差13秒以内ということで、なかなか優秀です。

私がAliexpressでの購入時の価格は$1.90でした。300円しないのでお買い得ですね!✨

Amazon.co.jpのマーケットプレイスでも買えるようです。

私の手元に届いたものはこのような感じです。

ピンソケットははんだ付け済で届きました。はんだごてを用意しなくていいので便利ですね。

裏側はこのようにボタン電池がついています。電池付きでこの価格なので、ますますお買い得な気がしますね。

RTCとは?

パソコンなどは内部に時計を持っていて、電源を切っても電池やバッテリーで時計だけ動き続けます。 なので、インターネットにつながず工場の中などスタンドアロンで使うパソコンも、現在時刻が大きくずれずに使えます。

この時計機能を司る部品をRTC(リアルタイムクロック)といいます。

RTCは現在時刻、つまり今が何年何月何日何時何分何秒か覚えていて、電池を入れると時を刻んでくれます。また、外部のマイコンに現在時刻を教えたり、マイコンから現在時刻を設定したりできます。

世の中には水晶発振器(クリスタル)やMEMS発振器など、電圧を加えると一定周期で振動するものが開発されています。 RTCにはこういう物体が入っており、電圧をかけると正確に時を刻んでくれます。

Raspberry PiにはRTCは搭載されていません。外付けでRTC電池を用意すれば、Raspberry Piの電源を切ってもRTCが動き続け、 インターネットにつながなくても現在時刻がわかります。

接続方法

今回のRTCはI2Cで通信します。Raspberry Pi用のRTCで、Raspberry Piのピン配置に合わせて作ってあります。

画像出典: raspberrypi.org

こちらのRaspberry Piのピン配置のI2Cの部分に合わせてあります。

RasPiピン番号 RasPi 機能 DS3231モジュール 説明
1 3V3 power VIN 電源(3.3V)
3 GPIO2 (SDA) SDA I2Cデータ
5 GPIO3 (SCL) SCL I2Cクロック
7 GPIO4 (GPCLK0) NC 未使用
9 Ground GND グランド (0V基準電圧)

このように、Raspberry Piの1番ピンに合わせて挿せばそのまま使えます。便利ですね。

接続すると、上の写真のようになりました。

セットアップ方法

LinuxシステムにRTCを認識させるには、Device Treeのオーバーレイを設定します。

WindowsマシンなどにRaspberry Piの起動マイクロSDカードを接続し、config.txtを開いてファイルの最後などに次の行を追加します。

dtoverlay=i2c-rtc,ds3231

[all]のセクションに追加するように注意してください。次のようになります。

Raspberry Piを起動してvimやnanoなどのエディタで/boot/config.txtを編集してもOKです。

次回起動時に自動的にRTCから時刻が読み込まれます。

試しにインターネットに接続せず(WiFiもLANケーブルもつながず)シリアルコンソールなどからRaspberry Piにログインしてみてください。

$ date
Sun 11 Sep 17:40:31 JST 2022

このように時刻があっています。 RTCから時刻が読み出せていることがわかります。

ただし、初回起動時はそもそもRTCの時間がずれている場合がありますので、時刻合わせが必要です。

私の場合は以前に時刻合わせをしたRTCなので正確な時間が読み出せていました。

時刻合わせ方法

NTP使用

Raspberry Piがインターネットにつながっている場合は自動でNTPで現在時刻をインターネットから取得します。

dateコマンドでシステムの現在時刻(≠RTCの現在時刻)を確認し、実際の時間と違っていなければ、 システムの現在時刻をRTCに書き込みましょう。次のコマンドで書けます。

$ sudo hwclock -w

これでRTCの現在時刻がシステム時間に同期します。

この後はインターネット接続を切って再起動してもRTCが時計を刻み続けてくれます。

手動設定

どうしてもインターネットにつながずスタンドアロンで時刻合わせをしたい場合は、次のようにします。

まず、NTPが有効になっていると手動での時刻合わせができないので、NTPをオフにします。

$ sudo timedatectl set-ntp no

続いて、次のコマンドでLinuxのシステム時刻を指定時刻に合わせます。

$ sudo timedatectl set-time "2022-09-11 19:32:00"

例えばこの場合、このコマンドを実行した時間が2022年9月11日19時32分00秒になります。 スマホの時計や、電波時計、時報などにあわせてタイミングよくEnterキーを押すとよいでしょう。

最期にシステムの現在時刻をRTCに書き込みます。

$ sudo hwclock -w

これでRTCとシステム時刻が同期するので、次回再起動時にRTCから現在時刻を読み込んで正しい時間に設定してくれます。

こうすればRaspberry Piのスタンドアロン運用でも安心して使えますね😊