汎用 I2C デバイス

EV3 と NXT は、汎用 I2C デバイスをハブに接続することをサポートしています。 ここのピンアウト を参照してください。

../_images/iodevice-rj12cyan.png
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

指定したレジスタから始まるバイト列を読み取ります。

パラメータ:
  • reg (int) -- 読み取りを開始するレジスタアドレス: 0~255 または 0x00~0xFF。レジスタアドレスを書き込まずに読み取る場合は None を指定します。

  • length (int) -- 読み込むバイト数。

  • map (callable) -- 戻り値のバイト列を変換するためのオプションの呼び出し可能オブジェクト。指定した場合、バイト列を引数として呼び出され、その戻り値を代わりに返します。

戻り値:

デバイスから返されたバイト列。呼び出し可能なオブジェクトが指定されている場合は map の戻り値。

awaitwrite(reg=None, data=None)

指定したレジスタ(オプション)からバイト列を書き出します。

パラメータ:
  • reg (int) -- 書き出し開始レジスタ: 0~255 または 0x00~0xFF。レジスタプレフィックスなしで書き込む場合は None を指定します。

  • data (bytes) -- 書き出すバイト列。レジスタの後に何も書き出さない場合は 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 ページを参照してください。