前回SPI経由でmicroSDカードへアクセス。今回はI2Cをスキャンしてみます。M5Stack内蔵のI2C接続デバイスあり、既に初期化済の筈。それとの競合がチト心配ではあるのですがMicroPython側のI2Cインスタンスを作ってスキャンをかけてみます。このI2C信号が側面ピンソケットやGroveコネクタにも接続。
※「MicroPython的午睡」投稿順 Indexはこちら
※M5Stack Grayに書き込んだUIFlow2.0 (Alpha-27)対応のMicroPython処理系とWindowsパソコン上で動作しているThonny 4.0.1で動作確認しています。
M5Stack grayのI2C結線
M5Stack Gray(Basicと同じ筈)の回路図は公開されております。しかし、どういうわけか回路図には以下が見当たらないのです。
オンボードのI2Cバスと側面のGroveコネクタ
何か「大人の事情」があったのか?とは言え、大体の線は以下に記述されとります。
https://docs.m5stack.com/en/core/gray
-
- SCL、G22端子
- SDA、G21端子
ただし、I2Cバスのプルアップ電圧レベルについては実測にて3.3Vではないかと推定しております。その辺を調べた過去記事が以下に。
IoT何をいまさら(34) M5StackのGroveコネクタ
今回実験のスクリプト
今回実験に際しては1個、懸念材料ありです。オンボードのI2Cバスに接続されている「カスタム」IP5306チップです。このチップはパワーマネージメント用のチップみたいで、M5Stackの起動時に初期化されて動作しておるようです。なお「普通版」のIP5306と違いM5Stack搭載品はインタフェースをI2Cに変更したカスタムだ、ということです。
よって本当は上記初期化に使ったI2Cバスのインスタンスが「生きている」ハズなので、それを使うべきだと思うのです。しかしUIFlow2のMicroPythonからはどうしたら良いのか不明。そこで荒っぽいですが、I2CバスのオブジェクトをMicroPython側でも別途作成してスキャンすることにいたしました。まあ、IP5306相手にI2Cが動くのはパワーマネジメントが必要な局面だけだろ~、もしかするとそこで何か問題起きるかも(起きないかもしれない)くらいな割り切りっす。割り切りっていうのか?
I2Cスキャン用のMicroPythonソースが以下に。
# i2cSCAN.py from machine import I2C, Pin import M5 def main(): M5.begin() print("M5Stack Gray, I2C0 SCAN") i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000) lis = i2c.scan() for device in lis: if device== 0x75: print("IP5306, Power MGR ", end="") elif device== 0x68: print("MPU6886, 6 axis Motion Sensor ", end="") elif device== 0x10: print("BMM150, 3 axis Magnetic Sensor ", end="") else: print("UNKNOWN DEVICE ", end="") print("found at ADR=0x{0:02X}".format(device)) if __name__ == "__main__": main()
実機動作の確認
Thonnyから上記のスクリプトを走らせてみたところ、I2C接続のデバイスが洗い出されましたぞ。こんな感じ。
もうひとつ、BMM150というのも見つかるかと思ったんだけれども。。。MPU6886とIP5306は予定通りに見つかったのでとりあえずOK。いい加減だな。
次回はI2Cバスに外部デバイスを接続してみるかい。