見出し画像

machine.I2C 使い方

先の記事「machine.ADC 使い方」にも書きましたが、最近ではI2Cなどデジタル出力のセンサーを用いることが多くなっていると思います。私も精度を要求される場面ではデジタル出力のセンサーを使用しています。

高精度の測定に用いる回路や電源には高度な設計スキルと、加工精度が必要になります。MEMSと呼ばれる高精度の加工技術と成果を味方にしない手はありません。

machine.I2C クラスをインポート

I2Cのオブジェクト作成にPinの指定が必要なので、Pinクラスも一緒にインポートします。

from machine import Pin, I2C

ピンを割り付け、オブジェクトi2cを作成します。SCLピン=IO5,SDAピン=IO4,クロック周波数100kHzの例です。

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)

必要以上にクロック周波数を上げない方がノイズに強いと思います。
私は100kHzしか使ったことがないので、いつか比較してみたいと思います。

デバイスscan

先に作ったオブジェクトi2cに接続されたデバイスをスキャンします。

a = i2c.scan()

デバイスが行方不明(システム故障)の検出に使う場合がありますが、接続されたデバイスが決まっている(探す必要がない)場合は、scanを実行しなくても問題ありません。

デバイスに送信

先に作ったオブジェクトi2cに接続されたアドレス0x3Aのデバイスに、文字列12を送信する例です。

i2c.writeto(0x3a, '12') 

次は2byteのbytearrayをアドレス0x3Aのデバイスに送信する例です。私はこの方法を使っています。

buf = bytearray(2)
buf[0] = 0xE0
buf[1] = 0x00
i2c.writeto(0x3a, buf) 

デバイスから受信

先に作ったオブジェクトi2cに接続されたアドレス0x3Aのデバイスから、4byteを受信する例です。

i2c.readfrom(0x3a, 4)

メモリーアドレスによるアクセス

デバイスによってはメモリーアドレスによるアクセスが必要なものがあり、次のように書き込みと読み出しを行います。

i2c.writeto_mem(42, 2, b'\x10')
i2c.readfrom_mem(0x3a, 8, 3
スレーブアドレス 0x3Aのデバイスの内部メモリーアドレス2を先頭にbyteデータ '\x10' を書き込む。
アドレス(スレーブアドレス)0x3Aのデバイスの内部メモリーアドレス8から始まる3byteを読み出す。

私の経験では、MLX90614 と言うセンサ(サーモパイル)が Repeated Start Condition を要求する為、readfrom_mem を使っています。

実際の使用例

具体例は、デバイス毎に初期設定や、書き込み/読み出しのbyte数やコマンド・データが異なります。一般的な説明が困難で、デバイス毎の記事で紹介した方が混乱が少ないと考え、今回は省略します。

今後とも宜しくお願いいたします。


出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。