ESP32とは?特長、Arduino IDEのセットアップ、初めてのWi-Fiプロジェクト
ESP32とは何で、Arduinoとどう違うのか。Wi-FiとBluetooth、安全なピン、Arduino IDEのセットアップ、最初のBlinkスケッチ、Wi-Fiへの接続、スマホからのLED制御、ESP32の種類、よくあるミスを解説します。
ESP32は、Espressif社が作る、Wi-FiとBluetoothを内蔵したとても安価なデュアルコアのマイコンです。これ1つで、Arduino Unoにはできない多くのことができます。家のネットワークにつながる、スマホで開けるWebページを配信する、インターネットから時刻や天気を取得する、Bluetoothでスマホと通信する、といったことです。しかも、すでに知っているArduinoの命令を使い、Arduino IDEでプログラムできます。今では、IoT(モノのインターネット)のプロジェクトを始めるのにいちばん人気のボードです。

ESP32とは?何に使われる?
厳密にいうと、「ESP32」は金属カバーの下にあるチップの名前です。手にしているボードは、そのチップを載せた開発ボード(ESP32 DevKitやNodeMCU-32Sなど)です。パソコンと通信するためのUSBシリアル変換チップ、5 Vを3.3 Vに下げるレギュレーター、リセット(EN)ボタンと書き込み(BOOT)ボタンが付いています。ESP32でできることの例を挙げます。
- Wi-Fi気象観測所:スマホで開くページに温度と湿度を表示します。
- スマホから操作:Webページのボタンでランプ、コンセント、ドアを操作します。
- インターネットからデータを取得:正確な時刻(NTP)、天気、為替レートをディスプレイに表示します。
- 通知を送る:動きを検知したらTelegramやメールで知らせます。
- Bluetooth機器:スマホとペアリングするリモコンや、パソコンにキーボードとして認識される機器を作ります。
- 電池で何か月も動くセンサー:測定するときだけディープスリープから目覚めます。
ESP32とArduino Unoの比較
| 項目 | Arduino Uno R3 | ESP32(WROOM-32) |
|---|---|---|
| プロセッサ | ATmega328P、8ビット、16 MHz | Xtensa LX6、デュアルコア、32ビット、240 MHz |
| RAM | 2 KB | 520 KB |
| プログラムメモリ(フラッシュ) | 32 KB | 通常4 MB |
| 無線 | なし | Wi-Fi + Bluetooth(ClassicとBLE) |
| 動作電圧 | 5 V | 3.3 V |
| 使えるGPIO | 20 | 約34(一部は入力専用) |
| アナログ入力(ADC) | 6チャンネル、10ビット | 18チャンネル、12ビット |
| アナログ出力(DAC) | なし | 2チャンネル、8ビット |
この表を見ると、ESP32はあらゆる点で優れているように見えますが、Unoにも利点があります。5 Vで動くので古いセンサーやモジュールの多くとそのまま使え、ピンも丈夫で、初心者が戸惑うことも少ないのです。無線が不要なら、Unoは今でもすばらしい出発点です。どちらを選ぶか迷ったらどのArduinoを買えばいい?を見てみてください。
ESP32のピン:安全に使えるのはどれ?
ESP32のピンは、Arduinoのようにすべてが「同じ」ではありません。フラッシュメモリにつながっているもの、入力としてしか使えないもの、レベルによってボードの起動に影響するものがあります。お使いのボードの完全なピンマップはピン配置ツールで見られます。まとめは次のとおりです。
| ピン | 状態 | メモ |
|---|---|---|
| GPIO 6〜11 | 使わない | 内部のフラッシュにつながっていて、使うとボードがクラッシュする |
| GPIO 34〜39 | 入力専用 | 出力できず、内部プルアップもない |
| GPIO 0、2、12、15 | 注意して使う | 起動時のレベルが重要 |
| GPIO 1と3 | 注意して使う | USBシリアル接続のTXとRX |
| ADC2のピン(0、2、4、12〜15、25〜27) | Wi-Fiがオンの間はアナログ読み取り不可 | アナログの読み取りにはADC1(GPIO 32〜39)を使う |
| GPIO 4、5、13、14、16〜19、21〜23、25〜27、32、33 | 安全 | 汎用の入出力 |
Arduino IDEでESP32をセットアップする
- Arduino IDEで「ファイル」>「基本設定」を開き、「追加のボードマネージャのURL」の欄にhttps://espressif.github.io/arduino-esp32/package_esp32_index.jsonを追加します。
- ボードマネージャでesp32を検索し、Espressif Systemsのパッケージをインストールします。
- 「ツール」>「ボード」でESP32 Dev Moduleを選びます。
- ESP32をUSBケーブルでつなぎ、「ツール」>「ポート」で正しいポートを選びます。ポートが表示されない場合は、ボードのUSBシリアル変換チップ(CP2102またはCH340)のドライバをインストールしてください。
- 書き込み中に「Connecting...」が長く表示されたままなら、ボードのBOOTボタンを押し続け、書き込みが始まったら離します。
最初のプログラム:内蔵LEDを点滅させる
ほとんどのESP32 DevKitボードには、GPIO 2につながった青いLEDがあります。下のコードはそれを0.5秒ごとに点滅させます。見てのとおり、命令はArduinoとまったく同じです。
1const int LED_PIN = 2; // çoğu DevKit'te dahili mavi LED / onboard blue LED on most DevKits
2
3void setup() {
4 pinMode(LED_PIN, OUTPUT);
5}
6
7void loop() {
8 digitalWrite(LED_PIN, HIGH);
9 delay(500);
10 digitalWrite(LED_PIN, LOW);
11 delay(500);
12}Wi-Fiにつなぐ
ESP32の本当の強みはWi-Fiです。下のコードは家のネットワークに接続し、ルーターがESP32に割り当てたIPアドレスをシリアルモニタに表示します。ネットワーク名とパスワードを自分のものに書き換え、115200ボーでシリアルモニタを開いてください。
1#include <WiFi.h>
2
3const char* ssid = "AgAdi"; // Wi-Fi adın / your Wi-Fi name
4const char* password = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
5
6void setup() {
7 Serial.begin(115200);
8 WiFi.begin(ssid, password);
9 Serial.print("Bağlanıyor / connecting");
10 while (WiFi.status() != WL_CONNECTED) {
11 delay(500);
12 Serial.print(".");
13 }
14 Serial.println();
15 Serial.print("IP adresi / IP address: ");
16 Serial.println(WiFi.localIP());
17}
18
19void loop() {
20}スマホからLEDを操作する:シンプルなWebサーバー
次に、ESP32を小さなWebサーバーにしてみましょう。書き込んだら、同じWi-Fiにつながったスマホのブラウザで、シリアルモニタに表示されたIPアドレスを開きます。ページの2つのボタンでボードのLEDをオン・オフできます。LEDの代わりにリレーをつなげば、同じ方法で本物のランプを操作できます。リレーモジュールとは?を参照してください。
1#include <WiFi.h>
2#include <WebServer.h>
3
4const char* ssid = "AgAdi";
5const char* password = "Sifre123";
6const int LED_PIN = 2;
7
8WebServer server(80);
9
10void handleRoot() {
11 server.send(200, "text/html",
12 "<meta name='viewport' content='width=device-width'>"
13 "<h1>ESP32</h1>"
14 "<a href='/on'><button>LED AÇ / ON</button></a> "
15 "<a href='/off'><button>LED KAPAT / OFF</button></a>");
16}
17
18void setup() {
19 pinMode(LED_PIN, OUTPUT);
20 Serial.begin(115200);
21 WiFi.begin(ssid, password);
22 while (WiFi.status() != WL_CONNECTED) delay(500);
23 Serial.println(WiFi.localIP()); // bu adresi telefonda aç / open this address on your phone
24
25 server.on("/", handleRoot);
26 server.on("/on", []() { digitalWrite(LED_PIN, HIGH); handleRoot(); });
27 server.on("/off", []() { digitalWrite(LED_PIN, LOW); handleRoot(); });
28 server.begin();
29}
30
31void loop() {
32 server.handleClient();
33}ESP32の種類:どれを買えばいい?
| モデル | 主な特長 | 選ぶ場面 |
|---|---|---|
| ESP32(WROOM-32 DevKit) | Wi-Fi、Bluetooth ClassicとBLE、デュアルコア | 汎用の最初のボード |
| ESP32-S3 | ネイティブUSB、より多くのRAM、AI向け命令 | カメラ、音声、USBキーボードやマウスのプロジェクト |
| ESP32-C3 | シングルコアのRISC-V、Wi-FiとBLE、小型で安価 | シンプルなIoTセンサー |
| ESP32-CAM | カメラとmicroSDスロット | 映像の配信、防犯カメラ |
| ESP8266(NodeMCU、Wemos D1) | 旧型、シングルコア、Wi-Fiのみ | ごくシンプルなWi-Fiプロジェクト |
電源と電池での動作
Wi-Fiをオンにすると、ESP32は一瞬で最大250 mAを消費することがあります。弱いUSBポートや細いケーブルがこの急な負荷に耐えられないと、ボードは「Brownout detector was triggered」というメッセージとともに再起動します。質のよいケーブルと、少なくとも1 Aを供給できる5 Vアダプターを使い、必要なら3V3とGNDの間に100〜470 µFのコンデンサを入れてください。電池で動かすプロジェクトでは、ESP32のディープスリープモードでチップの消費電流をマイクロアンペアまで下げられます。ただし、開発ボードのレギュレーターやLEDは数mAを消費し続けるので、電池を長く持たせたいなら、モジュール単体か低消費電力のボードが好まれます。
MicroPythonでESP32を使う
ESP32はArduinoの言語だけでなく、MicroPythonでもプログラムできます。ThonnyでボードにMicroPythonを書き込めば、Wi-Fiへの接続は数行で済みます。
1import network, time
2from machine import Pin
3
4led = Pin(2, Pin.OUT)
5wlan = network.WLAN(network.STA_IF)
6wlan.active(True)
7wlan.connect("AgAdi", "Sifre123") # Wi-Fi adı ve şifresi / Wi-Fi name and password
8
9while not wlan.isconnected():
10 time.sleep(0.5)
11print("IP:", wlan.ifconfig()[0])
12
13while True:
14 led.value(not led.value()) # LED'i yakıp söndür / toggle the LED
15 time.sleep(0.5)ESP32のプロジェクトアイデア
- Wi-Fi気象観測所:DHT11で測った温度と湿度をスマホで確認します。
- スマートコンセント:Webページや音声アシスタントから、リレーでランプを点けます。
- 動きのアラーム:PIRセンサーが人を検知したらTelegramで通知を送ります。
- インターネット時計:NTPサーバーから時刻を取得し、LCDや7セグメントディスプレイに表示します。
- Bluetoothリモコン:スマホのアプリでロボットカーを動かします。
- 電池にやさしいセンサー:10分ごとに目覚めて測定値を送り、また眠る機器を作ります。
よくあるミスと直し方
- ポートが表示されない:ケーブルが充電専用か、USBシリアル変換のドライバがインストールされていない可能性があります。データ通信用のケーブルを使い、CP2102かCH340のドライバをインストールしてください。
- 「Failed to connect... Timed out waiting for packet header」:書き込みが始まるときにBOOTボタンを押し続けてください。
- ボードが再起動を繰り返す:電力不足(ブラウンアウト)です。よりよいケーブル、アダプター、コンデンサを使ってください。
- Wi-Fiにつながらない:ネットワークが5 GHzか、名前やパスワードの大文字・小文字が違っている可能性があります。
- GPIO 6〜11を使っている:これらのピンはフラッシュにつながっていて、使うとボードがクラッシュします。
- Wi-Fiが始まるとアナログ値がおかしくなる:センサーがADC2のピンにつながっています。GPIO 32〜39のADC1のピンに移してください。
ESP32は、Arduinoで学んだことをインターネットへ広げるいちばん簡単な方法です。Arduinoの基本をおさらいするならArduinoとは?を見てください。BlueGraysアプリには、LED、Webサーバー、WebSocket、NTP時計、天気データ、Telegramアラームなど、ESP32のプロジェクトが回路図とコード付きで数十個載っています。
よくある質問
ESP32はArduinoですか?
いいえ。ESP32はEspressif社が作る独立したマイコンで、Arduinoはボードとソフトウェアのエコシステムの名前です。ただし、Espressifが提供するパッケージのおかげで、ESP32はArduino IDEとArduinoの命令でプログラムでき、Arduinoのコードの多くは少し手を加えるだけでESP32でも動きます。
ESP32は5 Vで動きますか?
開発ボードは、USBやVINピンから5 Vで給電でき、基板上のレギュレーターが3.3 Vに下げます。しかし、GPIOピンは3.3 Vで動き、5 Vには耐えられないので、5 Vの信号を直接つないではいけません。
ESP32とArduino Uno、どちらを買うべきですか?
Wi-Fi、Bluetooth、インターネットが必要なプロジェクトならESP32を選びましょう。電子工作が初めてで、5 Vのセンサーやモジュールをスムーズに使い、チュートリアルどおりに進めたいなら、Arduino Unoのほうが戸惑うことが少なく始められます。
ESP32は5 GHzのWi-Fiにつながりますか?
初代ESP32、ESP32-S3、ESP32-C3は2.4 GHzのWi-Fiにしか対応しておらず、5 GHzのネットワークは見えません。ルーターの2.4 GHz帯がオンになっていることを確認してください。
ESP32とESP8266の違いは何ですか?
ESP8266は、Wi-Fiだけに対応し、アナログ入力が1つしかない、古いシングルコアのチップです。ESP32はデュアルコアでより速く、Bluetoothにも対応し、ピン、ADCチャンネル、メモリもずっと多くあります。新しいプロジェクトにはESP32が好まれます。
ESP32はインターネットなしでも使えますか?
はい。ESP32は自分でWi-Fiネットワークを作れます(アクセスポイントモード)。ESP-NOWを使えば、複数のESP32がルーターなしで互いに通信でき、Bluetoothでスマホとつながることもできます。無線機能をまったく使わず、高性能なArduinoとして使うこともできます。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
ESP32でLEDを点滅
ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

