テレビ等のリモコン信号で、マイコン(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)
