40.5 × 27 mm
ESP32
MCU
240MHz
clock
-
flash
520KB
SRAM
10· 7 ADC
GPIO
BLE 4.2+ WiFi
radio
On this page

ESP32-CAM-MB Pinout

16 pins
PinGPIOLabelsStatusCapabilitiesNotes
1-5Vpower-
2-GNDground-
312A15T5PWMstrappingadc · touch
413A14T4PWMstrappingadc · touch
515A13T3PWMstrappingadc · touch
614A16T6PWMstrappingadc · touch
72A12T2PWMstrappingadc · touch
84A10T0PWMstrappingadc · touch
9-3V33.3Vpower-
1016IO16strapping-
110A11T1strappingadc · touch
12-GNDground-
13-VCCpower-
143RXPWMuartuart
151TXPWMuartuart
16-GNDground-
10 GPIOs broken out 0 free · 10 need care · 0 to avoid

Fine - with a little care

10 pins · 10 things to know
A15GPIO12 Bootstrapping pin; JTAG TDI; sets flash voltage (VDD_SDIO); also HSPIQ (flash data line). Strapping

Keep LOW during boot (internal PD); pulling HIGH at reset selects 1.8V flash mode, causing flash brownout if 3.3V flash is used.

A14GPIO13 JTAG clock pin (TCK); also ADC2 channel 4 / Touch4 input. JTAG

Used for JTAG debugging (TCK); avoid using as GPIO if JTAG is needed.

A13GPIO15 Bootstrapping pin; JTAG TDO; controls UART0 boot log output; also HSPICS0 (secondary SPI CS). Strapping

Keep HIGH during boot (internal PU); if LOW on reset, bootloader log is silenced and boot mode may change.

A16GPIO14 JTAG mode select pin (TMS); also HSPI CLK and PWM-capable GPIO. JTAG

Used for JTAG debugging (TMS); driving it as GPIO may interfere with JTAG or produce spurious signals at boot.

A12GPIO2 Bootstrapping pin (must be low or floating at reset); internal pull-down. Strapping

If driven HIGH on reset (while IO0 is LOW), selects an unsupported SDIO boot mode, causing boot failure.

A10GPIO4 Bootstrapping pin; internal pull-down; also HSPIHD (flash data line) on modules with internal flash. Strapping

Sampled at reset for boot config; should not be driven at boot (affects boot mode timing).

IO16 PSRAM CS# on WROVER-class modules and on ESP32-D0WDRH2-V3; in-package flash CS# on ESP32-U4WDH. Also UART2 RX. PSRAM

Wired to the memory die on PSRAM-equipped modules (WROVER, PICO-V3-02) and on in-package-memory chip variants (U4WDH, D0WDRH2-V3); an ordinary GPIO on a plain WROOM-32.

A11GPIO0 Bootstrapping pin (enter bootloader when low); internal pull-up. Strapping

Must be HIGH during boot for normal startup; if held LOW on reset, forces flash programming mode.

RXGPIO3 Default UART0 RX pin for USB-serial programming (console input). UART

Used for receiving data from USB-UART (programming); also pulled HIGH at boot for console communication, so using as GPIO can disrupt uploads.

TXGPIO1 Default UART0 TX pin for USB-serial programming and console. UART

Connected to on-board USB-UART for uploading and logs; drives serial output at boot, so using as GPIO can disrupt programming or console.

These are recommendations, not hard rules - with the right pull-ups, timing and boot-state awareness most pins can be made to work. When in doubt, start green.

The ESP32-CAM-MB pinout brings out 16 pins - 10 usable GPIO alongside the 5V, GND, 3V3 and VCC power rails.

For peripherals, TX/RX on GPIO1 and GPIO3 cover serial logging and flashing.

On the analog side there are 7 ADC-capable pins for sensors and battery monitoring and 7 capacitive-touch inputs.

10 of the exposed pins carry boot-time or system duties on the ESP32 (A15, A14, A13 and 7 more).

Getting started

flash your first firmware in ~2 minutes
Tool:
1
Connect over USB
Install your USB-serial driver (CH340 / CP210x) if no port appears. Not detected? Hold BOOT while plugging in.
2
Match & flash
Set the Tools options shown, then click Upload.
3
Verify it runs
GPIO8 toggles - wire an LED and resistor to it, or change the pin to your board's own LED.
Set these in Tools · leave everything else at default
Arduino IDE 2.x - Tools Copy
Board: "ESP32 Dev Module"
Flash Size: ""
Upload Speed: "921600"
▸ every other Tools option - leave at default
Board: ESP32 Dev Module
Flash Size: 
Upload Speed: 921600
Find it: Tools ▸ Board ▸ ESP32 Arduino ▸ ESP32 Dev Module
blink.ino Copy
// toggle GPIO8 - wire an LED and resistor to it
void setup() {
  pinMode(8, OUTPUT);
}
void loop() {
  digitalWrite(8, HIGH); delay(500);
  digitalWrite(8, LOW);  delay(500);
}
board to selectesp32dev⧉ copy
platformio.ini Copy
[env:esp32cam-mb]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed = 921600
Find it: PlatformIO Home ▸ Boards, search esp32dev - or type it after board =.
board to selectesp32dev⧉ copy
device.yaml Copy
esp32:
  board: esp32dev
  variant: esp32
  framework:
    type: esp-idf

# blink - GPIO8
output:
  - platform: gpio
    pin: 8
    id: led_out
light:
  - platform: binary
    name: "LED"
    output: led_out
Find it: search ESPHome's board list for esp32dev (same ids as PlatformIO).
esptool doesn't pick board settings - a prebuilt .bin already has them baked in. This is just the raw flash command.
terminal Copy
esptool.py --chip esp32 --port /dev/ttyACM0 \
  --baud 921600 write_flash 0x1000 firmware.bin
--port = your /dev/tty* (macOS/Linux) or COMx (Windows).

Specifications

ESP32 · 40.5 × 27 mm · vs other ESP32 chips →
Compute
MCU
ESP32
Clock
240 MHz
SRAM · Flash
520 KB · -
Radio
Wi-Fi
802.11 b/g/n
Bluetooth
4.2 LE
Antenna
PCB
I/O
GPIO · ADC
10 · 7
UART · I²C · SPI
3 · 2 · 2
PWM
16 channels
Power
USB
-
Serial
-
Boot address
0x1000
Flashing
Upload · OTA
esptool_py · esp_ota
Flash · Boot mode
- · -
Sketch · Data
- · -

Dimensions

27 mm40.5 mm
40.5 × 27 mm
The ESP32-CAM-MB uses esptool_py for firmware uploads, esp_ota for over-the-air (OTA) updates.

About this board

At its core is the ESP32 - a dual-core Xtensa with both Bluetooth Classic and BLE.

Only 10 GPIO are broken out, where most ESP32 boards manage about 24 - worth checking the pinout covers what you need.

Resources

Similar boards