2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP32-WROOM-32Eでスマート家電リモコンを作ってみた

2
Last updated at Posted at 2026-07-13

裏表.png

はじめに

こんにちは!株式会社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、コンデンサ、一部の受動部品を配置しています。

表面 裏面
3D表.png 3D裏.png

小さめの基板にまとめるため、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のフットプリントで照合しました。

回路全体

今回の回路図全体は以下です。

回路図.png

大きく分けると、次のブロックで構成しています。

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レイアウトは以下です。

基板図.png

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を活用して生成し、適宜調整を行いました)

スマホ画面.jpeg

押したボタンに対応する赤外線コードをESP32から送信するようにしました。スマホから操作できるので、リモコンを探さずに家電を操作できます。

実装と動作確認

基板を実装したあと、以下の項目を確認しました。

確認項目 結果
USB Type-Cからの給電 ESP32が起動することを確認
USB-UART経由の書き込み PCからESP32へ書き込めることを確認
Wi-Fi接続 スマホ/PCから操作画面へアクセスできることを確認
赤外線送信 GPIO18からRMTで赤外線送信できることを確認
家電操作 スマホ操作から実際の家電が反応することを確認

基板.jpeg

実装している基板はver.1で、受信モジュールは搭載されていません。

検証では、単にLEDが点灯するかだけでなく、スマホから操作したときに実際の家電が反応するところまで確認しました。これにより、回路、ファームウェア、Web操作画面、赤外線送信の一連の流れが動いていることを確認できました。

今後やりたいこと

今回の基板で基本的な送信動作は確認できたので、今後は次のような改善を進めたいです。

  • 複数メーカー、複数家電の赤外線コードをWeb上で登録できるようにする
  • 赤外線受信モジュールを搭載したものを実装する
  • スマホ操作画面を使いやすくする
  • ケースを設計して実用品に近づける

まとめ

ESP32-WROOM-32E、USB-UART、3.3V電源、MOSFETによる赤外線LED駆動回路を組み合わせて、スマートリモコン用の基板を設計・実装しました。

設計だけで終わらせず、基板実装、ファームウェア実装、スマホからの操作、家電の動作確認まで一通り確認できました。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?