やりたいことから始める 赤外線エアコンIoT (2/5)
第2章:赤外線受信の仕組み — PL-IRM1838B のデータシート確認と電源フィルタ
1. 受信モジュールの役割
前章で見たように、エアコンのリモコン信号は 38kHz の搬送波の上に、µs 単位の MARK/SPACE でデータが乗っています。Pico の GPIO は「光」を直接読めないし、38,000 回/秒の点滅をソフトウェアで追いかけるのは負荷が高いです。
そこで、以下の 2 つの処理をハードウェアで肩代わりしてくれる受信モジュールを使います:
- 38kHz の変調を検出して、「光が来ている/来ていない」をデジタル信号(HIGH/LOW)に変換
- ノイズを除去して、エアコンの受信部と同じ基準で「本物の信号かどうか」を判断
つまり、受信モジュールを使えば、Pico は「µs 単位で GPIO の HIGH/LOW を読む」ことに集中でき、38kHz の復調という面倒な作業はモジュールに任せられます。
2. データシートを確認するとどうなっているか
- 中心周波数:37.9kHz(38kHz に極めて近い)
- 電源電圧:2.7V 〜 5.5V(3.3V 動作で問題なし)
- 出力形式:アクティブ LOW(赤外線を検出している間が LOW)
- 出力レベル:3.3V 給電時、HIGH は約 3V(Pico の GPIO に直接入力可能)
- Pin 配置(受光部を正面から見て、足を下に):左から Pin 1=Output、Pin 2=Ground、Pin 3=Vcc
- 推奨応用回路:VCC 直前に 47〜100Ω の直列抵抗、VCC-GND 間に 47µF のコンデンサを配置
データシートを確認すると、3.3V 給電で動作し、出力も 3V 程度なので Pico の GPIO へそのままつなげて安全であることが分かります。また、メーカーが推奨する電源フィルタがあることが判明しました。
理由:3.3V 動作、38kHz 復調、出力レベルが Pico にそのまま入力可能。メーカー資料で Pin 配置(1=OUT, 2=GND, 3=VCC)が確定している。
3. 電源フィルタを入れる理由
データシートの「推奨応用回路」に従い、以下の部品を追加します:
| 部品 | 値 | 接続場所 | 役割 |
|---|---|---|---|
| 抵抗 | 100Ω ×1 | 3.3V → PL-IRM1838B VCC の直前 | 電源フィルタ。メーカー推奨の 47〜100Ω の範囲内。手元の ELEGOO キットに入っている可能性が高い。 |
| 電解コンデンサ | 47µF ×1 | PL-IRM1838B 側 VCC-GND 間 | 受信モジュールの電源ノイズを減らす。極性あり(+を VCC 側、−を GND 側)。秋月 117887 などを追加購入。 |
Pico の 3.3V 電源は比較的きれいですが、USB 給電や Pico 内部の動作によって微小なノイズが乗ることがあります。PL-IRM1838B はこのノイズを「赤外線信号」と誤認識してしまう可能性があります。直列抵抗と並列コンデンサで「急な電圧変化を吸収し、モジュールには滑らかな電圧だけを届ける」ことで、誤動作を防ぎます。
4. 配線を決める
データシートで確認した Pin 配置に従い、以下のように接続します。
| PL-IRM1838B | Pico 2 WH | 理由 |
|---|---|---|
| Pin 1 OUT | GP16 / Pin 21 | 受信信号を Pico へ入力。アクティブ LOW。 |
| Pin 2 GND | GND | 共通の 0V 基準。 |
| Pin 3 VCC | 3.3V(100Ω 経由) | 3.3V は動作範囲 2.7〜5.5V 内。フィルタ抵抗を直前に入れる。 |
| — | — | 47µF は VCC-GND 間に並列。+を VCC 側、−を GND 側。 |
図1:PL-IRM1838B の電源フィルタ回路。データシート推奨に従い、ノイズ対策を先に組み込む。
5. 純正リモコンの信号を観察する
PL-IRM1838B を接続したら、まず純正リモコン RAR-8P2 の信号を観察します。エアコンに向けたまま、横から受信モジュールで拾います。
日立の公開仕様では、赤外線キャリア周波数や通信フォーマットまでは確認できていません。そのため「日立だから NEC 方式」「必ず 38.0kHz」と決めつけず、PL-IRM1838B で純正リモコンの信号を実測します。PL-IRM1838B の中心周波数は 37.9kHz なので、まず実機の RAR-8P2 を受信できるかを確認し、受信できた MARK/SPACE 時間列をそのまま学習対象にします。
PL-IRM1838B は 37.9kHz の変調を復調するため、38kHz 帯のリモコン信号を受信できます。ただし、エアコンの正確なキャリア周波数はデータシートでは分からないため、実測で確認する必要があります。受信できた時間列をそのまま保存して再送信する「学習方式」を取ります。
6. 受信実験のコード
まずは独立した実験として、純正リモコンの信号を観察します。
from machine import Pin
from time import ticks_us, ticks_diff, sleep_ms
IR_RX = 16
pin = Pin(IR_RX, Pin.IN)
last = ticks_us()
pulses = []
def edge(p):
global last
now = ticks_us()
pulses.append((p.value(), ticks_diff(now, last)))
last = now
pin.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=edge)
print("純正リモコンをエアコンへ向けて1回操作")
sleep_ms(3000)
pin.irq(handler=None)
print(pulses)
これは最初の観察用コードです。各要素に入る時間は「直前のエッジから今回のエッジまで」の長さなので、最初の 1 要素をそのまま MARK 開始と決めつけず、信号の開始位置を確認してから MARK/SPACE へ整理します。