Raspberry PI4 は I2C がいっぱいあった
電力をあまり食わせたくなかったので最新のRaspberry4(Rspi4)ではなく、PI3系(Rspi3)を好んで使っていたんですが、なんとRaspberry PI 4は BCM2711を搭載しているので、I2Cを4つも追加できるとの事
Rspi3以前でもI2C-0を使おうと思えば使えたんですが、いろいろなHAT(拡張ボード)を上に乗っける時にこの端子でHATのチップと通信しているものが多く事実上使えませんでした
/boot/overlays/README ちゃんと読め > 自分
こんなところにマニュアルがあるのか。
マニュアルっていったら man コマンドだよね、と思ってた。
うーん、まだまだ勉強不足だなぁ。
Rspi3以前でもソフトウエアI2Cなるドライバがあって、そちらはGPIOピンをドライバーでドカンドカン叩いてI2Cのフリをするものらしいんですが、プルアップ抵抗は当然必要で、速度も10KHzくらいしかでないとの事。I2Cの標準は100KHzです。
しかもCPUのクロック速度で数値が変わるので、厳密なSCLクロックが必要なデバイスは動かないんだとか。幸いほとんどのI2Cデバイスはとっても緩いのでかなり適当なクロックでも動作してくれる。ありがとうハードウェア技術者の方々。
元々のハードウェアI2Cもなんかヘンテコ仕様で、でもRaspiはプルアップ抵抗が1.5KΩと(推奨10KΩ)低すぎて、配下にぶら下がるデバイスによってはL側にドライブしきれなくて波形がなまるので50KHz以下にしたほうがいいよ、みたいな。
arduino のI2Cはちゃんと10KΩプルアップなんだよね。
config.txtには
dtparam=i2c_arm_baudrate=50000 # Rspi4 64bit
dtparam=i2c_baudrate=50000 # Rspi3
と書くのがいいよ!という書き込みをよく見かけます
/boot/config.txt に追加
この /boot/overlays/README がめっちゃ不親切なんですが、とりあえずconfig.txtに追加するとI2C端子が増えると書いてあったので試してみました
dtoverlay=i2c4,pins_8_9,baudrate=10000
とりあえず10KHzという消極的設定として、reboot
# i2cdetect -l
i2c-1 i2c bcm2835 (i2c@7e804000) I2C adapter
i2c-4 i2c bcm2835 (i2c@7e205800) I2C adapter
うひょー i2c-4 が出てキター。
BCM2711の中にbcm2835のハードが入っててOSはそれを検出しているような感じなんだろうか。
とりあえず温度/湿度/気圧計の3つのセンサーが入っている基盤をぶら下げてみる。
# i2cdetect -y 4
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
3つともちゃんと見えてる!
機能はこんな感じ
この他にも config.txt に以下を追加するきっと4つも増えることであろう。
dtoverlay=i2c3,pins_4_5
dtoverlay=i2c4,pins_8_9 # 今回試したpin
dtoverlay=i2c5,pins_12_13
dtoverlay=i2c6,pins_22_23
i2c3は多分
- SDA3 が GPIO4
- SDL3 が GPIO5
に割当られるんだろう
他のI2CもおそらくSDA/SCLの順番っぽい。
こうなると今後はRspi4を購入して、電力はクロックを落として使うとするかな
end
0 件のコメント:
新しいコメントは書き込めません。