やりたいことから始める 赤外線エアコンIoT (1/5)
第1章:目的の設定とマイコンの選定 — なぜ Pico 2 WH なのか
このシリーズは「部品リストが先にあって、それをどう配線するか」を説明するのではなく、「やりたいこと」から出発して、必要な機能を分解し、一つずつ部品を選び、回路を組んでいく思考プロセスを追います。
0. そもそも何がしたいのか
やりたいこと: 家のエアコンを、スマホや自動化ルールから操作したい。
制約:
- エアコン自体は改造しない(アパート備え付けなので)
- 無線LANアダプター SP-WL4 約15,000円 たかい。
- 電子工作はほぼ初心者。はんだ付けキットは持ってない
- 持ってる部品が使えるなら使う、無いものは買う
- 将来 Wi-Fi 経由でサーバーと連携したい
この「やりたいこと」を実現するために、どんな装置が必要か、頭の中で分解していきます。
図0:「やりたいこと」→「必要な機能」→「部品」への分解
1. エアコンの赤外線信号の仕組み
1-1. リモコンはどうやって信号を送っているか
エアコンの純正リモコン(RAR-8P2)が出す赤外線信号は、人の目には見えない光の点滅です。ただし「光っている/消えている」の単純な点滅ではなく、以下の2 段階の構造になっています。
- 搬送波(38kHz):赤外線 LED を約 38,000 回/秒で点滅させる搬送波。これは「光の通路」を作る役割です。エアコンの受信部はこの 38kHz の変調を検出することで、「本物のリモコン信号か/外からのノイズか」を区別しています。
- データ信号(µs 単位のタイミング):38kHz の搬送波を「一定時間出す(MARK)」「一定時間止める(SPACE)」という時間パターンで制御し、電源 ON や温度設定などの命令を表現します。MARK と SPACE の長さの組み合わせが「0」や「1」や「ヘッダー」などを表します。
図1:赤外線リモコン信号は、38kHz の搬送波を出す MARK と、搬送波を止める SPACE の時間パターンでデータを表現する。
ここで、MARK / SPACE と HIGH / LOW は同じものではないことに注意が必要です。MARK は「38kHz の搬送波を出している時間」、SPACE は「搬送波を止めている時間」を表す用語です。マイコンの GPIO では、実装上 MARK を HIGH、SPACE を LOW として扱うことが多いですが、これは電気的な論理レベルの話であり、MARK / SPACE そのものが HIGH / LOW を定義しているわけではありません。
つまり、エアコンのリモコン信号を再現するには、µs(マイクロ秒)単位で正確に「いつ 38kHz の搬送波を出すか/止めるか」を制御できる必要があります。これがマイコン選定の核心条件の一つになります。
1-2. なぜ「学習方式」を取るのか
日立の純正リモコン RAR-8P2 の通信プロトコル(どのタイミングでどのデータを送るか)は公開されていません。そのため、プロトコルを解析するのではなく、純正リモコンが実際に出す信号の MARK/SPACE の時間列をそのまま記録して、同じ時間列を再送信する「学習方式」を取ります。
この方式では、プロトコルの詳細を知らなくても動作しますが、その分、µs 単位のタイミングを忠実に記録・再現できるマイコンが必要です。
2. 頭脳と通信手段を決める
2-1. マイコンに求める条件
まず、装置の「頭脳」となるマイコンを選びます。求める条件を整理します:
- 赤外線信号をマイクロ秒単位で扱える → 比較的高速な GPIO と、PWM や PIO などのハードウェア支援があると嬉しい
- 温度・湿度を読める → I²C や 1-Wire などのデジタル通信が使える
- 将来 Wi-Fi でサーバーと話したい → Wi-Fi 内蔵が理想。外付けモジュールは配線が増える
- 3.3V 系 → 最近のセンサーは 3.3V が主流。5V 系だと電圧変換が面倒
- 安価で入手しやすい → 失敗しても気軽に買い直せる
2-2. 候補マイコンの比較検討
条件が決まったので、実際に市場にあるマイコンをいくつかピックアップして比較します。今回の用途に対して「過剰」「適切」「不足」の観点で評価します。
| 評価項目 | ESP32-DevKitC | Arduino Uno R4 WiFi | Raspberry Pi Pico 2 WH | Seeed XIAO ESP32C3 |
|---|---|---|---|---|
| Wi-Fi | 内蔵 | 内蔵 | 内蔵 | 内蔵 |
| GPIO 電圧 | 3.3V (一部 5V トレラント) |
5V (3.3V ピンもあり) |
3.3V 固定 | 3.3V 固定 |
| IR の µs 制御 | RMT peripheral (やや複雑) |
ソフトウェアタイマー (Wi-Fi 併用時注意) |
PIO (最も柔軟) |
タイマー制御 (限定的) |
| I²C / 1-Wire | 有り | 有り | 有り | 有り |
| 開発環境 | Arduino IDE / MicroPython / ESP-IDF |
Arduino IDE | MicroPython / C++ (Pico SDK) |
Arduino IDE |
| ブレッドボード実装 | △(幅がやや広い) | ×(大きすぎる) | ○(標準的) | ◎(小型) |
| 価格帯 | 800〜1,200 円 | 4,000〜5,000 円 | 1,200〜1,500 円 | 600〜800 円 |
| 情報量・サンプル | 圧倒的に多い | 多い(R4 はやや少ない) | 増えている | やや少ない |
| 手持ち部品相性 | △(5V 部品要確認) | ◎(5V そのまま) | △(5V 部品要確認) | △(5V 部品要確認) |
ESP32-DevKitC
Wi-Fi/Bluetooth 内蔵でコスパが非常に高く、Arduino IDE の情報量は圧倒的です。IR 送受信用の IRremote ライブラリが充実しており、「ライブラリを使えば楽に IR が動かせる」という点では最有力です。
ただし、µs 単位の精密な GPIO 制御には RMT(Remote Control)peripheral を使う必要があり、Arduino のライブラリに隠蔽されがちで「内部でどう動いているか」がブラックボックスになりやすいです。また、一部の GPIO は 5V トレラントですがどれがトレラントか判別しにくく、初心者が間違えると壊すリスクがあります。
Arduino Uno R4 WiFi
5V 系なので、手持ちの 5V 部品(ELEGOO キットなど)がそのまま使えるのが大きなメリットです。Wi-Fi も内蔵しています。
一方で、ボードが大きくブレッドボード実装がしにくい(1 つのブレッドボードに収まりにくい)、価格が 4,000 円以上と高い、3.3V センサー(DHT20 など)にはレベル変換が必要、といった欠点があります。また、Wi-Fi 処理中にソフトウェアタイマーが乱れる可能性があり、µs 単位の IR 制御との両立に注意が必要です。
Seeed XIAO ESP32C3
小型(ブレッドボードに刺しやすい)で安価(600 円台)。Wi-Fi/Bluetooth 内蔵です。
ただし、GPIO 数が少なく(11 本)、今後の拡張性に乏しいです。IR 送受信・温湿度センサー・スイッチ・LED といった今回の構成ならギリギリ収まりますが、将来の第 2 部でサーバー連携や追加センサーを考えるとピン不足になりやすいです。
Raspberry Pi Pico 2 WH
Wi-Fi 内蔵、3.3V 固定で部品選定がシンプルです。最大の強みは PIO(Programmable I/O) で、µs 単位の GPIO 制御が非常に柔軟に行えます。IR 信号のような「正確なタイミングで HIGH/LOW を切り替える」処理に最適です。
ただし、ESP32 に比べると Arduino IDE 周辺の情報量はまだ少なく、IR 用の完成度の高いライブラリも少ないため、自分で波形を組み立てる必要があります。
2-3. なぜ Pico 2 WH になったのか
比較検討の結果、今回のプロジェクトでは Raspberry Pi Pico 2 WH を選びました。ただし、これは「Pico が絶対的に優れている」という意味ではなく、今回の条件に最も合致したということです。
| 今回重視した条件 | Pico 2 WH の適合度 | 他の候補との比較 |
|---|---|---|
| IR 信号を µs 単位で正確に送受信したい | ◎ PIO で最も柔軟に制御可能 | ESP32 は RMT で可能だが設定が複雑。Arduino は Wi-Fi 併用時にタイミングが乱れるリスク。 |
| 部品選定をシンプルにしたい | ◎ 3.3V 固定で統一しやすい | ESP32 は「一部 5V トレラント」で判別が面倒。Arduino は 5V/3.3V の混在が必須。 |
| ブレッドボードで試行錯誤したい | ○ 標準的なサイズ | Arduino は大きすぎる。XIAO は小さすぎて拡張性に乏しい。 |
| 将来 Wi-Fi でサーバー連携したい | ○ CYW43439 内蔵 | ESP32 も同様に内蔵。Arduino R4 も内蔵。 |
| 予算を抑えたい | ○ 1,000 円台 | ESP32・XIAO の方が安いが、今回の用途では機能的に不足/過剰。 |
理由:IR の µs 制御(PIO)と 3.3V 統一という今回の核心要件に最も合致。Wi-Fi 内蔵で第 2 部のサーバー連携も見据えられる。ただし、ESP32 も有力な選択肢であり、「Arduino IDE の豊富なライブラリで楽をしたい」「5V 部品をそのまま使いたい」なら ESP32 を選ぶのも正当な判断です。
2-4. データシートを確認するとどうなっているか
- GPIO 電圧:3.3V 固定(5V トレラントではない)
- 電源ピン:3V3(OUT) Pin 36(3.3V 電源出力)、VBUS Pin 40(USB 給電時 約 5V)
- Wi-Fi:CYW43439 内蔵(2.4GHz)
- プロセッサ:RP2350(デュアルコア、PIO あり)
- MicroPython 公式サポートあり
データシートを確認すると、GPIO は 3.3V 固定で 5V 入力に耐えないことが明確です。これは後の部品選定に大きく影響します。
理由:Wi-Fi 内蔵、3.3V 系、MicroPython 対応、PIO あり、安価。将来の第2部(サーバー連携)も見据えて WH(Wireless + ヘッダー付き)を選ぶ。
2-5. GPIO って何?
部品を選んでいく中で「このピンを GPIO に接続する」という言葉が何度も出てきます。ここで軽く整理しておきます。
GPIO は General Purpose Input/Output(汎用入出力ポート)の略です。簡単に言うと、マイコンの「手」と「目」みたいなものです。
| モード | 役割 | 今回の使い方 |
|---|---|---|
| INPUT(入力) | 外からの信号を読む。「目」の役割。 | PL-IRM1838B からの受信信号を GP16 で読む。タクトスイッチの押下を GP15 で読む。 |
| OUTPUT(出力) | 外へ信号を出す。「手」の役割。 | GP18 から HIGH/LOW を出して、BC337-40BU(トランジスタ)を動かす。 |
Pico では GPIO を GP0、GP1、GP2… といった番号で呼びます。今回使う主なピンは以下の通りです:
- GP4 / GP5 → DHT20 の SDA / SCL(I²C 通信)
- GP15 → タクトスイッチ(INPUT、内部プルアップ使用)
- GP16 → PL-IRM1838B の OUT(INPUT、受信信号)
- GP18 → BC337-40BU の BASE(OUTPUT、IR 送信)
図1-2:GPIO はマイコンの「手」(OUTPUT)と「目」(INPUT)。今回は GP4/GP5/GP15/GP16/GP18 を使う。
2-6. 電圧の世界観を固定する
Pico 2 WH を選んだ時点で、装置全体の電圧基準が 3.3V に決まります。これは非常に重要な分岐点です。
VBUS ピンには USB 給電時に約 5V が来ますが、GPIO への入力信号は 3.3V を超えてはいけません。5V 信号を直接入れると壊れます。
この時点で、手元にある ELEGOO Arduino キットの部品を見直します。キットに入っている DHT11 や 5V 用 IR 受信モジュールは「そのまま」では使えません。電圧変換回路を追加するか、3.3V 対応の部品に置き換えるかの選択が生じます。
今回は「電圧変換を覚えるより、3.3V で動く部品を選ぶ方が早い」という判断で、不足部品のみ追加購入する方針を取ります。