The Pico W takes the original Raspberry Pi Pico — a genuinely excellent $4 microcontroller board — and bolts on Wi-Fi and Bluetooth without changing the physical footprint at all. Same 40 pins, same RP2040 chip, same programmable I/O blocks that make the Pico unusually capable for its price.
What did change, in a way that trips up almost everyone porting a project from the plain Pico, is the onboard LED. On the original Pico it's wired straight to a GPIO pin you can toggle directly. On the Pico W, that same physical pin is now doing something else entirely, and the LED moved to a completely different chip.
Here's the full pin breakdown — GPIO, power, ADC, and the wireless-specific pin changes that catch people switching from a plain Pico.
What's Actually on the Board
The Pico W is built around the same RP2040 chip as the original Pico — dual-core Arm Cortex-M0+ running up to 133 MHz, 264KB of SRAM, 2MB of onboard flash — paired with an Infineon CYW43439 wireless chip supporting 802.11 b/g/n Wi-Fi and Bluetooth 5.2. The CYW43439 talks to the RP2040 over SPI, using a handful of pins that, on the plain Pico, are dedicated to internal board functions instead.
Of the RP2040's 30 total GPIOs, 26 are broken out to the header as user-accessible pins, labeled GP0 through GP28 (with a few numbers reserved for internal use, covered below). All GPIO pins run at 3.3V logic.
Power Pins
| Pin | Description |
|---|---|
| VBUS | 5V input from the micro-USB port |
| VSYS | Main system input, 1.8V–5.5V, feeds the onboard SMPS regulator |
| 3V3(OUT) | Regulated 3.3V output — keep external load under ~300mA |
| 3V3_EN | Pull LOW to disable the onboard 3.3V regulator (effectively powers down the board) |
| GND | Ground (multiple pins) |
| ADC_VREF | Reference voltage for the ADC, filtered 3.3V from the SMPS |
| AGND | Dedicated analog ground for cleaner ADC readings |
VSYS is the pin to use if you're powering the board from a battery or external regulator rather than USB — the onboard switching regulator handles stepping it down to a clean 3.3V for the RP2040 and its I/O.
The Wireless-Specific Pin Changes — Read This First If You're Coming From a Plain Pico
This is the single most important difference from the standard Pico. On the plain Pico, four GPIOs are reserved for internal board functions and aren't exposed on the header at all:
| GPIO | Plain Pico function |
|---|---|
| GP23 | SMPS power-save mode select |
| GP24 | VBUS sense |
| GP25 | Onboard LED |
| GP29 | ADC3 — reads VSYS voltage |
On the Pico W, all four of these are repurposed to interface with the CYW43439 wireless chip over SPI instead, and they're not usable as general-purpose GPIO or in their original plain-Pico roles. Practically, the change that trips people up most is the LED: it's no longer wired to GP25 at all. The status LED now lives on the wireless chip's own GPIO0, accessed through the wireless driver rather than a direct pin toggle.
# Plain Pico — this works:
from machine import Pin
led = Pin(25, Pin.OUT)
led.toggle()
# Pico W — GP25 is not the LED anymore. Use this instead:
from machine import Pin
led = Pin("LED", Pin.OUT)
led.toggle()
If you copy a blink sketch written for a plain Pico onto a Pico W without changing this, it will run without errors and simply never light the LED — a classic silent failure that's confusing the first time you hit it.
GPIO Pins — Digital I/O
The remaining GPIOs are standard 3.3V digital I/O, each configurable as input or output and each capable of PWM output.
from machine import Pin
led = Pin(15, Pin.OUT)
led.value(1)
Combined current draw across all GPIO pins is capped at roughly 50mA total — this is a board-wide limit, not a per-pin figure, and it's easy to exceed if you're driving several LEDs or a small load directly without current-limiting resistors or a driver transistor.
PWM
The RP2040 has 8 PWM slices, each with 2 channels (A and B), giving 16 controllable PWM outputs shared across the 26 available GPIOs. Multiple GPIOs can map to the same PWM channel, meaning two different pins can output an identical PWM signal simultaneously if your project calls for it.
from machine import Pin, PWM
pwm = PWM(Pin(16))
pwm.freq(1000)
pwm.duty_u16(32768) # ~50% duty cycle
ADC Pins
| GPIO | ADC Channel |
|---|---|
| GP26 | ADC0 |
| GP27 | ADC1 |
| GP28 | ADC2 |
| — | ADC4 — internal temperature sensor |
from machine import ADC
sensor = ADC(26)
reading = sensor.read_u16() # 0–65535, scaled from the 12-bit ADC
The ADC itself is 12-bit (0–4095 raw resolution), with MicroPython's read_u16() scaling that up to a 16-bit range for consistency across ports. Unlike the plain Pico, GP29/ADC3 is not available for general analog use on the Pico W — it's one of the four pins now dedicated to the wireless interface.
Communication Pins
I2C Pins
Two independent I2C controllers (I2C0 and I2C1) are available, and — unlike a fixed pin assignment — nearly any GPIO pair can be mapped to either controller in software. A common default is:
| Signal | GPIO |
|---|---|
| SDA | GP4 |
| SCL | GP5 |
from machine import I2C, Pin
i2c = I2C(0, sda=Pin(4), scl=Pin(5))
You can run I2C0 and I2C1 simultaneously on two separate buses, but you can't run two separate instances of the same controller (two I2C0 buses) at once.
SPI Pins
Two SPI controllers (SPI0 and SPI1) are available, similarly flexible in their GPIO assignment.
from machine import SPI, Pin
spi = SPI(0, sck=Pin(18), mosi=Pin(19), miso=Pin(16))
UART Pins
Two hardware UARTs (UART0 and UART1), each routable to multiple GPIO pin pairs. The conventional default:
| Signal | GPIO |
|---|---|
| TX (UART0) | GP0 |
| RX (UART0) | GP1 |
from machine import UART, Pin
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
Having two independent hardware UARTs — rather than the single shared one on an Arduino Uno — means you can debug over USB serial while a second UART talks to a GPS module or another board simultaneously.
BOOTSEL and Programming
The Pico W has no onboard debugger and no reset button by default — instead, it uses a BOOTSEL button. Hold it while plugging in the USB cable, and the board mounts as a USB mass-storage drive; drag a compiled .uf2 firmware file onto it, and it reboots running your code. This is genuinely the entire flashing process for most MicroPython and C/C++ SDK workflows — no separate programmer hardware required.
For live debugging with breakpoints, a 3-pin SWD header is available for use with a Picoprobe (which can be another Pico running debug-probe firmware) or a dedicated SWD debugger.
Practical Pin Usage Tips
Use Pin("LED", ...) for the onboard LED, not Pin(25, ...). This is the single most common porting mistake moving from a plain Pico.
Treat GP23, GP24, GP25, and GP29 as unavailable for your own use. They're all committed to the wireless interface on this board, unlike on the plain Pico.
Use VSYS, not VBUS, for external/battery power. VBUS is specifically the USB 5V input; VSYS is the general system input designed for external supplies.
Budget total GPIO current at 50mA across the whole board, not per pin — a handful of directly-driven LEDs can add up faster than expected.
Use the BOOTSEL button for flashing, and don't worry about needing an external programmer unless you specifically want breakpoint-level debugging.
Common Mistakes and How to Avoid Them
Copying plain-Pico LED code (Pin(25, ...)) onto a Pico W. It won't error, it just won't light the LED — the correct approach is Pin("LED", ...) in MicroPython, which routes through the wireless chip.
Trying to use GP29 as an analog input. It's part of the wireless interface on this board and isn't available as ADC3 the way it is on a plain Pico.
Overloading the 3V3(OUT) pin. Keep external current draw under roughly 300mA to avoid destabilizing the board's own 3.3V rail.
Wiring a 5V signal directly to a GPIO pin. The RP2040 is a 3.3V-only chip; use a level shifter for anything higher.
Assuming two I2C0 buses can run simultaneously. You can run I2C0 and I2C1 at the same time, but not two instances of the same controller.
Summary: Pico W Pin Reference at a Glance
| Feature | Count / Detail |
|---|---|
| Chip | RP2040, dual-core Cortex-M0+ @ up to 133 MHz |
| SRAM / Flash | 264 KB / 2 MB |
| Total header pins | 40 |
| Usable GPIO | 26 (GP0–GP22, GP26–GP28; GP23/24/25/29 reserved for wireless) |
| ADC channels | 3 external (GP26–28) + 1 internal temperature sensor |
| PWM outputs | 16 (8 slices × 2 channels) |
| I2C / SPI / UART | 2 / 2 / 2 — flexible GPIO assignment |
| Onboard LED | Via wireless chip — use Pin("LED", ...), not GP25 |
| Wireless | 802.11 b/g/n Wi-Fi, Bluetooth 5.2 |
| Logic level | 3.3V |
| Programming | BOOTSEL + drag-and-drop UF2, or SWD for debugging |
The Pico W's pin story is really one clean rule once you know it: everything that worked on a plain Pico still works, except the four pins now committed to talking to the wireless chip — and the LED is the one place that difference is genuinely easy to trip over. Learn that rule once, and the rest of the board behaves exactly like the Pico you may already know.
Raspberry Pi Pico W · RP2040 · CYW43439 Wireless · 26 Usable GPIO · I2C · SPI · UART · PWM · 12-bit ADC
Quick Answers to Common Pico W Pin Questions
Why doesn't my Pico W's onboard LED blink using GPIO 25? Because on the Pico W, GP25 is repurposed to talk to the wireless chip. The LED moved to the wireless chip's own GPIO — in MicroPython, use Pin("LED", Pin.OUT) instead of Pin(25, Pin.OUT).
How many GPIO pins can I actually use? 26, the same as a plain Pico — but GP23, GP24, GP25, and GP29 are committed to the wireless interface on the W variant, so they're not available for your own peripherals.
What's the difference between VBUS and VSYS? VBUS is specifically the 5V line from the micro-USB port. VSYS is the general system power input (1.8–5.5V) meant for external or battery power, feeding the onboard regulator.
How many analog pins does the Pico W have? Three externally usable ADC channels (GP26–GP28), plus an internal temperature sensor on a fourth channel. GP29/ADC3, available on the plain Pico, is not usable for analog input on the Pico W.
Do I need special hardware to program it? No — hold the BOOTSEL button while plugging in USB, and the board appears as a USB drive. Drag your compiled firmware file onto it and it reboots running your code.
Can I run I2C and SPI on any pins I want? Largely yes — both I2C controllers and both SPI controllers can be mapped to a range of different GPIO pairs in software, unlike a fixed pin assignment on boards like the Arduino Uno.
Is the Pico W's pinout identical to the plain Pico's? Physically identical layout, but four of the GPIOs (23, 24, 25, 29) behave differently because they're wired to the wireless chip instead of the internal functions they serve on the plain Pico.
What logic level does the board run at? 3.3V throughout — not 5V tolerant, so use a level shifter for 5V sensors and modules.
Where to Go From Here
Once the LED gotcha and the wireless-reserved pins are second nature, the Pico W's real strength — its combination of GPIO flexibility, dual-core processing, and built-in Wi-Fi — is worth exploring through MicroPython's network module for connecting to Wi-Fi, or the C/C++ SDK's pico_cyw43_arch library for lower-level control. From there, the Pico 2 W is the natural next step for projects that need more RAM, more processing headroom, or hardware security features, while keeping this exact same pinout.