リアルタイムクロック(RTC)をUECS Piに接続する

Raspberry Piは、 インターネット上のNTPサーバから時刻をもらって自動的に時刻合わせをしてくれます。インターネットに接続している限り時刻のずれは心配ないわけです。しかし、ネットに接続していなくてRaspberry Piの電源が落ちた場合には時刻のずれが起こります。ただ単にセンサーのデータを見るだけであれば問題ないかもしれません。しかし時刻をもとに制御を行うことを想定した場合、深刻な問題になるかもしれません。

Raspberry PiにはRTCが標準装備されていません。UECS Piの制御ノードに使用するUniPiにはRTCが装備されていますが、UniP自体2万円ぐらいするものですから安価にできるなら安価にRTCを使いたいものです。

幸いRaspberry Pi用のRTCモジュールはネットで安価に販売されています。今回はこれを使ってみました。

(左)DS3231モジュール。Amazonで購入4個で2500円ぐらい。某中華ネット1個300円ぐらいで安価。電池は付属だが交換できそうにない。(中央)DS3231モジュール。2×6のピンソケットだが、ピンを全部使用しているわけではない。(右)DS1307モジュール。

DS1307の場合

写真の3種類のモジュールを試してみました。品切れの可能性もあり、なるべく複数のものに対応しておくのが安全かと思います。まずは一番右のDS1307です。

Raspberry Piとの接続

2×5のソケットがついてます。左上の四角で囲ったピンがRaspberry Piの1番ピン3.3Vに接続するようになっていて、そのまま挿せば動きます。通信はI2CでSDAとSCLのピンを使用します。電源は5V、あとGNDのピンを使用します。
DS1307のデータシートを見ると5V、GND、SDA、SCLだけ接続すればいいはずなのですが、3.3Vの電源も接続しないと動きません。モジュールの回路図がないのではっきりしませんが、通信系の回路で3.3Vを使用しているのかもしれません。もともと5Vのマイコンで使用することを想定して作ったチップのようですが、Raspberry Piは3.3Vなので合わせる必要があるのかもしれません。

config.txtの設定

 設定参照 https://www.indoorcorgielec.com/resources/raspberry-pi/rpz-powermgr-rtc/
 データシート https://www.alldatasheet.jp/datasheet-pdf/pdf/226599/MAXIM/DS1307.html

接続プログラムを起動するために/boot/config.txtに下記の指定をします。
 dtoverlay=i2c-rtc,ds1307
しかし、この指定はUECS PiのファームウエアのSDカードではすでに指定されています。UECS Piの画面からDS1307の時刻合わせ機能をサポートしているので組み込まれているのでしょう。

時刻の自動設定

RTCに時刻を設定する機能は、UECS Piのノード設定画面にあります。しかし、これは手動で時刻を入力する必要があります。多くの場合インターネットに接続されているでしょうからNTPサーバーからもらった時刻を自動設定するのが便利です。

hwclockはハードウエアクロックにアクセスするためのツールですが、その機能を使ってRTCに自動設定する方法です。/etc/udev/rules.dディレクトリに「85-hwclock.rules」という名前のファイルを作成し、以下の内容を書き込みます。

 KERNEL=="rtc0", RUN+="/sbin/hwclock --rtc=$root/$name -s"

 (意味は分かってないのですが、おまじないだと思って設定してみます)

これでNTPの時刻をRTCに自動設定できるはずです。

確認

RTCを接続して起動したら、timedatectlコマンドで確認します。


RTC timeがUniversal timeと同じで、Local timeが現在時刻とあっていればOKです。

RTCの効果を確認するには、ネットワークを外した状態でRaspberry Piの電源を落とし、しばらく電源をオフにしたままにしたあと立ち上げて現在時刻と一致していることで確認できます。

DS3231の場合

冒頭写真の左と中央がDS3231です。DS1307との違いや設定方法は下記を参照ください。

 外付けRTC比較 http://meerstern.seesaa.net/article/482969548.html
 設定方法参照 https://k-kuro.hatenadiary.jp/entry/20200826/1598423659
 データシート https://www.alldatasheet.jp/datasheet-pdf/pdf/254832/MAXIM/DS3231.html

比較のサイトにはDS3231はDS1307の改良版であり互換性があるが、コストが高いと書いてますが、ネット販売でのモジュールの価格は大差ないようです。Raspberry Piで使用することを想定した場合、DS3231は電源電圧が3.3Vでも稼働するので使い勝手がよさそうです。

Raspberry Piとの接続

写真左の(黄色の)DS3231は、1×5のソケット、中央のが2×6のソケットです。どちらも左上の四角で囲ったピンがRaspberry Piの1番ピン3.3Vに接続するようになっています。使用するピンは3.3V、GDN、SDA、SCLなので、1列で済むはずですが、中央のモジュールはソケットの安定のためか2列になっています。実際は5V側の1列は使っていないようです。

黄色のDS3231のほうが小型で電池付きで値段が安いのですが、電池が貼り付けてあってどうも交換ができそうにありません。電池が切れたらモジュールごと交換になりそうです。(出荷前に電池が取り付けてあってRTCが動いていたとすると、在庫期間が長いものはすでに電池切れにならないかと不安になったりする)

Raspberry Piの設定

/boot/config.txtには下記の設定をします。
 dtparam=i2c_arm=on     #UECS Piではすでに定義されている
 dtoverlay=i2c-rtc,ds3231 

しかし、前述のようにDS1307とDS3231は互換性があるようでdtoverlay=i2c-rtc,ds1307の設定のままで稼働しました。

時刻の自動設定の定義(85-hwclock.rules)もDS1307と同じで構いません。つまりモジュールを差し替えればそのまま動くということです。

Raspberry Pi ZeroにDS3231を接続してみた

おわりに

制御を行うノード(Raspberry Pi)は、時刻を使って制御をすることもあるでしょうから時刻の狂いはクリティカルな誤動作につながる可能性がありRTCを導入したほうがよさそうです。UECSの通信規約には、ほかのノードから時刻をもらってきて設定する機能もあり、UECS Piもサポートしているようです。(テストはまだしてませんが) なのでデータを収集するだけのノードはインターネットに接続されていない場合でもRTCを導入したノードから時刻をもらってくる設定も可能ではないかと思います。システム全体で時刻設定のストラテジーを考えるのがよさそうです。

*「UECS Pi」「Arsprout Pi」はアルスプラウト株式会社が提供する汎用DIY環境制御ソフトウェアです。https://www.arsprout.co.jp/products/others/uecs-pi/

*「UECS」は農業用のセンサー機器や制御機器用の通信・動作の共通仕様です。UECS研究会が公開しています。https://www.uecs.jp/outline/outline-index

関連リンク:EzITコンサルティング www.ezitc.dev

コメント

このブログの人気の投稿

Arsprout Piを使ってみた③ ーファームウエアのカストマイズ UECS Piとの相違点ー

Arsprout Piを使ってみた② ー構成定義を中心にUECS Piとの違いを考えるー

Arsprout Piを使ってみた① ーUECS Piからの変更点を中心にー