The Fool In The Valleyの雑記帳

-- 好奇心いっぱいのおじいちゃんが綴るよしなし事 --

EV3でIRリモコンをつかう

Infrared Receiver SensorはHiTechnic社からNXT用として提供されているもので、これを使うとLEGOのIR Remote Controlからのコマンドを受信することができます。 f:id:tfitv:20210309111338p:plain このデバイスをEV3のセンサとしてPythonで使用する方法について以下に記します。


 EV3を起動したあと、Infrared Receiver Sensorを例えばSensor Port 1に接続して、下図のようにメニューを使って調べると、i2c1として表示されるのでI2Cデバイスとして認識されていることがわかる。

f:id:tfitv:20210303223020j:plain 中央ボタンを押してデバイスを選択し、更にWatch valuesを選ぶと無信号の状態では右のように0pctと表示される。 f:id:tfitv:20210310074308p:plain IR Remote Controlは、スライドスイッチで1から4chのどれかを選択するようになっているので、1chに設定し、左のスイッチを前後に倒して信号を送ってみると、前に倒したときに100pct、後ろに倒したときに-100pctと表示される。これから、IR Remote Controlのスイッチを倒すことにより、-100、0、100の信号が送られているのがわかる。ただし、これが確認できるのは、1chの左のスイッチだけのようである。 f:id:tfitv:20210310074531p:plain

 HiTechnic社のサイトによると受信した値は、以下に示すアドレスの1byteのレジスタに収納されるようになっている。 f:id:tfitv:20210301220322p:plain

上述したように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クラスをインポートして使っている。