2021年9月11日土曜日

ラズパイでRTC-8564NBを使ってみた。

 スタンドアローンのRaspberry Pi 3B用にRX8900を使ってみてたんだけど、アップデート時にモジュールをビルドし直すのが面倒になったのでデバイスツリー対応のRTCに変更してみた。

秋月で売っているRTC-8564NBならRaspberry Pi OSではpcf8563として使えるのでOSアップデート時でも安心である。というか設定するだけで使えるのはやっぱり便利ね…
よく調べてから買うべきだった(結局VBATピンついててもダイオード必要だったし。

秋月のモジュールで500円。
そんでもってRTCとI2Cバス共用したくないので他にI2Cポート無いのかなと思ったらRaspberry Pi 4だとI2C増えてるのね…(ピンアウトはこちらがわかりやすかった。)
SPI使わないならあと3ポートも使えそう。i2c-0はPiHATのEEPROM用としてしか使わない法が良いみたいだし。

今回は3Bなのでi2c-gpioを使うことに。i2c-gpioはBit bangingによってI2Cをエミュレートできるモジュール。つまりソフトウェアI2Cが使えるっぽい。ソフトウェアなのでCPUには負荷がかかるけどRTCだけで使うなら起動時と時計合わせ時だけだしいいかな。
それよりも他のI2Cデバイスと共存させたくないのよね…
他のデバイスはi2c-1を使ってPCA9306で5Vにレベル変換してつなぎたいやつ。

i2c-gpioは自由にピン設定ができるので、Raspberry Pi 4に置き換えたときにハードウェアI2Cを使えるようにRaspberry Pi 4で言う、i2c-6(SDAがGPIO22でSCLがGPIO23)と同じピン配置にしてみた。
/boot/config.txtに sudo nano /boot/config.txtとかを使って、
dtoverlay=i2c-gpio,bus=6,i2c_gpio_sda=22,i2c_gpio_scl=23,i2c_gpio_delay_us=1
と一行追記して再起動するとi2c-6が追加されているはず。
こんな感じでi2cdetect -y 6でi2c-6ポートに繋がっているデバイスの一覧が見れる。このコマンドを実行してもすごく遅い場合はプルアップ抵抗がついてないかも。今回のi2cモジュールはデフォルトでプルアップ抵抗が無効になっていて、ハンダでジャンパするのが面倒だったのでプルアップ抵抗内蔵のi2cデバイスを試しに一緒に接続してみた。なのでデバイスが2個認識している。

とここまでソフトウェアI2CでRTCを認識させるまでは完了。ソフトウェアI2Cでデバイスツリーを使ってRTCどうやって設定するんだろうと思って探していたらi2c-rtc-gpioという便利なパラメータが存在していた。
i2c-rtc-gpioを使用すればi2c-gpioでRTCがそのまま使える。つまり一行で全部設定完了するという…
先程編集した/boot/config.txtのさっき追加した行をコメントアウトするか、削除して、
dtoverlay=i2c-rtc-gpio,pcf8563,i2c_gpio_sda=22,i2c_gpio_scl=23
とするだけ。これでRTCの設定まで完了しちゃう。RTCのSDAを22、SCLを23につないで再起動するだけ。
ls /devしてみたらi2c-11として認識するみたい。
ちゃんとi2cdetectでも認識している。UUという表示になっているのはOSでコントロールされているということなので、これでRaspberry Pi OSからはRTCとして認識されている。
あとはtimedatectlを実行してみるとちゃんとRTCが動いているのがわかる。

とりあえずこれでconfig.txtに一行追加するだけで、既存のi2cポートを使わずにGPIOにRTCをぶら下げることができた。RTC-8564NBは一応100kHzでも動くのね。

0 件のコメント:

コメントを投稿