Infrared Receiver SensorはHiTechnic社からNXT用として提供されているもので、これを使うとLEGOのIR Remote Controlからのコマンドを受信することができます。 このデバイスをEV3のセンサとしてPythonで使用する方法について以下に記します。
EV3を起動したあと、Infrared Receiver Sensorを例えばSensor Port 1に接続して、下図のようにメニューを使って調べると、i2c1として表示されるのでI2Cデバイスとして認識されていることがわかる。
中央ボタンを押してデバイスを選択し、更にWatch valuesを選ぶと無信号の状態では右のように0pctと表示される。 IR Remote Controlは、スライドスイッチで1から4chのどれかを選択するようになっているので、1chに設定し、左のスイッチを前後に倒して信号を送ってみると、前に倒したときに100pct、後ろに倒したときに-100pctと表示される。これから、IR Remote Controlのスイッチを倒すことにより、-100、0、100の信号が送られているのがわかる。ただし、これが確認できるのは、1chの左のスイッチだけのようである。
HiTechnic社のサイトによると受信した値は、以下に示すアドレスの1byteのレジスタに収納されるようになっている。
上述したようにIR Remote Controlの左レバーを前に倒すと01100100B(100D)、後ろに倒すと1001110BB(‐100D)、中立の時0B(0D)が送信されるので、1chにセットしたときはそれらの値が42Hのレジスタに入ることになる。同様に、右レバーを前に倒すと01100100B(100D)、後ろに倒すと10011100B(‐100D)、中立の時は0B(0D)という値が43Hのレジスタに入ることになる。 以上のことから、IR Remote Controlから送られた1chのコマンド信号をSensor Port 1に接続されたInfrared Receiver Sensorで受信するためのサンプル・プログラムをPythonで書くと以下のようになる。
from pybricks.iodevices import I2CDevice from pybricks.parameters import Port ev3 = EV3Brick() iRR = I2CDevice(Port.S2, 0x01) while True: buff = iRR.read(0x42, 2) #42Hから2byte読み込みbyteのリストbuffに入れる if buff[0] == 100: 1ch 左が前に倒されたときの処理 if buff[0] == 156: 1ch 左が後ろに倒されたときの処理 if buff[0] == 0: 1ch 左が中立の時の処理 if buff[1] == 100: 1ch 右が前に倒されたときの処理 if buff[1] == 156: 1ch 右が後ろに倒されたときの処理 if buff[1] == 0: 1ch 右が中立の時の処理
EV3 MicroPythonは機能ごとにモジュール分けされていて、その中にクラスが用意されている。ここでは、 pybricks.iodevices モジュールからI2CDeviceクラス、 pybricks.parameters モジュールからPortクラスをインポートして使っている。