Overview
The RP2040-Zero is Waveshare's stamp-sized take on the Raspberry Pi RP2040 chip. It packs the same dual-core ARM Cortex-M0+ at 133 MHz, 264 KB of SRAM, and 2 MB of QSPI Flash as the larger Raspberry Pi Pico — into a board roughly the size of a postage stamp (18 x 23 mm) with USB Type-C, BOOT and RESET buttons, and an addressable WS2812 RGB LED on GPIO 16.
It breaks out 23 GPIO pins (GP0-GP15, GP26-GP29 on the front; GP17-GP25 on solder pads on the back), three 12-bit ADC channels, dual SPI/I2C/UART blocks, and the RP2040's signature 8 PIO state machines for hardware-accelerated custom protocols. Headers come pre-soldered so it's breadboard-ready out of the box.
Like the Pico, the RP2040-Zero supports the official C/C++ SDK, MicroPython, CircuitPython, and the Arduino IDE via the arduino-pico core. The on-board WS2812 makes it easy to add visual feedback without wiring an external LED.
At a Glance
Specifications
| Parameter | Value |
| Microcontroller | RP2040 (dual-core ARM Cortex-M0+) |
| Clock Frequency | Up to 133 MHz (overclockable to 250+ MHz) |
| Flash Memory | 2 MB QSPI Flash |
| SRAM | 264 KB on-chip |
| Operating Voltage | 3.3V |
| Input Voltage | 5V via USB-C or 5V pin |
| GPIO Logic Level | 3.3V (NOT 5V tolerant) |
| Digital I/O Pins | 23 broken-out (GP0-15, GP26-29 on front; GP17-25 back pads) |
| Analog Input Channels | 3 (GP26 / GP27 / GP28, 12-bit) |
| PWM Channels | 16 (8 PWM blocks, 2 channels each) |
| PIO (Programmable I/O) | 2 blocks, 4 state machines each (8 total) |
| Communication Interfaces | 2x I2C, 2x SPI, 2x UART, USB 1.1 |
| USB Connector | USB Type-C |
| On-board RGB LED | WS2812 on GPIO 16 (DIN) |
| Buttons | BOOT + RESET |
| Headers | Pre-soldered male pins |
| Dimensions | ~18 x 23 mm |
Pinout Diagram
Wiring Guide
LED + Push Button
Use a 220-330 ohm series resistor on the LED. The board's on-board WS2812 RGB LED on GP16 is also handy as a "no wiring needed" status indicator.
| Component | RP2040-Zero Pin | Details |
|---|---|---|
| LED Anode (long) | GP2 | Through 220 ohm resistor |
| LED Cathode (short) | GND | |
| Button Terminal 1 | GP3 | INPUT_PULLUP in code |
| Button Terminal 2 | GND |
neopixel in CircuitPython, to drive it.
I2C Sensor
Two hardware I2C buses are available. I2C0 defaults to GP0 (SDA) and GP1 (SCL); I2C1 defaults to GP2 (SDA) and GP3 (SCL). Most 3.3V breakouts work directly with no level shifting.
| Sensor Pin | RP2040-Zero Pin |
|---|---|
| VCC | 3V3 |
| GND | GND |
| SDA | GP0 (I2C0) |
| SCL | GP1 (I2C0) |
SPI Device
SPI0 defaults to GP4 (RX/MISO), GP5 (CSn), GP6 (SCK), and GP7 (TX/MOSI). Any free GPIO can serve as a chip select if you need more devices on the bus.
| SPI Pin | RP2040-Zero Pin |
|---|---|
| VCC | 3V3 |
| GND | GND |
| SCK | GP6 |
| MISO | GP4 |
| MOSI | GP7 |
| CS / SS | GP5 |
UART / Serial
UART0 is on GP0 (TX) and GP1 (RX) by default; UART1 is on GP4/GP5. Note: GP0/GP1 are also the default I2C0 pins — pick one usage per project.
| External Device | RP2040-Zero Pin |
|---|---|
| Device TX | GP1 (UART0 RX) |
| Device RX | GP0 (UART0 TX) |
| VCC | 3V3 or 5V (match device) |
| GND | GND (shared) |
Code Examples
MicroPython - Light the On-board WS2812
# RP2040-Zero - color the on-board WS2812 RGB LED (GP16)
# Flash MicroPython for RP2040 from micropython.org, then save this as main.py
from machine import Pin
from neopixel import NeoPixel
import time
pixel = NeoPixel(Pin(16), 1)
colors = [(64, 0, 0), (0, 64, 0), (0, 0, 64), (32, 32, 32)]
while True:
for c in colors:
pixel[0] = c
pixel.write()
time.sleep(0.5)
Arduino IDE (arduino-pico) - Blink External LED
// RP2040-Zero - external LED blink on GP2
// Install: Boards Manager URL https://github.com/earlephilhower/arduino,/pico/releases/download/global/package_rp2040_index.json
// Select Board: Tools -> Board -> "Raspberry Pi Pico/RP2040" -> "Generic RP2040"
const int ledPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
CircuitPython - Read Analog (Potentiometer)
# RP2040-Zero - read a 10k pot on GP26 (ADC0)
# Drop CircuitPython for "Waveshare RP2040-Zero" or "Raspberry Pi Pico" onto the board
import board
import analogio
import time
pot = analogio.AnalogIn(board.GP26)
while True:
raw = pot.value # 0 - 65535
voltage = raw * 3.3 / 65535
print("Raw:", raw, " Voltage: {:.2f} V".format(voltage))
time.sleep(0.2)
Frequently Asked Questions
import neopixel; px = neopixel.NeoPixel(board.GP16, 1)), the neopixel module in MicroPython, or the Adafruit_NeoPixel library in Arduino.machine.freq(250_000_000). Watch out for thermal stability if you push it.