MicroPython的午睡(131)M5Stack UIFlow2、I2Cスキャン

Joseph Halfmoon

前回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接続のデバイスが洗い出されましたぞ。こんな感じ。I2CscanResults

もうひとつ、BMM150というのも見つかるかと思ったんだけれども。。。MPU6886とIP5306は予定通りに見つかったのでとりあえずOK。いい加減だな。

次回はI2Cバスに外部デバイスを接続してみるかい。

MicroPython的午睡(130)M5Stack UIFlow2、microSDマウント へ戻る

MicroPython的午睡(132)M5Stack UIFlow2、BMP280圧力センサ へ進む