The overview, with examples running, is on the board page.

The Waveshare RP2040-Zero

The Pico's RP2040 on a board 23.5 by 18 mm: twenty-three pins named by GPIO, a USB-C socket and a NeoPixel on GP16.

What it is

The same RP2040 as the Raspberry Pi Pico, a Cortex-M0+, on Waveshare's small square board. It has nine castellated pins down each long edge, 0.6 inch apart, five more along the bottom edge, the BOOT and RESET buttons and a WS2812 NeoPixel. There is no plain user LED. Mokxi runs the chip, its pins and the NeoPixel.

Pin numbers: by GPIO number

The silkscreen names each pin by its GPIO, and so does the arduino-pico core's "Waveshare RP2040 Zero": digitalWrite(0, HIGH) drives GP0. A0 to A3 are GP26 to GP29. The pin column is Waveshare's numbering: 1 to 9 down the left from the USB end, 10 to 14 along the bottom, 15 to 23 up the right.

Pin Name GPIO Also
1 5V 5 V supply
2 GND ground
3 3V3 3.3 V supply
4 GP29 29 A3
5 GP28 28 A2
6 GP27 27 A1
7 GP26 26 A0
8 GP15 15 SPI1 MOSI
9 GP14 14 SPI1 SCK
10 GP13 13 SPI1 CS
11 GP12 12 SPI1 MISO
12 GP11 11
13 GP10 10
14 GP9 9 Serial2 RX
15 GP8 8 Serial2 TX
16 GP7 7
17 GP6 6
18 GP5 5 I2C SCL, SPI SS
19 GP4 4 I2C SDA, SPI MISO
20 GP3 3 SPI MOSI
21 GP2 2 SPI SCK
22 GP1 1 UART RX, see below
23 GP0 0 UART TX, see below

A0 to A3 read the volts on the net, ten bits against 3.3 V unless analogReadResolution() asks for more. Every GPIO pin can do PWM with analogWrite(), and every one can take attachInterrupt().

Wire uses GP4 and GP5, SPI uses GP2, GP4, GP3 and GP5, and SPI1 uses GP14, GP12, GP15 and GP13. They run in software on those pins. Wire and SPI share GP4 and GP5, so a sketch that wants both can put its SPI device on SPI1. Serial reaches the serial monitor, and Serial1 is the same port, so GP0 and GP1 stay ordinary pins. Serial2 is UART1, with TX on GP8 and RX on GP9.

Keep it beside the breadboard

The five bottom pins, GP13 to GP9, sit in one column across the board. Pushed into a breadboard, GP9 and GP10 land in the same strip and short together, in Mokxi as on the bench. So the starter keeps the board beside the breadboard and reaches it with jumper wires.

The NeoPixel

The only light a sketch can drive is a WS2812 on GP16 (PIN_NEOPIXEL), powered from 3.3 V. GP16 is inside the board, on no pin. It is a full WS2812 model of its own, so Adafruit_NeoPixel works as it does on a desk:

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel pixel(1, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

The board draws the NeoPixel in the color it was last sent.

There is no plain LED

There is no LED_BUILTIN on this board, so a sketch that uses it does not compile, which is more honest than one that blinks nothing. Wire an LED and a 220 ohm resistor from a pin to GND instead; the built-in Blink uses GP0.

What is modeled

The Pico model's chip, whole: the Cortex-M0+ core, GPIO and the pads, PWM on every pin, the TIMER behind millis() and delay(), UART0 wired to the serial monitor, UART1 as Serial2, pin interrupts, the watchdog and the ADC on GP26 to GP29, at the real RP2040 addresses. The NeoPixel is on the board.

What is not modeled

The nine solder pads on the back (GP17 to GP25) and the power LED. RESET and BOOT are buttons with no pin.

From the RP2040 itself, as on the Pico: the second core, PIO, DMA, the chip's own I2C and SPI blocks (Wire and SPI run in software instead), the USB controller (Serial reaches the monitor directly), the RTC and the clock tree.

Common mistakes

digitalWrite(LED_BUILTIN, HIGH) from a Pico sketch. There is no LED_BUILTIN here. Wire an LED to a pin, or color the NeoPixel.

Pushing the board into a breadboard. GP9 and GP10 short together. Keep it beside the breadboard and use jumpers.

Starter projects

RP2040-Zero NeoPixel is the board on its own, fading its NeoPixel on GP16 around the color wheel with Adafruit_NeoPixel.

RP2040-Zero blink is the board beside a breadboard, blinking an LED and a 220 ohm resistor on GP0.