お天気時計の作成(その12ー2:赤外線リモコン)

raspberry pi zero 2Wを入手したので備忘録として下記ます。

前回はLircで赤外線リモコンを作成しようとしましたが、動作しなかったので今夏は、pythonのプログラムを作成してみました。

回路構成は前回と同様です。

★受信はできたが、送信は信号の幅のばらつきが大きく断念。

 別途pico等のOSを実装していないマイコンで試そうと思います。

pythonプログラム

赤外線を受信したら、同じ信号を10秒後に送信するようにしました。


import pigpio
import time

# 赤外線送信ピンのGPIO番号
IR_GPIO_TX_PIN = 18
# 赤外線受信ピンのGPIO番号
IR_GPIO_RX_PIN = 17  # GPIO17に変更

# Raspberry PiのGPIOに接続
pi = pigpio.pi()

def capture_ir_signal():
    if not pi.connected:
        print("pigpioデーモンに接続できません")
        return []

    # GPIO17をプルアップ設定
    pi.set_pull_up_down(IR_GPIO_RX_PIN, pigpio.PUD_UP)

    # キャプチャするパルスを保存するリスト
    pulses = []

    # コールバック関数を定義して、受信したパルスをリストに追加
    def cbf(gpio, level, tick):
        if pulses:
            pulses[-1][1] = pigpio.tickDiff(pulses[-1][1], tick)  # 前のエントリの持続時間を計算して更新
        pulses.append([level, tick])  # 新しいエントリを追加

    cb = pi.callback(IR_GPIO_RX_PIN, pigpio.EITHER_EDGE, cbf)

    # キャプチャを開始
    print("赤外線信号を受信中... 持続時間: 5秒")
    time.sleep(5)

    # キャプチャを終了し、コールバックを解除
    cb.cancel()

    # 最初のエントリ(持続時間が設定されていない)を削除
    if pulses and pulses[0][1] == pulses[-1][1]:
        pulses.pop(0)

    return pulses

def send_ir_signal(pulses):
    if not pi.connected:
        print("pigpioデーモンに接続できません")
        return

    # パルス列からカスタム波形を作成
    for pulse in pulses:
        level = pulse[0]
        duration = pulse[1]
        if level == 0:
            pi.hardware_PWM(IR_GPIO_TX_PIN, 38000, 500000)
            time.sleep(duration/1000000)
        else:
            pi.hardware_PWM(IR_GPIO_TX_PIN, 0, 0)
            time.sleep(duration/1000000)
            

    pi.hardware_PWM(IR_GPIO_TX_PIN, 0, 0)  #stop

    pi.stop()

if __name__ == "__main__":
    print("赤外線信号をキャプチャします...")
    captured_pulses = capture_ir_signal()
    print(f"キャプチャしたパルス: {captured_pulses}")

    time.sleep(10)
    
    if captured_pulses:
        print("赤外線信号を再送信します...")
        send_ir_signal(captured_pulses)

赤外線リモコンの受信確認

LED照明のリモコン信号を受信してみました。

 

受信した信号はL:3370us,H:1070us,L:425us,H:1315us,L:425us,H:425us…でした。

波形で確認します。拡大してH/Lの幅を確認したところほぼあっていました。

赤外線リモコンの送信確認

赤外線リモコンは、先ほど受信したLの期間、38khzで変調した信号を送信します。

トランジスタのベース側の信号(GPIO17)を見てみます。

下記のような波形を出力しています。

それらしい波形を出力しています。

それぞれの信号の長さを確認してみます。

リーダの先頭部分(受信時は約3.4ms)は、4.2msでした。約1ms長いですね。

次のHだった部分(受信時:約1ms)は、2.4ms

次のLだった部分(受信時:425us)は、758us

次のHだった部分(受信時:1.3ms)は、1.8ms

次のLだった部分(受信時:425us)は、708us

次のHだった部分(受信時:425us)は、769us

全体的に長めでばらつきが大きいようです。

 

38kHzの変調信号は、ハードウェアPWMで出力しているので、ばらつきなく きれいに出ているようですが、各信号の幅は正しく出力できていませんでした。

実際に赤外線LEDで出力してみましたが、照明を制御することはできませんでした。

結論

まだ赤外線リモコンは動きそうにありません。

いったん中断します。