【Raspberry Pi Pico】リモコン中継器をMicroPythonで作成

Pico-ir-top Raspberry Pi

本記事の内容

Raspberry Pi Picoを用いて、MicroPythonで赤外線リモコンの信号を受信・解析し、同一の信号を発信する「リモコン中継器」を作ってみました。

赤外線リモコンの信号解析結果は、OLED液晶ディスプレイに表示されます。日常で使用しているリモコンの信号解析や、リモコンの信号が届かない場所への中継器に、ぜひ作製してみてください。

必要なもの

created by Rinker
Raspberry Pi
¥980 (2024/12/10 04:50:00時点 Amazon調べ-詳細)

秋月電子にて、以下2種類のMOSFETを購入して、本記事では使用しています。(リンクは秋月電子のHP)

配線

配線は大きく分けると、「赤外線LED&MOSFETパート」、「赤外線受信モジュール」、「OLED液晶モジュール」に分かれます。液晶モジュールはオプションなので、不要な場合は外しても問題ありません。

Fritzingで描写しても配線が分かりにくいので、写真で補足します。

Raspberry Pi Pico赤外線受信モジュール赤外線LED&MOSFETSSD1306
⑱GNDGND(赤外線LED)GND
⑲GP14OUT
⑳GP15(2N7000)
㉑GP16SDA
㉒GP17SCK
㊱3V3VCCVCC
㊵VBUS(IRFU9024NPBF)

MOSFET部分の配線です。詳細は、電脳伝説様の「赤外線LEDドライブ回路の決定版」もご参照ください。

プログラムコード

Raspberry Pi Picoの内部タイマーやPWM制御を試行錯誤してコードの自作にトライしてみましたが、結局は先人の知恵を拝借することにしました。

Qittaに掲載されている「micropythonで赤外線リモコンの簡単制御」に倣って、プログラムコードを準備します。

GithubからUpyIrTx.pyとUpyIrRx.pyをダウンロード

GithubのRemotePyより、UpyIrTx.pyとUpyIrRx.pyをダウンロードします。UpyIrRx.pyは赤外線信号の受信用、UpyIrTx.pyは送信用のコードになります。

メインプログラムの作成

Qitta掲載の「micropythonで赤外線リモコンの簡単制御」に、OLED液晶ディスプレイ表示と動作の繰り返し機能を追加しています。

from machine import Pin,I2C
from UpyIrTx import UpyIrTx
from UpyIrRx import UpyIrRx
from ssd1306 import SSD1306_I2C
import time

rx_pin = Pin(14, Pin.IN) 
rx = UpyIrRx(rx_pin)

tx_pin = Pin(15, Pin.OUT) 
tx = UpyIrTx(0, tx_pin)

i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=200000) 
oled = SSD1306_I2C(128, 64, i2c)

while True:
    # 3000msec 以内に、受信回路に向けてリモコン送信すると、リモコン信号取得される。
    oled.fill(0)
    oled.text("receiving...",16,28)
    oled.show()
    rx.record(3000)
    if rx.get_mode() == UpyIrRx.MODE_DONE_OK:
        signal_list = rx.get_calibrate_list()
    else:
        signal_list = []

    # 送信回路から、リモコン信号を送信する。送信完了までブロッキング。
    if signal_list:
        oled.fill(0) 
        oled.text("analyzing... ",16,28)
        oled.show()
        tx.send(signal_list)
        oled.fill(0) 
        for n in range(8):
            for m in range(3):
                oled.text(f'{signal_list[3*n+m]:04}',48*m,8*n)
        oled.show()
    else:
        oled.fill(0) 
        oled.text("No signal... ",16,28)
        oled.show()
    time.sleep(3)

実行結果

画像は伝わりにくいことがとても残念ですが、「receiving…」状態の3秒間で受信した信号は、「analyzing…」の後に正確に発信できました。

液晶のサイズの都合上、解析結果は24数値(おそらく順に1と0の時間[ns])しか表示できませんが、グラフで表示させれば、もう少し改良できそうです。

以上、赤外線リモコンの信号解析、中継器の作製編でした。赤外線信号は38kHzしか受け付けないこと、メーカーごとの信号定義があることなど、大変勉強になることばかりでした。本記事がどなたかのお役に立てれば幸いです。

コメント