本記事の内容
Raspberry Pi Picoを用いて、MicroPythonで赤外線リモコンの信号を受信・解析し、同一の信号を発信する「リモコン中継器」を作ってみました。
赤外線リモコンの信号解析結果は、OLED液晶ディスプレイに表示されます。日常で使用しているリモコンの信号解析や、リモコンの信号が届かない場所への中継器に、ぜひ作製してみてください。
必要なもの
秋月電子にて、以下2種類のMOSFETを購入して、本記事では使用しています。(リンクは秋月電子のHP)
配線
配線は大きく分けると、「赤外線LED&MOSFETパート」、「赤外線受信モジュール」、「OLED液晶モジュール」に分かれます。液晶モジュールはオプションなので、不要な場合は外しても問題ありません。
Fritzingで描写しても配線が分かりにくいので、写真で補足します。
Raspberry Pi Pico | 赤外線受信モジュール | 赤外線LED&MOSFET | SSD1306 |
⑱GND | GND | (赤外線LED) | GND |
⑲GP14 | OUT | ||
⑳GP15 | (2N7000) | ||
㉑GP16 | SDA | ||
㉒GP17 | SCK | ||
㊱3V3 | VCC | VCC | |
㊵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しか受け付けないこと、メーカーごとの信号定義があることなど、大変勉強になることばかりでした。本記事がどなたかのお役に立てれば幸いです。
コメント