赤外線リモコン受信コントロール

赤外線リモコン受信コントロール

2025年7月6日

テレビ等のリモコン信号で、マイコン(RaspberryPi Pico /Python)をコントロールしたいと思い検索しました。
UpyIrRxというライブラリを利用している人が多くいましたが、
受信は、最初の3秒以内だけで終了してしまいます。
送信用のデーター取得が目的なのでそれで充分なのでしょう。
micropythonで赤外線リモコンの簡単制御

私の利用したいのは、常に受信状態にあり、受信後に目的のプログラムを実行したいのです。
色々変更したのですが、目標に達しない結果となりました。

次に見つけたのが、ラズパイPicoでテレビを操作(リモコンの赤外線通信を解析して送受信) に
なります。
タイマーを使い信号の時間を測定するという、素晴らしいプログラムになります。
何故かアナログ信号として入力していますが・・・

こちらも、60パルスの限定計測となるのと、その時々により計測のバラつきがあるので、毎回同じ数字とはなりません。
それは、プログラムで吸収できるようにして解決しています。

まだ改良していますが、公開いたします。

# 赤外線リモコン受信コントロール
# (参考) アナログ-デジタル変換のライブラリを読み込む 
## https://www.ekit-tech.com/?p=2535   マイコン技術Navi 

from machine import Pin
import utime  # 時間関連のライブラリを読み込む
import time

led1 =Pin("LED",Pin.OUT) # 内臓LED
ledR =Pin(3,Pin.OUT)     # LED 赤
ledG =Pin(4,Pin.OUT)     # LED 緑
rx_pin = Pin(28, Pin.IN)  # 赤外線入力

#事前にリモコン信号を受信して記入します
ir1="0x340bf659"  # リモコン上
ir2="0x340bf7d8"  # 右
ir3="0x340bf6d9"  # 下
ir4="0x340bf758"  # 左



# 赤外線読み込み
def irrcv():
    cnt = 0
    cntend = 0
    tics =0
    st = 1
    irdata=""
    start = utime.ticks_us()
    while True:
        sens =rx_pin.value()	# 赤外線を受信
        # 赤外線を受信
        if sens == 0:
            if st == 1:
                # センサーの状態がLOWを示す
                st = 0
                # カウントアップ
                cnt += 1
                # 稼働時間の計測終了
                end = utime.ticks_us()
                # 稼働時間の開始と終了の差を表示
                tics = utime.ticks_diff(end,start)
                # 計測終了時間を次の稼働時間の開始時間に設定
                start = end
                # 周期の計測結果を出力
                #print(tics)
                if tics >1000:
                    irdata += "1"
                else:
                    irdata += "0"
        else:
            if (st == 0):
                # センサーの状態がHIGHを示す
                st = 1
                # カウントアップ
                cnt += 1
                # 時間の計測終了
                end = utime.ticks_us()
                # 時間の開始と終了の差
                tics = utime.ticks_diff(end, start)
                # 終了時間を次の時間の開始時間に設定
                start = end
                # 結果を出力
                #print(tics)

        # 60個のデータを取得したら計測終了
        if (cnt >= 60):
            #print(hex(int("0b"+irdata)))
            # 永久ループを抜ける
            return (hex(int("0b"+irdata)))

while True:
    irdata=irrcv()  #赤外線受信
    print(irdata)
    # リモコン信号によりLEDをコントロール
    if irdata == ir1:#  
        print("IR 1  LED on")
        led1.value(1)
    elif irdata == ir2:
        print("IR 2  LED off")
        led1.value(0)
    elif irdata == ir3:
        print("IR 3")
        ledR.toggle()
    elif irdata == ir4:
        print("IR 4")
        ledG.toggle()
    else:
        print("? key")
    time.sleep(0.5)