はじめに
こんにちは!株式会社NeurestXの平川です。
家にあるリモコンが増えてくると、「エアコンもテレビも照明も同じ画面から操作したい」、「スマホからまとめて操作したい」と思う場面が増えますよね。
市販のスマートリモコンを使えばすぐに実現できますが、今回はWebアプリ、通信、マイコン、赤外線送信回路まで含めて自作することを目的に、ESP32を使ったスマートリモコン基板を設計・実装しました。
この記事では、ESP32-WROOM-32Eを中心に、USB Type-C給電・書き込み回路、赤外線LED駆動回路、PCBレイアウト、実機での動作確認までをまとめます。
作ったもの
今回作ったのは、スマホやPCのブラウザから家電を操作できるESP32搭載の赤外線スマートリモコンです。
主な機能は以下です。
- ESP32でWi-Fi通信する
- スマートフォンやPCのブラウザから操作する
- 38kHz程度の搬送波で赤外線LEDを駆動する
- USB Type-C経由で給電する
- USB Type-C経由でESP32へ書き込む
- 赤外線受信モジュールを使った学習機能にも拡張できる
全体の構成は次のようなイメージです。
スマートフォン / PC
↓ Wi-Fi
ESP32-WROOM-32E
↓ RMT / GPIO
MOSFET
↓
赤外線LED
↓ 38kHz変調赤外線
エアコン・テレビなどの家電
設計した基板
今回設計した基板の3Dビューです。基板サイズは30mm x 35mmです。
表面にはESP32-WROOM-32E、USB-UART変換IC、USB Type-Cコネクタ、操作用スイッチ、赤外線LEDなどを配置しました。裏面にはLDO、コンデンサ、一部の受動部品を配置しています。
| 表面 | 裏面 |
|---|---|
![]() |
![]() |
小さめの基板にまとめるため、USB Type-Cコネクタ、ON/OFFスイッチ、赤外線LED、受信モジュールは外からアクセスしやすい位置に寄せています。ケースに入れる場合も、コネクタとLEDの向きがそのまま使いやすさに影響するためです。
使用した主な部品
| 部品 | 用途 |
|---|---|
| ESP32-WROOM-32E | メインマイコン。Wi-Fi通信と赤外線送信制御 |
| CH340K | USB-UART変換。PCからESP32へ書き込み |
| USB Type-Cコネクタ | 給電、書き込み用 |
| APD3338 | 5Vから3.3Vを生成するLDO |
| 940nm赤外線LED | 赤外線信号を送信 |
| 赤外線リモコン受信モジュール | リモコン信号の受信用 |
| タクトスイッチ | EN、BOOT操作用 |
| スライドスイッチ | 基板の電源ON/OFF用 |
| 抵抗・コンデンサ | プルアップ、プルダウン、電流制限、電源安定化 |
ESP32-WROOM-32Eを選んだ理由
ESP32-WROOM-32Eを採用した理由は、Wi-Fiを使うIoT機器を作るうえで扱いやすいからです。
- Wi-FiとBluetoothを内蔵している
- Arduino IDEとESP-IDFの両方で開発できる
- GPIOが多く、拡張しやすい
- RMT(Remote Control Transceiver)で赤外線信号を扱いやすい
- 情報量が多く、トラブル時に調べやすい
赤外線リモコン信号は、一般的に38kHz前後の搬送波にデータを乗せて送信します。ESP32にはRMTという周辺機能があるため、CPUで細かいタイミングを作り続けなくても、比較的安定して赤外線波形を出せます。
ピン配置は、使用するモジュールのデータシートとKiCadのフットプリントで照合しました。
回路全体
今回の回路図全体は以下です。
大きく分けると、次のブロックで構成しています。
USB Type-C
├─ 5V入力
├─ CH340K ─ UART ─ ESP32
└─ APD3338 ─ 3.3V ─ ESP32
ESP32 GPIO18
└─ Nch MOSFET(BSS138)
└─ 赤外線LED
ESP32 GPIO27
└─ 赤外線受信モジュール
USB Type-Cから5Vを受け、LDOで3.3Vを生成してESP32に供給します。PCとの書き込み通信はCH340KでUSB-UART変換します。赤外線LEDはESP32のGPIOから直接駆動せず、MOSFETを介して5V側から電流を流す構成にしました。
電源回路
USB Type-Cから5Vを入力し、APD3338で3.3Vを生成してESP32へ供給します。
ESP32はWi-Fi通信時に瞬間的に大きな電流を消費します。そのため、LDOの入力側・出力側・ESP32近くにコンデンサを配置して、電源電圧が落ち込みにくいようにしています。
今回の目安は以下です。
| 配置場所 | 容量の目安 | 目的 |
|---|---|---|
| LDO入力側 | 1uF | USB 5V入力の安定化 |
| LDO出力側 | 1uF | 3.3V出力の安定化 |
| ESP32直近 | 0.1uF | 高周波ノイズ対策 |
| ESP32直近 | 10uF | 瞬間的な電流変動への対応 |
LDOの入出力コンデンサ容量はデータシートを参考にしています。ESP32でWi-Fiを使う場合、電源が弱いと書き込みはできても通信時にリセットすることがあります。
USB Type-Cまわり
USB Type-Cコネクタは、USB 2.0相当の通信と5V給電に使います。PCから見るとデバイス側になるため、CC1/CC2には5.1kΩ程度のプルダウン抵抗を入れる構成にしました。
USBのD+、D-はCH340Kへ接続し、CH340KのUARTをESP32へ接続します。
CH340K TXD → ESP32 RXD0
CH340K RXD ← ESP32 TXD0
ESP32のUARTは3.3Vロジックなので、CH340K側のIO電圧も3.3V系として扱います。
Type-Cコネクタまわりで気を付けた点は以下です。
- CC1/CC2に5.1kΩのプルダウン抵抗を入れる
- D+、D-をCH340Kへ接続する
- D+、D-はなるべく短く引き回す
- シールドはGNDへ落とす
- VBUSから5Vを取り、LDOで3.3Vを作る
ESP32の起動・書き込み回路
ESP32を単体モジュールとして使う場合、ENピンとGPIO0まわりをしっかり処理する必要があります。
今回の基本構成は以下です。
| 信号 | 接続 |
|---|---|
| EN | 10kΩで3.3Vへプルアップ |
| ENスイッチ | ENをGNDへ落とす |
| GPIO0 | 10kΩで3.3Vへプルアップ |
| BOOTスイッチ | GPIO0をGNDへ落とす |
書き込み時は、GPIO0をLowにした状態でESP32をリセットするとブートローダモードに入ります。手動操作の場合は、BOOTを押しながらENを押して離し、その後BOOTを離す流れになります。
自動書き込みに対応させたい場合は、CH340KのDTR/RTSからトランジスタを使ってEN/GPIO0を制御する回路を追加します。今回はまず回路をシンプルにするため、EN/BOOTスイッチで操作する構成にしました。
赤外線送信回路
赤外線LEDはESP32のGPIOから直接駆動せず、Nch MOSFETを使って駆動します。
5V
│
電流制限抵抗
│
赤外線LED
│
MOSFET Drain
MOSFET Source
│
GND
ESP32 GPIO18 → MOSFET Gate
GPIO18からRMTで38kHz搬送波を出し、BSS138をスイッチとして使って赤外線LEDへ電流を流します。MOSFETを挟むことで、ESP32のGPIOに大きな電流を流さずにLEDを駆動できます。
ゲートには10kΩ程度のプルダウン抵抗を入れ、起動直後やリセット中に赤外線LEDが意図せず点灯しにくいようにしています。
赤外線LEDの波長
家電リモコンでは940nm付近の赤外線LEDがよく使われます。今回はそれに合わせて940nmの赤外線LEDを選びました。
赤外線LEDは常時点灯ではなく、38kHzの搬送波でパルス駆動します。そのため平均電流は下がりますが、許容電流はデータシート上のパルス条件に依存します。
赤外線受信モジュール
赤外線受信モジュールは、リモコン信号の学習機能を作るために載せられるようにしています。受信モジュールのOUTはESP32のGPIO27へ接続する想定です。
注意点として、ESP32のGPIOは5Vトレラントではありません。受信モジュールを5Vで動かす場合、OUTのHighレベルが5V近くになる可能性があります。その場合は3.3V駆動できる受信モジュールを使うか、抵抗分圧やレベル変換を入れる必要があります。
GPIO選定
赤外線LEDの制御にはGPIO18を使いました。GPIO18はSPI系の機能にも使われるピンですが、今回の用途ではRMT出力用として使いやすいピンです。
ESP32には起動モードに関わるストラップピンがあり、GPIO0、GPIO2、GPIO12、GPIO15などは回路の組み方によって起動不良の原因になります。赤外線LEDのように外部回路を接続する信号は、起動時の状態に影響しにくいGPIOを選ぶ方が安全です。
今回の主なGPIO割り当ては以下です。
| 用途 | GPIO | 備考 |
|---|---|---|
| 赤外線LED送信 | GPIO18 | RMT出力用 |
| 赤外線受信 | GPIO27 | 学習機能用 |
| UART TXD0 | GPIO1 | CH340K RXDへ |
| UART RXD0 | GPIO3 | CH340K TXDから |
| BOOT | GPIO0 | 書き込み時にLow |
PCB設計で気を付けたこと
今回のPCBレイアウトは以下です。
ESP32を使う基板では、回路図だけでなくPCBレイアウトも重要です。
特に気を付けた点は以下です。
- ESP32のアンテナ下に銅箔を置かない
- アンテナ付近に部品や配線を密集させない
- LDOの入力・出力コンデンサをICの近くに置く
- ESP32近くにデカップリングコンデンサを置く
- USB D+、D-はできるだけ短く引く
- 赤外線LEDの電流経路は細くしすぎない
- GNDプレーンを広く取る
- EN/BOOTスイッチを操作しやすい位置に置く
ESP32のアンテナ部分は特に重要で、ここにGNDベタや信号線を置くと通信距離や安定性に影響が出る可能性があります。基板上でもアンテナの前方はできるだけ空けるようにしました。
ソフトウェア実装
ソフトウェア側では、スマホやPCから操作できるWeb画面を用意し、ボタン操作に応じてESP32から赤外線信号を送信する構成にしました。
赤外線送信部分は、ESP32のRMTを使って次のような流れで動作します。
スマホ / PC
↓
Wi-Fi経由でコマンド送信
↓
ESP32が受信
↓
RMTで赤外線波形を生成
↓
GPIO18からMOSFETを駆動
↓
赤外線LEDから送信
リモコン信号の形式は家電メーカーや機種によって異なるため、まずは既知の赤外線コードを登録し、スマホの画面から送信できるようにしました。
(コードのベースはChatGPTを活用して生成し、適宜調整を行いました)
押したボタンに対応する赤外線コードをESP32から送信するようにしました。スマホから操作できるので、リモコンを探さずに家電を操作できます。
実装と動作確認
基板を実装したあと、以下の項目を確認しました。
| 確認項目 | 結果 |
|---|---|
| USB Type-Cからの給電 | ESP32が起動することを確認 |
| USB-UART経由の書き込み | PCからESP32へ書き込めることを確認 |
| Wi-Fi接続 | スマホ/PCから操作画面へアクセスできることを確認 |
| 赤外線送信 | GPIO18からRMTで赤外線送信できることを確認 |
| 家電操作 | スマホ操作から実際の家電が反応することを確認 |
実装している基板はver.1で、受信モジュールは搭載されていません。
検証では、単にLEDが点灯するかだけでなく、スマホから操作したときに実際の家電が反応するところまで確認しました。これにより、回路、ファームウェア、Web操作画面、赤外線送信の一連の流れが動いていることを確認できました。
今後やりたいこと
今回の基板で基本的な送信動作は確認できたので、今後は次のような改善を進めたいです。
- 複数メーカー、複数家電の赤外線コードをWeb上で登録できるようにする
- 赤外線受信モジュールを搭載したものを実装する
- スマホ操作画面を使いやすくする
- ケースを設計して実用品に近づける
まとめ
ESP32-WROOM-32E、USB-UART、3.3V電源、MOSFETによる赤外線LED駆動回路を組み合わせて、スマートリモコン用の基板を設計・実装しました。
設計だけで終わらせず、基板実装、ファームウェア実装、スマホからの操作、家電の動作確認まで一通り確認できました。
参考






