皆さんこんにちは。yossyです。
電子工作をしていると、遠隔で操作をしたいといったことがよくあると思います。ですが、WiFiやBluetoothを使うと複雑になる悩みがありますよね。
そこで今回はRaspberry Pi Picoで赤外線リモコンを受信する方法について、初心者の方でも簡単に試せるように、配線やコード、使い方まで丁寧に解説します!
赤外線リモコンとは?
赤外線リモコンとは、目に見えない光である赤外線を使ったリモコンのことです。テレビやエアコンといった一般的な家電でよく使用されています。

リモコンの先端にはこのように赤外線LEDがついています。
(カメラ越しでボタンを押している様子を見ると、赤外線を見ることができます。)
何ができる?:離れたところから操作できる
赤外線リモコンはケーブルが不要なので少し離れたところからでも操作ができます。
- 手の届きにくい場所に置いた装置
- ロボットカーの操作
- 音量や光り方を変える
といった操作を手元で行えるのでとても便利です!
通信の仕組み
赤外線リモコンは、赤外線LEDを高速点滅させて情報を送っています。
リモコン側の点滅を受信モジュールを使って読み取ると、「ON/OFFのパルス列」に変換して出力してくれます。
その後、パルス列を実際のデータに変換することで、操作の内容を確認することができます。
パルス列をデータに変換するとき使われるフォーマットは主に3つです。
- NECフォーマット
- AEHAフォーマット
- SONYフォーマット
この中でNECフォーマットは最も普及している規格で、電子工作に使うのにぴったりです。
Raspberry Pi Picoで赤外線リモコンを使う方法
ここからは、Raspberry Pi Picoで赤外線リモコンを使う方法について紹介します。
必要なもの
必要なものはこちら。
- Raspberry Pi Pico
- 赤外線リモコン
- 赤外線受信モジュール(VS1838B等)
- ブレッドボード
- ジャンパワイヤー
・赤外線受信モジュール VS1838B
・赤外線リモコン
赤外線リモコンは使わない家電のリモコンを流用します。今回はFireTV用のリモコンを使います。

yossy(購入できるおすすめリモコンは見つけ次第掲載します!)
必要なライブラリのインストール
次の3つのライブラリをラズピコに保存してください。
- UpyIrRx.py … 受信ライブラリhttps://github.com/meloncookie/RemotePy/blob/main/micropython/RP2040/FromV1_17/UpyIrRx.py
- UpyIrTx.py … 送信ライブラリ
https://github.com/meloncookie/RemotePy/blob/main/micropython/RP2040/FromV1_17/UpyIrTx.py - ir_utils.py … データ処理ライブラリ
https://github.com/yoichi-funahashi/ir_utils/blob/main/ir_utils.py



ir_utilsの内部で送受信ライブラリが使われています!
配線
今回はVS1838Bをそのまま使いました。
感度や寿命のことを考えると、VCCとGNDの間に0.1uFの積層セラミックコンデンサを入れた方がいいでしょう。
他のモジュールの場合はデータシートを確認してみてください。
| ラズピコのピン名 | 接続先 | 説明 |
|---|---|---|
| 3V3 | 受信モジュール VCC | 電源 |
| GND | 受信モジュール GND | GND |
| GP0 | 受信モジュール OUT | 受信信号 |
VS1838Bのピン配置は正面左から「OUT・GND・VCC」です。


プログラム
受信したデータを表示するプログラムはこちら!
import time
import ir_utils
RX_PIN = 0 # 受信モジュール OUT
WAIT_MS = 2000 # 受信待ち時間
result = ir_utils.ir_read(pin=RX_PIN, wait_ms=WAIT_MS)
print("--- 受信結果 ---")
print("Format :", result["ir_type"])
print("UserCode :", result["user_code"])
print("DataCode :", result["data_code"])
print("IR DATA (ノイズ除去) :", result["read_data"])
print("ORIGINAL DATA :", result["org_read_data"])


ピンの指定はmachine.Pinではなく番号をそのまま渡します!
プログラムの解説
プログラムの内容はシンプルで、
result = ir_utils.ir_read(pin=RX_PIN, wait_ms=WAIT_MS)このプログラムを実行してからWAIT_MS(ミリ秒)以内に赤外線を受信すると、結果が辞書型で返ってきます。
WAIT_MSは1000にすると動作が安定しなかったので、2000以上あるといいでしょう。
NECフォーマットであればUserCodeとDataCodeを確認できます。
UserCodeは「何のリモコンか」・DataCodeは「何の信号か」を表すので、リモコンのボタンごとに操作を割り当てたい時便利です。
実際に使ってみた
リモコンのボタンでLEDを切り替えるようにしてみました。
プログラムサンプル
import time
from machine import Pin
import ir_utils
led = Pin(14, Pin.OUT)
RX_PIN = 0
WAIT_MS = 2000
# 試すときは左側のDataCodeを書き換えてください。
REMOTE_MAP = {
"48b7": "上 (UP)",
"4db2": "下 (DOWN)",
"4eb1": "左 (LEFT)",
"49b6": "右 (RIGHT)",
"4ab5": "決定 (OK)",
}
print("リモコン操作待機中...")
print("対応ボタン: 上, 下, 左, 右, 決定")
try:
while True:
result = ir_utils.ir_read(pin=RX_PIN, wait_ms=WAIT_MS)
# 信号が受信できているか、かつ辞書に登録されているコードか確認
if result["data_code"] != None:
data = result["data_code"]
# 辞書から操作名を取得(登録がない場合は "不明" とする)
action = REMOTE_MAP.get(data, f"未登録のボタン ({data})")
print(f"--- [受信] {action} ---")
# もし「決定」が押されたらLEDの切り替え
if action == "決定 (OK)":
print(">> 決定コマンドを実行しました! <<")
led.toggle()
except KeyboardInterrupt:
print("\n終了します。")
まとめ
今回は、Raspberry Pi Picoで赤外線リモコンを使う方法を紹介しました!
受信モジュールとライブラリを組み合わせることで、受信と解析を簡単にすることができました。
今回は受信だけでしたが、次回は送信について説明します。送信ができれば家電の操作ができるようになるので、IoTのようなこともできるようになります!



次回をお楽しみに!







コメント