ESP32 Wi-Fi STA接続(LCDディスプレイ付き)
このプロジェクトでは、ESP32をステーション(STA)モードで家庭のWi-Fiネットワークに接続し、安全で障害に強い接続を実現します。SSIDとパスワードを別のsecrets.hファイルに保存してGitへの流出を防ぎ、自動再接続の仕組みを実装します。RSSIによる信号強度とIPアドレスはI2C LCDディスプレイに表示します。内蔵LEDは状態表示に使います。実運用を想定した接続管理の仕組みです。

ESP32非同期Webサーバー(LCDにIPアドレスを表示)
このプロジェクトでは、ESP32を同じWi-Fiネットワーク上のスマートフォンやパソコンから操作できる非同期Webサーバーにします。ESPAsyncWebServerライブラリを使うと、従来のWebServer.hのように1つのリクエストで処理がブロックされず、複数のリクエストを同時に処理できます。ブラウザーでESP32のIPアドレスを開き、ON/OFFボタン(/onと/offのルート)を押すと、GPIO 5に接続したLEDを点灯・消灯できます。

ESP32 WebSocketカウンター(2つのボタン+LCD+Webリアルタイム表示)
このプロジェクトでは、ESP32に接続した2つのボタンでカウンターの値を変更します(GPIO 5で増加、GPIO 4で減少)。値は16x2 I2C LCDに即座に反映され、ESPAsyncWebServerのWebSocket機能により、接続中のすべてのブラウザーでもページを再読み込みせずに更新されます。HTTPポーリングの代わりに1つの接続を維持し、ESP32がws.textAll()で新しい値を全員に送信します。

