(57)【連載2-2】リモコン作り:赤外線LEDで信号パターンを再生する。

投稿者: | 2024年11月28日

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

順方向電流(IF100mA
順方向降下電圧(VF1.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
2015LED 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 : 赤外線通信の規格をよく調べてみよう。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)