電子工作やマイコン開発を始めるとき、
「ESP32とArduino UNOは何が違う?」
「初心者ならどちらを選べばいい?」
「Arduino UNOからESP32へ移行するメリットは?」
と迷うことがあります。
どちらもArduino IDEから開発できるため似たようなマイコンボードに見えますが、中身は大きく異なります。
ESP32はWi-FiやBluetoothを内蔵し、高い処理性能と大容量メモリを持っています。
一方、Arduino UNO R3は8bit AVRマイコンを搭載したシンプルな構成で、5V系の電子工作でも扱いやすいボードです。
単純にスペックだけを比較するとESP32が圧倒的に高性能ですが、
高性能だからESP32を選べばよい
とは限りません。
この記事ではESP32とArduino UNO R3について、
CPU性能
メモリ容量
GPIO
3.3Vと5Vの違い
Wi-Fi・Bluetooth
ADCやPWM
開発環境
どちらを選べばよいか
を比較します。
さらに、Arduino UNOからESP32へ移行するときに注意したいポイントも、回路設計とFirmwareの両面から解説します。
この記事ではArduino UNO R3と比較する
最初に比較対象を明確にしておきます。
この記事で「Arduino UNO」と表記する場合、基本的にはArduino UNO R3を指します。
UNO R3はATmega328Pを搭載した、長く使われているArduinoの代表的なボードです。
現在はUNO R4 MinimaやUNO R4 WiFiも販売されていますが、UNO R4ではMCUがRenesas RA4M1へ変更され、32bit ARM Cortex-M4となっています。
そのため、
UNO R3
ATmega328P
8bit AVR
16MHz
に対して、
UNO R4
RA4M1
32bit Cortex-M4
48MHz
と、内部構成は大きく異なります。
Arduino公式によるとUNO R4 MinimaはFlash 256KB、SRAM 32KBを搭載しながら、UNO R3との互換性を意識して5V動作を維持しています。
したがって、
Arduino UNOはすべて8bit・16MHz
というわけではありません。
今回はESP32との違いが分かりやすく、広く使われてきたUNO R3を主な比較対象とします。
ESP32とArduino UNO R3の違いを比較
まず代表的な仕様を比較してみます。
| 項目 | Arduino UNO R3 | ESP32 |
|---|---|---|
| MCU | ATmega328P | ESP32 |
| CPU | 8bit AVR | 32bit Xtensa LX6 |
| CPU Clock | 16MHz | 最大240MHz |
| Core | Single Core | Dual Core |
| SRAM | 2KB | 520KB |
| Flash | 32KB | Moduleに数MB搭載 |
| I/O電圧 | 5V系 | 3.3V系 |
| Wi-Fi | なし | 2.4GHz Wi-Fi |
| Bluetooth | なし | Bluetooth Classic / BLE |
| EEPROM | 1KB | 専用EEPROMなし |
| ADC | 6ch | 複数ch |
| 開発環境 | Arduino IDEなど | Arduino / PlatformIO / ESP-IDFなど |
Arduino UNO R3はATmega328Pを搭載し、16MHzで動作します。Flash Memoryは32KB、SRAMは2KB、EEPROMは1KBです。
一方、従来ESP32ではXtensa LX6 Dual Core CPUを搭載し、最大240MHzで動作します。内部SRAMは520KBあり、ESP32-WROOM-32Eでは数MBのSPI Flashを搭載したModuleが用意されています。
数字だけを見ると、かなり大きな差があります。
CPU性能はESP32が圧倒的に高い
Arduino UNO R3のATmega328Pは、8bit AVR CPUを16MHzで動作させます。
一方ESP32は32bit CPUで、従来ESP32では最大240MHzのDual Core構成です。
単純なClockだけでも、
Arduino UNO R3
16MHz
ESP32
最大240MHz
と大きな違いがあります。
もちろんCPU性能はClock周波数だけで決まるものではありません。
CPU Architectureも異なるため、
240 ÷ 16 = 15
だから「ESP32はUNOの15倍速い」と単純に比較することはできません。
それでも、
- 通信処理
- 複数Task
- Display制御
- JSON処理
- Web Server
- 暗号化通信
- Wi-Fi
- Bluetooth
など、多くの処理を同時に行う用途ではESP32の処理能力が有利です。
メモリ容量は大きく違う
個人的には、CPU Clock以上に実際のFirmware開発で差を感じやすいのがRAM容量です。
Arduino UNO R3のSRAMは、
2KB
です。
ESP32は、
520KB SRAM
を搭載しています。
UNO R3では2KBしかないため、大きな配列や文字列Bufferを使用すると、すぐにRAM容量を意識する必要があります。
たとえば、
char buffer[1024];
だけでも1KBです。
UNO R3ではSRAM全体の半分に相当します。
一方ESP32では、より大きなBufferを扱えるため、
HTTP
JSON
Wi-Fi
BLE
Display
File System
などを組み合わせたApplicationを作りやすくなります。
ただし、
ESP32ならRAMを気にしなくてよい
という意味ではありません。
Wi-FiやBluetooth Stackなどもメモリを使用するため、大規模なFirmwareではESP32でもHeapやStackの管理が必要です。
ESP32にはWi-FiとBluetoothがある
ESP32を選ぶ大きな理由の一つが無線通信です。
従来ESP32には、
2.4GHz Wi-Fi
Bluetooth Classic
Bluetooth Low Energy(BLE)
が内蔵されています。
Arduino UNO R3にはWi-FiやBluetooth機能はありません。
そのためUNO R3で無線通信を行う場合は、
Arduino UNO
│
Wi-Fi Module
など、外部Moduleを追加する必要があります。
ESP32なら、
ESP32
├─ MCU
├─ Wi-Fi
└─ Bluetooth
が一つのSoCに統合されています。
スマートフォン連携やCloud通信、IoT機器などではESP32を選ぶ大きなメリットになります。
ESP32は3.3V、Arduino UNO R3は5V
ここはArduino UNOからESP32へ移行するときに特に注意したいポイントです。
Arduino UNO R3は5V系のボードです。
そのため5Vで動作するSensorやModuleを接続して使った経験がある人も多いでしょう。
一方、ESP32は基本的に3.3V系です。
ESP32-WROOM-32Eの推奨電源条件は3.0~3.6Vです。
したがって、
Arduino UNOで使えた
↓
ESP32でも同じように接続
とは考えない方がよいでしょう。
特に外部回路からGPIOへ入力される信号電圧には注意が必要です。
5V信号をESP32 GPIOへそのまま入れない
たとえばUNO R3で、
5V Sensor
│
└── Signal → Arduino UNO
としていた回路があるとします。
ESP32へ変更するときに、
5V Sensor
│
└── Signal → ESP32
とそのまま置き換えるのは避けます。
外部デバイスが5V Logicを出力する場合は、
抵抗分圧
Level Shifter
適切なInterface IC
などを使用し、ESP32側の入力条件に合わせます。
「Arduino IDEで同じコードが動く」ということと、
Hardwareをそのまま接続できる
ということは別です。
これはUNOからESP32へ移行するときに非常に重要な違いです。
逆にESP32の3.3V出力で5V回路を動かせる?
今度は反対方向です。
ESP32のGPIO HIGHは3.3V系です。
5Vで動作する外部ICへ信号を入力するとき、
ESP32 3.3V HIGH
↓
5V IC Input
で正しくHIGHとして認識されるかは、接続先ICの入力電圧仕様によります。
「5V電源で動いているICだから3.3VではHIGHにならない」とも、「3.3Vなら必ずHIGHになる」とも一律には言えません。
確認すべきなのはDatasheetの、
VIH:High-level Input Voltage
です。
ESP32と5V系回路を接続するときは、
電源電圧ではなく、実際の入出力Logic Levelを確認する
ことが重要です。
GPIOの本数だけでは比較できない
Arduino UNO R3にはDigital I/Oが14本あり、そのうち6本をPWM出力として利用できます。またAnalog Inputは6本です。
ESP32にはより多くのGPIOがあります。
ただしESP32では、
GPIO番号が存在する=すべて自由に同じ用途で使える
とは限りません。
ESP32ではPinによって、
- Input Only
- Boot Strap
- Flashとの接続
- ADC
- Touch Sensor
- RTC GPIO
など、機能や制約が異なります。
そのため単純に、
UNO:14本
ESP32:もっと多い
→ ESP32の方が全部自由に使える
とは考えない方がよいでしょう。
ESP32では、必要なPeripheralと使用可能GPIOを確認してPin Assignmentを決めることが重要です。
ここは既存のESP32ピン関連の記事へ内部リンクできるポイントでもあります。
Arduino UNOにはEEPROMがある
Arduino UNO R3のATmega328Pには1KBのEEPROMがあります。
そのため、
設定値
Calibration値
動作モード
など、電源OFF後も残したいデータをEEPROMへ保存できます。
ESP32にはUNO R3と同じような専用EEPROMはありません。
代わりに、Flash Memory上の**NVS(Non-Volatile Storage)**などを利用して設定値を保存できます。
Arduino-ESP32ではPreferences LibraryからNVSを扱うこともできます。
つまり、
Arduino UNO R3
↓
EEPROM
ESP32
↓
NVS / Preferences
↓
Flash
という違いがあります。
ESP32へ移行するときに、
「EEPROMがないから設定を保存できない」
というわけではありません。
保存方法が変わる、と考えると分かりやすいでしょう。
ここから、前回公開した「ESP32のFlashにデータを保存する方法|NVS・Preferencesを解説」へ自然に内部リンクできます。
ADCにも違いがある
SensorのAnalog値を読み取る場合も注意が必要です。
Arduino UNO R3には10bit ADCがあり、Analog InputとしてA0~A5を利用できます。
ESP32にもADCがありますが、UNOとまったく同じ感覚で使えるわけではありません。
ESP32ではADC ChannelやAttenuation、入力範囲、ADC特性などを考える必要があります。
またWi-Fi使用時など、使用するESP32やADC Unitによって注意すべき条件があります。
そのため、
analogRead();
という同じようなAPIが使えたとしても、
Hardware内部までArduino UNOと同じ
ではありません。
特にSensorの測定精度が重要な用途では、使用するESP32シリーズのADC仕様を確認する必要があります。
「Arduino IDEが使える」=Arduino UNOと同じではない
ESP32ではArduino Coreを利用することで、Arduino IDEからFirmwareを開発できます。
そのため、
pinMode();
digitalWrite();
digitalRead();
analogRead();
delay();
など、Arduino経験者には馴染みのあるAPIを使用できます。
これはESP32へ移行しやすい大きなメリットです。
しかし、
Arduino IDEで書けるからArduino UNOと同じマイコン
ではありません。
CPU Architectureも違えば、
Memory
Peripheral
Interrupt
Timer
ADC
GPIO
Wireless
なども異なります。
Arduino APIは違いの一部を隠してくれますが、Hardwareそのものを同じにするものではありません。
ここを理解しておくと、UNOからESP32へ移行したときのトラブルをかなり減らせます。
PWMの仕組みも異なる
Arduino UNO R3では、Digital I/Oのうち6本をPWM出力として利用できます。
Arduinoでは、
analogWrite(pin, value);
を使ったPWM制御に慣れている人も多いでしょう。
ESP32でもPWM出力は可能ですが、内部の仕組みはUNO R3とは異なります。
ESP32にはLEDC(LED Control)Peripheralがあり、PWMの周波数やDutyを設定して使用できます。
そのため、
Arduino UNO R3
↓
Timerを利用したPWM
ESP32
↓
LEDCなどを利用したPWM
という違いがあります。
ESP32ではPWM周波数や分解能を用途に応じて設定できますが、周波数とDuty Resolutionには関係があります。
「分解能を高くして、周波数もいくらでも高くできる」というわけではありません。
LEDの調光、Motor制御、Buzzerなど、用途に合わせてPWM条件を決める必要があります。
UART・SPI・I2CはESP32の方が柔軟
外部Deviceとの通信では、
UART
SPI
I2C
などをよく使用します。
Arduino UNO R3にもこれらのPeripheralがありますが、ESP32ではより複雑なApplicationを想定した構成になっています。
特にESP32にはGPIO Matrixという仕組みがあります。
Peripheral Signalを特定の固定Pinだけでなく、さまざまなGPIOへRoutingできるため、Pin Assignmentの自由度が高くなっています。
たとえば基板設計で、
UART TX
UART RX
SPI MOSI
SPI MISO
SPI CLK
などを配置するとき、UNOより柔軟にPinを選択できる場合があります。
これは自作基板では非常に便利です。
ただし自由度が高い分、
どのGPIOを使っても同じ
というわけではありません。
Boot Strap PinやInput Only Pin、Flashなどで使用されるPin、Peripheral固有の制約を確認する必要があります。
ESP32の方が消費電力は大きい?
これは使い方によって変わります。
ESP32は高性能CPUに加えてWi-FiやBluetoothを搭載しているため、無線通信中には相応の電流を消費します。
そのため、
単純な処理だけを常時実行するなら、ESP32の方が必ず省電力
とは言えません。
一方、ESP32にはLight SleepやDeep Sleepなどの省電力機能があります。
たとえばBattery駆動Sensorなら、
Deep Sleep
↓
TimerでWake-up
↓
Sensor測定
↓
Wi-Fi接続
↓
Data送信
↓
再びDeep Sleep
という動作ができます。
つまり消費電力を比較するときは、
MCUの通常動作電流
だけを見るのではなく、
製品が1日を通して
どの状態で何時間動作するか
を見る必要があります。
ESP32のDeep Sleepについては、既存の「ESP32 Deep Sleep完全ガイド」へ内部リンクできます。
リアルタイム制御ならArduino UNOの方がいい?
「ESP32はWi-FiやRTOSが動いているから、Arduino UNOの方がリアルタイム制御に向いている」
という話を見かけることがあります。
これは用途を分けて考える必要があります。
Arduino UNO R3では、基本的に非常にシンプルなFirmware構成になります。
setup()
↓
loop()
↓
Interrupt
という構成を把握しやすく、
いつ、どの処理が実行されるのか
を比較的追いやすいというメリットがあります。
一方ESP32では、FreeRTOSをベースとしたSoftware環境が使われ、Wi-FiやBluetoothなど複数の処理も動作します。
そのため、厳密なTimingが必要な処理を、
delayMicroseconds();
だけに頼って実装するのではなく、
Hardware Timer
Peripheral
Interrupt
Task Priority
などを適切に使う必要があります。
ただし、
ESP32ではリアルタイム制御ができない
という意味ではありません。
重要なのは、必要なTiming精度に応じてHardware PeripheralやSoftware構成を選ぶことです。
Dual Coreなら処理能力が2倍になる?
従来ESP32はDual Core CPUを搭載しています。
そこで、
「Arduino UNOがSingle Coreなら、ESP32はDual Coreだから単純に2倍?」
と思うかもしれません。
これも単純には比較できません。
Dual Coreだからといって、一つの処理が自動的に2倍の速度で実行されるわけではありません。
ESP32では複数Taskを別Coreで実行する構成も可能ですが、Application側の設計が必要です。
たとえば、
Task A
Sensor処理
Task B
通信処理
のように役割を分けることができます。
一方、ESP32-C3やESP32-C5など、Single CoreのESP32シリーズも存在します。
したがって、
ESP32=すべてDual Core
と覚えないようにしましょう。
使用するESP32シリーズによってCPU構成は異なります。
ESP32はシリーズによる違いも大きい
ここもArduino UNOとの比較で注意したいところです。
「ESP32」と一言で呼んでいますが、現在は複数のシリーズがあります。
たとえば、
ESP32
ESP32-S2
ESP32-S3
ESP32-C3
ESP32-C5
ESP32-C6
ESP32-H2
などです。
シリーズによって、
CPU Architecture
Core数
Wi-Fi
Bluetooth
USB
GPIO
Memory
などが異なります。
そのため、
「ESP32を使いたい」
と決めた後にも、
どのESP32シリーズを選ぶか
という選定があります。
ESP32を選んだ後に「どのシリーズを選べばよいか」で迷った場合は、「ESP32シリーズの選び方」で用途別に詳しく比較しています。
Arduino UNOからESP32へコードはそのまま移植できる?
簡単なSketchであれば、そのまま動く場合もあります。
たとえば、
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
のような基本的なArduino APIを使ったコードなら、Pin番号などを修正するだけで移植できることがあります。
しかしFirmwareが複雑になるほど注意点が増えます。
1.GPIO番号をそのまま使わない
UNOで、
digitalWrite(13, HIGH);
としていたからといって、ESP32でもGPIO13を同じ用途にそのまま割り当てる必要はありません。
使用するESP32 BoardやModuleのPin配置を確認して決めます。
2.5V前提の外部回路を確認する
Firmwareが移植できてもHardwareが対応しているとは限りません。
特に、
Sensor Output
UART
I2C Pull-up
SPI Device
などのLogic Voltageを確認します。
UNO R3の5V環境からESP32の3.3V環境へ変更するときには、ここを最優先で確認した方がよいでしょう。
3.Arduino LibraryがESP32に対応しているか確認する
Arduinoには非常に多くのLibraryがあります。
しかし、
Arduino用LibraryだからESP32でも必ず動く
とは限りません。
Library内部で、
AVR固有Register
Timer
Interrupt
Pin構成
などへ直接アクセスしている場合、ESP32ではそのまま使用できないことがあります。
反対にArduino APIだけで実装されているLibraryなら、比較的移植しやすい場合があります。
使用前にESP32対応状況を確認しましょう。
4.EEPROM処理を見直す
UNO R3で、
EEPROM.read();
EEPROM.write();
などを使用していた場合、ESP32では保存方法を見直します。
ESP32ではNVSを利用でき、Arduino-ESP32ならPreferences Libraryを使用できます。
単にAPIを置き換えるだけでなく、
保存するデータ
書き込み頻度
Factory Reset
Firmware Update後の互換性
まで整理すると、より製品向けの設計になります。
5.TimerやInterrupt処理を確認する
Arduino UNO R3のATmega328PとESP32ではTimerやInterrupt Controllerの構造が異なります。
そのため、AVR固有のRegisterを直接操作しているコードは、そのまま移植できません。
たとえば、
TCCR1A
TCCR1B
OCR1A
などATmega328P固有Registerを操作している場合は、ESP32のPeripheralに合わせて実装し直す必要があります。
Arduino UNO R3を選ぶメリット
ここまで読むと、
「それならESP32を選べばいいのでは?」
と思うかもしれません。
しかしUNO R3にもメリットがあります。
まず構成が非常にシンプルです。
8bit MCU、少ないMemory、基本的なPeripheralという構成なので、マイコンの基本を学ぶには分かりやすいBoardです。
また5V系であるため、5V LogicのDeviceを扱う用途では接続しやすい場合があります。
さらに長年使われてきたため、TutorialやLibrary、作例などの情報量も非常に多くあります。
ESP32を選ぶメリット
ESP32の大きなメリットは、やはり機能の多さです。
Wi-Fi
Bluetooth
高いCPU性能
大容量Memory
豊富なPeripheral
省電力機能
を一つのSoCで利用できます。
特に、
スマートフォン連携
Cloud通信
Web Server
OTA
BLE
Wi-Fi Sensor
IoT Device
などを作るなら、ESP32は非常に有力な選択肢です。
またArduino Frameworkから始めて、必要になればESP-IDFへ移行できることもメリットです。
初心者ならどちらを選ぶ?
「初心者にはArduino UNO」と一律に決める必要はないと思います。
作りたいものによって選ぶ方がよいでしょう。
LEDを点滅させたり、SwitchやSensorを接続したりして、
まずマイコンの基本を学びたい
のであればArduino UNO R3は分かりやすい選択です。
一方、
最初からWi-Fiやスマートフォン連携をやりたい
のであれば、ESP32から始めても問題ありません。
Arduino-ESP32を利用すれば、ESP32でもArduino IDEから、
setup()
loop()
という馴染みやすい形で開発できます。
重要なのは、
初心者だから低性能なマイコンを選ぶ
ことではなく、
作りたいものに必要な機能を持ったマイコンを選ぶ
ことです。
製品開発ならどちらを選ぶ?
製品開発では、さらに判断基準が増えます。
単純な性能だけでなく、
必要なI/O
通信Interface
消費電力
部品コスト
基板面積
供給性
開発環境
Software資産
認証
などを考えます。
Wi-FiやBLEが必要ならESP32は非常に魅力的です。
一方、無線通信が不要で、
Switch入力
Sensor入力
Relay制御
UART通信
程度のシンプルな制御なら、ESP32ほどの性能が必要ない場合もあります。
その場合はArduino UNOそのものを製品へ搭載するという意味ではなく、要求仕様に合った別のMCUを選ぶという判断もあります。
製品設計では、
高性能なMCUを選ぶ
ことより、
必要十分なMCUを選ぶ
ことが重要です。
ESP32とArduino UNO R3、どちらを選ぶ?
用途別に整理すると、次のようになります。
| 用途・条件 | ESP32 | UNO R3 |
|---|---|---|
| Wi-Fiを使いたい | ◎ | △ 外部Module |
| Bluetoothを使いたい | ◎ | △ 外部Module |
| 高い処理性能が必要 | ◎ | △ |
| 大きなRAMが必要 | ◎ | △ |
| Web Serverを作りたい | ◎ | △ |
| 5V系回路を扱いたい | △ 要確認 | ◎ |
| シンプルな電子工作 | ○ | ◎ |
| マイコンの基本学習 | ○ | ◎ |
| 複数Taskを動かしたい | ◎ | △ |
| Battery機器 | ○ 設計次第 | ○ 設計次第 |
| IoT機器 | ◎ | △ |
| Arduino資産を使いたい | ○ | ◎ |
単純な勝ち負けではなく、必要な機能によって選択するのがよいでしょう。
Arduino UNOからESP32へ移行するときのチェックリスト
最後に、UNO R3からESP32へ移行するときに確認したいポイントをまとめます。
| 確認項目 | 内容 |
|---|---|
| Logic Voltage | 5V → 3.3Vの違いを確認したか |
| GPIO | Pin番号・Pin機能を確認したか |
| Sensor | 3.3V Logicに対応しているか |
| Pull-up | I2CなどのPull-up電圧を確認したか |
| ADC | 入力条件・ADC特性を確認したか |
| PWM | ESP32のPWM方式に合わせたか |
| EEPROM | NVS / Preferences等へ変更したか |
| Library | ESP32対応を確認したか |
| Timer | AVR固有処理が残っていないか |
| Interrupt | ESP32向けに確認したか |
| Memory | ESP32だから無制限と考えていないか |
| Wi-Fi/BLE | 通信時のCPU・Memory・電源負荷を考慮したか |
特にHardwareでは、5Vと3.3Vの違いを最初に確認しましょう。
SoftwareがBuildできたからといって、Hardwareまで互換とは限りません。
まとめ|性能ではなく「何を作るか」で選ぶ
ESP32とArduino UNO R3は、どちらもArduino IDEから開発できますが、中身は大きく異なります。
Arduino UNO R3は、
8bit AVR
16MHz
SRAM 2KB
5V系
というシンプルな構成です。
ESP32は、
32bit CPU
高いClock周波数
大容量Memory
Wi-Fi
Bluetooth
など、多くの機能を搭載しています。
性能だけを見ればESP32が大きく上回ります。
しかし、
ESP32の方が高性能だから、常にESP32を選ぶべき
というわけではありません。
シンプルな電子工作や5V系回路の扱いやすさを重視するなら、Arduino UNO R3にもメリットがあります。
一方、
Wi-Fiを使いたい
BLEを使いたい
Web通信をしたい
より複雑なFirmwareを動かしたい
のであれば、ESP32が有力です。
そしてArduino UNOからESP32へ移行するときに最も注意したいのは、
同じArduino APIが使えることと、Hardwareが互換であることは別
という点です。
GPIO電圧、Pin機能、ADC、Timer、EEPROMなど、それぞれの違いを確認して移植する必要があります。
マイコン選定ではスペック表の数字だけを見るのではなく、
自分が何を作りたいのか
から必要な機能を決めることが、最も重要です。