Breadboard
docs
04 · Code on the bench

Microcontrollers & firmware

Five real chips, three ways to program them: bundled examples, your own compiled firmware, and live MicroPython.

The chips

  • ATmega328P / Arduino Uno: 16 MHz AVR, 5 V logic. Runs bundled bare-metal examples or any Intel HEX you export from the Arduino IDE (Sketch → Export Compiled Binary), pasted or uploaded in the Inspector.
  • Raspberry Pi Pico: RP2040, Cortex-M0+ at 125 MHz, 3.3 V logic with a real onboard regulator. Takes UF2 uploads (MicroPython included) and bundled examples.
  • ESP32 (classic): dual-core Xtensa LX6 at 240 MHz. Boots unmodified ESP-IDF apps, MicroPython, and compiled Arduino-ESP32 sketches from .bin images, through the genuine Espressif boot ROM.
  • ESP32-C3: RISC-V at 160 MHz. Same firmware formats as the classic ESP32, single RISC-V core.
  • ESP32-S3: dual-core Xtensa LX7 at 240 MHz, validated instruction-by-instruction against Espressif's QEMU. Same firmware formats as the C3, with FreeRTOS scheduling across both cores.
  • ESP32-C6: single RISC-V RV32IMAC core at 160 MHz with 512 KB SRAM. Same firmware formats as the C3; the radio is not modeled.

The serial monitor

The Serial panel opens itself the moment a board prints. Multi-board benches get a tab per board; the input row types to the active tab or to all boards (toggle next to it). This is a real UART (start bits, baud timing and all), so a MicroPython board gives you its actual REPL prompt to type at.

The Code tab: whole scripts

The Code tab runs complete MicroPython scripts on the board: write (or load an example's prefilled script), press Run on board, and the script is injected through the REPL. The run status tracks completion, and a traceback anywhere surfaces as an error banner with the offending line. Scripts re-run automatically on every boot: restart the sim and your program starts with it, exactly like flashed firmware.

from machine import Pin, I2C
import time

led = Pin(2, Pin.OUT)
for n in range(10):
    led.value(n % 2)
    print('blink', n)
    time.sleep_ms(250)
Every peripheral the examples use (I²C displays and sensors, SoftSPI matrices and e-paper, ADC reads, LEDC PWM, NeoPixels) is driven by ordinary MicroPython code you can copy from the bundled examples and change.

Powering a board

Boards are electrical citizens: an ESP32 needs ~5 V on vin (its onboard LDO makes the 3.3 V rail, which can power your sensors), the Pico wants vsys, the Uno takes vin or 5v. Undervolt a board and it browns out; the en pin really resets the chip.