概要
ESP32はEspressif Systems(上海)が開発したWi-FiとBluetoothを内蔵する低コストのマイコンです。2016年に量産を開始し、IoTデバイスのプロトタイプから量産製品まで世界中で圧倒的なシェアを誇ります。
デュアルコアのXtensa LX6プロセッサ(最大240MHz)・Wi-Fi(802.11 b/g/n)・Bluetooth Classic / BLE 4.2を1チップに統合し、わずか数百円〜千円程度の価格で入手できます。豊富な開発環境(ESP-IDF・Arduino・MicroPython・CircuitPython)とコミュニティが揃い、電子工作から産業用IoT機器まで幅広く採用されています。
ESP8266の後継として設計され、処理能力・ペリフェラル数・Bluetooth対応などで大幅に強化されています。FreeRTOSが標準で動作し、Wi-Fi接続・MQTT通信・OTA更新などの機能がフレームワークとして提供されます。
歴史・背景
ESP32の前身であるESP8266は2014年に登場し、Wi-Fi内蔵の超低価格マイコンとして世界中のメーカーズコミュニティに広まりました。しかしシングルコア・ペリフェラルの少なさ・Bluetooth非対応という制約がありました。
2016年にEspressifはESP32を発表。デュアルコア化・Bluetooth追加・多数のペリフェラル追加・セキュリティ強化を実現しました。2019年にはESP32-S2(シングルコア・USB対応)、2020年にはESP32-S3(AI命令拡張・USB OTG)、2021年にはESP32-C3(RISC-V・Wi-Fi+BLE)が登場し、ファミリーが拡大しています。
2023年時点でESP32シリーズの累計出荷数は10億個を超え、IoT分野で最も普及したマイコンの一つとなっています。
技術仕様
チップファミリー比較
| チップ | CPU | コア数 | Wi-Fi | BT | 特徴 |
|---|---|---|---|---|---|
| ESP32 | Xtensa LX6 | 2 | b/g/n | BT4.2 + BLE | オリジナル、汎用 |
| ESP32-S2 | Xtensa LX7 | 1 | b/g/n | なし | USB OTG、セキュリティ |
| ESP32-S3 | Xtensa LX7 | 2 | b/g/n | BLE5.0 | AI拡張、USB OTG |
| ESP32-C3 | RISC-V | 1 | b/g/n | BLE5.0 | 低コスト、小型 |
| ESP32-C6 | RISC-V | 1 | b/g/n/ax(Wi-Fi6) | BLE5.0 | Wi-Fi 6 + Zigbee/Thread |
| ESP32-H2 | RISC-V | 1 | なし | BLE5.2 | Zigbee/Thread専用 |
ESP32(オリジナル)の主要スペック
| 項目 | 値 |
|---|---|
| CPU | Xtensa LX6 デュアルコア(最大240MHz) |
| ROM | 448KB |
| SRAM | 520KB(データ用320KB + 命令用128KB + RTC 8KB) |
| Flash | 外付け4〜16MB(SPI接続) |
| Wi-Fi | 802.11 b/g/n 2.4GHz(最大150Mbps) |
| Bluetooth | Classic BT 4.2 + BLE 4.2 |
| GPIO | 34本 |
| ADC | 18ch(12bit、1V基準) |
| DAC | 2ch(8bit) |
| UART | 3本 |
| SPI | 4本 |
| I2C | 2本 |
| I2S | 2本 |
| PWM | 16ch |
| タッチセンサー | 10ch(静電容量式) |
| ホールセンサー | 1ch |
| 温度センサー | 内蔵 |
| 動作電圧 | 3.0〜3.6V |
| 消費電流 | アクティブ(Wi-Fi送信)160〜260mA、Deepsleep 10µA |
Wi-Fi仕様詳細
| 項目 | 値 |
|---|---|
| 規格 | IEEE 802.11 b/g/n |
| 周波数 | 2.4GHz |
| 変調 | DSSS(802.11b)、OFDM(802.11g/n) |
| 最大速度 | 150Mbps(802.11n HT40) |
| セキュリティ | WPA/WPA2 Personal/Enterprise |
| ネットワークモード | Station / AP / Station+AP 同時 |
| TCP/IP | LwIPスタック内蔵 |
Bluetooth仕様
| 項目 | 値 |
|---|---|
| Classic BT | Bluetooth 4.2、A2DP・AVRCP・HFP・HID対応 |
| BLE | Bluetooth 4.2 Low Energy |
| GATT | サーバー・クライアント両対応 |
| BLE広告 | ADV_IND・ADV_DIRECT・ADV_NONCONN・ADV_SCAN |
| 接続数 | 最大同時9接続(BLE) |
動作原理
ESP32はデュアルコア非対称マルチプロセッシング構成で動作します:
- PRO_CPU(コア0): Wi-Fi・Bluetoothプロトコルスタックを専有
- APP_CPU(コア1): ユーザーアプリケーションを実行
FreeRTOSが標準OSとして動作し、タスク・セマフォ・キューなどのRTOS機能が使えます:
// ESP-IDF FreeRTOSによるタスク生成例
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define LED_GPIO GPIO_NUM_2
void led_task(void *pvParameter) {
gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
while(1) {
gpio_set_level(LED_GPIO, 1);
vTaskDelay(pdMS_TO_TICKS(500));
gpio_set_level(LED_GPIO, 0);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void app_main(void) {
xTaskCreate(led_task, "led_task", 2048, NULL, 5, NULL);
}
Wi-Fi接続は内蔵のevent loopとWi-Fiドライバーで管理します:
// Wi-Fi Station接続の例(ESP-IDF)
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
void app_main(void) {
nvs_flash_init();
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
wifi_config_t wifi_config = {
.sta = {
.ssid = "MySSID",
.password = "MyPassword",
},
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
esp_wifi_start();
esp_wifi_connect();
}
用途・ユースケース
ESP32が採用される主な用途:
- IoTセンサーノード: 温湿度・CO2・照度センサーとWi-Fi/BLEを組み合わせたデータ収集端末
- スマートホームデバイス: スイッチ・調光器・スマートプラグ(Matter / Zigbee対応はESP32-C6)
- ウェアラブル: BLE搭載の活動量計・ヘルスモニター
- 産業用センサー: 工場内の振動・温度監視ノード
- 電子楽器・音声処理: I2S経由でDAC/DACと接続した音声処理
- OTAゲートウェイ: UART/SPI接続のメインMCUのOTA更新仲介
- BLEビーコン: BLEアドバタイズによるロケーション検出・資産管理
実装・開発のポイント
開発環境の選択
| 環境 | 言語 | 特徴 |
|---|---|---|
| ESP-IDF | C/C++ | 公式SDK。全機能を利用可能 |
| Arduino-ESP32 | C/C++ | Arduino APIで手軽に開発 |
| MicroPython | Python | REPL・インタラクティブ開発 |
| CircuitPython | Python | Adafruitのライブラリエコシステム |
| PlatformIO | C/C++ | IDE非依存のビルドシステム |
OTA(Over The Air)更新
ESP-IDFのOTAは2つのOTAパーティションを交互に使う設計です:
パーティションテーブル:
┌──────────────┬──────────────┬──────────────┐
│ factory │ ota_0 │ ota_1 │
│ (初期FW) │ (現行FW) │ (更新先) │
└──────────────┴──────────────┴──────────────┘
// OTAアップデートの実行例
#include "esp_ota_ops.h"
#include "esp_https_ota.h"
esp_err_t do_ota_update(const char *url) {
esp_https_ota_config_t config = {
.ota_config = {
.http_config = {
.url = url,
.cert_pem = server_cert,
},
},
};
return esp_https_ota(&config);
}
Deep Sleep と消費電力
IoT電池駆動デバイスではDeep Sleep(10µA以下)が重要です:
// 60秒ごとにDeep Sleepから復帰してデータ送信する例
#include "esp_sleep.h"
void app_main(void) {
// センサー読み取り・データ送信処理
read_sensor_and_send();
// 60秒後にウェイクアップするタイマーを設定してDeep Sleep
esp_sleep_enable_timer_wakeup(60 * 1000000ULL); // マイクロ秒
esp_deep_sleep_start();
}
他技術との比較
ESP32 vs STM32
| 項目 | ESP32 | STM32 |
|---|---|---|
| Wi-Fi/BT | 内蔵 | 外付け必要 |
| リアルタイム性 | 中(Wi-FIスタックとコア競合) | 高い(専用コア) |
| 消費電力 | 中(Wi-Fi使用時) | 低い |
| 価格 | 安い(200〜500円) | 中程度(200〜2000円) |
| 産業サポート | 限定的 | 充実(長期供給保証) |
| 開発環境 | ESP-IDF / Arduino | STM32CubeIDE / Keil / IAR |
ESP32 vs Arduino
ArduinoはATmega328などの単純なMCUボードであり、Wi-Fi・Bluetoothは外付けが必要です。ESP32はArduino IDEで開発できますが、処理能力・無線機能・ペリフェラル数で大幅に優れています。