汎用 I2C デバイス¶
EV3 と NXT は、汎用 I2C デバイスをハブに接続することをサポートしています。 ここのピンアウト を参照してください。
- class I2CDevice(port, address, custom=False, power_pin=0, nxt_quirk=False)¶
汎用/カスタム I2C デバイス。
注:
power_pinオプションは自己責任で使用してください。ピンに電源を供給する場合、注意しないとハブやデバイスが損傷する可能性があります。このオプションを使う場合、リスクを理解していることを確認するよう求められます。- パラメータ:
port (Port) -- デバイスが接続されているポート。
address (int) -- クライアントデバイスの I2C アドレス。 I2C Addresses を参照。
custom (bool) -- カスタム I2C デバイスを使う場合は
Trueに設定。power_pin (int) -- デバイスの電源要件。ピンに電源を供給しない場合は
0(デフォルト)を指定してください。NXT および EV3 で、ピン1にバッテリー電源を供給するには1を指定してください。その他のピンはサポートされていません。nxt_quirk (bool) -- 旧型の NXT 超音波センサーなど、信頼性高く通信するために低速な互換性タイミングを必要とする古い NXT I2C センサーの場合は、これを
Trueに設定します。
- awaitread(reg=None, length=1) bytes¶
- awaitread(reg=None, length=1, map=callable) Any
指定したレジスタから始まるバイト列を読み取ります。
- awaitwrite(reg=None, data=None)¶
指定したレジスタ(オプション)からバイト列を書き出します。
- パラメータ:
- 例外:
ValueError --
regが指定されていて、データが 32 バイトを超える場合に発生します。さらにデータを書き込むにはreg引数を省略し、レジスタをdataの最初のバイトとして含めます。
例: I2Cデバイスへの読み書き
#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.iodevices import I2CDevice
from pybricks.parameters import Port
# EV3 の初期化
ev3 = EV3Brick()
# I2C センサーの初期化
device = I2CDevice(Port.S2, 0xD2 >> 1)
# デバイスから1バイト読み込む。
# このデバイスの場合、Who Am I レジスタ (0x0F)から
# 期待値である 211 を読み取れます。
if 211 not in device.read(0x0F):
raise ValueError("Unexpected I2C device ID")
# データを書き出すには、1バイト以上のバイト列オブジェクトを
# 作成します。例:
# data = bytes((1, 2, 3))
# レジスタ 0x22 に1バイト(値 0x08)を書き出す
device.write(0x22, bytes((0x08,)))
I2C アドレス¶
I2C アドレスは7ビット値です。しかし、LEGO 互換センサーを製造しているほとんどのベンダーは、ドキュメントに8ビットアドレスを記載しています。このようなアドレスを使うには、1ビットシフトする必要があります。たとえば、ドキュメントに記載されているアドレスが 0xD2 の場合、 address = 0xD2 >> 1 のように記述します。
高度なI2Cコマンド¶
一部の基本的な I2C デバイスは、レジスタ引数やデータさえ必要としません。次の例に示すような動作を実現できます。
例: 高度なI2C読み書き技術
#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.iodevices import I2CDevice
from pybricks.parameters import Port
# EV3 の初期化
ev3 = EV3Brick()
# I2C Sensor の初期化
device = I2CDevice(Port.S2, 0xD2 >> 1)
# 推奨される読み込み方法
result = device.read(reg=0x0F, length=1)
# 特定のレジスタ指定なしに1バイトを読み込む:
device.read(reg=None, length=1)
# 特定のレジスタ指定なしに 0 バイトを読み込む:
device.read(reg=None, length=0)
# I2C 書き出し操作は、レジスタバイトに続いて一連のデータバイトで構成
# されます。デバイスによっては、レジスタまたはデータをスキップすることも
# できます
# 推奨される書き出し方法:
device.write(reg=0x22, data=b"\x08")
# 特定のレジスタ指定なしに 1 バイトを書き出す:
device.write(reg=None, data=b"\x08")
# 特定のレジスタに 0 バイトを書き出す:
device.write(reg=0x08, data=None)
# 特定のレジスタ指定なしに 0 バイトを書き出す:
device.write(reg=None, data=None)
追加の技術リソース
I2CDevice クラスのメソッドは Linux SMBus ドライバの関数を呼び出します。内部でどのコマンドが呼び出されているかを確認するには Pybricks source code を参照してください。MicroPython を使わずに I2C を使う方法の詳細については ev3dev I2C ページを参照してください。