98 views
【1】やりたいこと
家電製品を制御するための赤外線リモコンが発信する信号のパターンをモニタリングしたい。
ただし…
ブラックボックスな便利ライブラリを使うのではなく、生の信号データをそのまま見たい。
以下、3回のブログ投稿で完成を目指す。
(56)【連載2-1】リモコン作り:赤外線リモコンの信号パターンをキャプチャする。
(57)【連載2-2】リモコン作り:赤外線LEDで信号パターンを再生する。 ←今回
(58)【連載2-3】リモコン作り:キャプチャ機能付きリモコンの完成!?
【2】使用材料
1) Raspberry Pi Pico 2
最初は Raspberry Pi 5で実装しようと考えたが、
・pigpioが使えない
・Raspberry Pi OSのオーバーヘッドが大きい且つ RTOSではない
などの問題があるため、リアルタイム性に優れている Raspberry Pi Pico 2 を使うことにした。
https://akizukidenshi.com/catalog/g/g129604/
https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html#raspberry-pi-pico-2
以下、Raspberry Pi Pico 2 を Pico2 と表記する。
2) 赤外線LED
https://akizukidenshi.com/catalog/g/g104313/
データシートを見ると、このLEDの仕様は以下の通り。
https://akizukidenshi.com/goodsaffix/OSI5FU3A11C.pdf
順方向電流(IF) | 100mA |
順方向降下電圧(VF) | 1.35V |
このLEDを 3.3V出力の GPIOに接続するので、必要な抵抗の大きさを下式で求める。
3.3[V] – 1.35[V] = 100[mA] x R[Ω]
R[Ω] = 1.95[V] / 0.1[A]
R[Ω] = 19.5 [Ω]
よって、LED接続の回路上には 19.5[Ω] 以上の抵抗器を使う。
【3】回路の結線
Pin# | GPIO# | Signal |
3 | - | GND |
20 | 15 | LED out |
【4】プログラミング
Step 1 : シンプル実装 NG
前回の投稿 でファイル出力した赤外線信号パターンをロードし、そのまま赤外線LEDの点灯パターンとして再生してみた。
from machine import Pin # Raspberry Pi PicoでGPIOピンを扱うためのモジュールをインポート import time # 時間操作に必要なモジュールをインポート ir_led = Pin(15, Pin.OUT) # GPIO15ピンを出力モードで設定し、赤外線LEDを制御する # ファイルから赤外線信号のパターンを読み込む with open('ir_pattern.txt', 'r') as f: # 指定されたファイルを読み込む data = f.read().strip() # ファイルの内容を読み取り、前後の空白を削除 ir_data = list(map(int, data.split(','))) # カンマ区切りの値を整数のリストに変換 # 読み込んだ赤外線信号のパターンを再生する for i, pulse in enumerate(ir_data): # パターン内の各信号を順番に処理 if i % 2 == 0: # 偶数インデックスはLEDをONにする期間 ir_led.value(1) # 赤外線LEDをONにする else: # 奇数インデックスはLEDをOFFにする期間 ir_led.value(0) # 赤外線LEDをOFFにする time.sleep_us(pulse) # パルスの期間だけ待機する(マイクロ秒単位) ir_led.value(0) # 最後にLEDをOFFにして再生を終了
赤外線LEDに繋げたGPIOの出力値を見る限り、意図した通りの信号制御が行われている。
だが…
リモコンの制御対象の機器が反応しない…
Step 2 : PWMを使った改良版実装 OK
どうやら赤外線リモコンの通信規格では、38KHz, Duty ratio 1/3の PWM制御が必要とのこと。
これに従って LED点灯制御の方法を変えてみた。
from machine import Pin, PWM # Raspberry Pi PicoでGPIOピンとPWMを扱うためのモジュールをインポート import time # 時間操作を行うためのモジュールをインポート # 赤外線LEDのピン設定 ir_led = Pin(15, Pin.OUT) # GPIO15ピンを出力モードに設定(赤外線LED用) pwm = PWM(ir_led) # 赤外線LEDを制御するためのPWMインスタンスを作成 # 記録したパターンを読み込む with open('ir_pattern.txt', 'r') as f: # 赤外線信号のパターンを保存したファイルを開く pattern = f.read().strip() # ファイル内容を読み取り、余分な空白を削除 ir_data = list(map(int, pattern.split(','))) # カンマ区切りの文字列を整数リストに変換 # PWM設定 frequency = 38000 # 赤外線信号のキャリア周波数を38kHzに設定 duty_cycle = 33 # デューティサイクルを33%に設定 pwm.freq(frequency) # PWMの周波数を設定 pwm.duty_u16(int(65535 * duty_cycle / 100)) # デューティサイクルを16ビット精度で設定 # 信号のパターンに従って赤外線信号を送信 for i, pulse in enumerate(ir_data): # パターンデータを順番に処理 if i % 2 == 0: # 偶数インデックス(ON期間) pwm.init() # PWMを開始して信号を送信 else: # 奇数インデックス(OFF期間) pwm.deinit() # PWMを停止して信号送信を無効化 time.sleep_us(pulse) # 指定された期間(マイクロ秒単位)待機 pwm.deinit() # 再生終了後はPWMを無効化して信号送信を完全に停止
こちらだと…
リモコン制御対象の機器が反応してくれた!
【5】問題点
1) 自作プログラムでリモコン制御が効かない機器がある。
■効いたもの
・IRIS OYAMA製照明
・TEKNOS製扇風機
・東芝製エアコン
■効かなかったもの
・SONY製テレビ
・NEC製照明
■残件:これから試すもの
・SHARP製エアコン
・HITACHI製エアコン
ToDo : 赤外線通信の規格をよく調べてみよう。