ESP32 HTTPClient+天気API(LCD付き)
このプロジェクトでは、ESP32でHTTPClient.hを使い、インターネット経由で天気API(wttr.in)をREST APIとして呼び出します。返されたJSONレスポンスをArduinoJson v7で解析し、都市名、気温、湿度、天気、風の情報をI2C LCDディスプレイにトルコ語と英語で表示します。wttr.inは無料で、APIキーも不要です。都市名を入力するだけで、その都市の現在の天気を取得できます。30分ごとに自動更新し、表示画面ごとに異なるLEDの光り方で状態を知らせます。

ESP32とNTPでインターネットから正確な時刻を取得
ESP32をWi-Fiに接続し、NTP(Network Time Protocol)サーバーからミリ秒精度の現在時刻を取得します。configTzTime()関数でタイムゾーンを自動適用し、夏時間を採用する国ではPOSIX TZ文字列で夏時間と標準時間の切り替えも自動管理します。時刻はシリアルモニタと、必要に応じて接続するI2C LCDに表示します。configTzTime()がSNTPサービスを開始し、ネットワークにアクセスできる間は定期的に再同期します。

ESP32 PIR人感センサーによる自動照明
このプロジェクトでは、HC-SR501 PIR人感センサーで部屋に入った人を検知し、LEDを自動で点灯させます。millis()で点灯時間を管理します。センサーの値がHIGHの間は最後に動きを検知した時刻を更新し、最後にHIGHを読み取ってから少なくとも10秒後にLEDを消灯します。現在のコードは各ループでdelay(50)により50 ms待機するため、完全にノンブロッキングではありません。階段や廊下、浴室、戸棚内の照明などに応用できます。

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
PIRセンサーが動きを検知するとブザーとLEDを作動させ、同時にTelegramで持ち主に即座に通知するスマート防犯アラームです。アラームが繰り返される頻度を抑えるため、30秒のクールダウン(待ち時間)を設けています。この仕組みはPIRの検知が正しいかを確認したり、誤検知をなくしたりするものではありません。家の防犯、ガレージの監視、倉庫や作業部屋などに使えます。ESP32-CAMなら写真付きの通知を追加でき、通常のESP32 DevKit V1ではテキストで通知します。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

