Raspberry Pi Pico vs Pico W vs Pico 2: RP2040 and RP2350 Explained

The Raspberry Pi Pico is not a small Linux computer like the Raspberry Pi 4 or Zero. It is a microcontroller board: it runs one program directly on the chip, starts in milliseconds, has no operating system and draws very little power. That makes it the right tool for reading sensors, driving motors, generating precise timing signals and building IoT nodes, while a full Raspberry Pi is better for cameras, desktops and web applications.

Four boards now share the same 40-pin footprint: Pico, Pico W, Pico 2 and Pico 2 W. They look almost identical but use different chips and radio options. This article explains what is inside each board, how the pins are numbered, and which one to pick before you start the tutorials that follow.

The Two Chips: RP2040 and RP2350

The original Pico and Pico W use the RP2040, the first microcontroller designed in-house by Raspberry Pi. It has two ARM Cortex-M0+ cores, 264 KB of on-chip SRAM and no internal flash; program code lives in a 2 MB QSPI flash chip on the board and is executed in place through a cache. The chip is officially rated at 133 MHz, and the MicroPython firmware runs it at 125 MHz by default.

The Pico 2 and Pico 2 W use the newer RP2350. It has two ARM Cortex-M33 cores with a hardware floating-point unit and DSP instructions, plus two Hazard3 RISC-V cores. At boot you choose which pair runs; you cannot mix one ARM and one RISC-V core in the same program image. It runs at 150 MHz, has 520 KB of SRAM, and the Pico 2 board carries 4 MB of flash. The RP2350 also adds security features such as ARM TrustZone, signed boot and OTP memory for keys.

Both chips have the feature that makes the Pico family special: PIO, programmable I/O. PIO blocks are tiny state machines that run their own nine-instruction assembly language and can bit-bang protocols such as WS2812 LEDs, VGA, extra UARTs or quadrature encoders without loading the CPU. The RP2040 has 2 PIO blocks with 4 state machines each (8 in total); the RP2350 has 3 blocks (12 state machines).

Side-by-Side Comparison

FeaturePicoPico WPico 2Pico 2 W
ChipRP2040RP2040RP2350RP2350
CPU cores2 x Cortex-M0+2 x Cortex-M0+2 x Cortex-M33 or 2 x Hazard3 RISC-V2 x Cortex-M33 or 2 x Hazard3 RISC-V
Clock (default)125 MHz in MicroPython, 133 MHz ratedSame as Pico150 MHz150 MHz
SRAM264 KB264 KB520 KB520 KB
Board flash2 MB2 MB4 MB4 MB
PIO state machines881212
WirelessNone2.4 GHz Wi-Fi and Bluetooth (CYW43439)None2.4 GHz Wi-Fi and Bluetooth (CYW43439)
Onboard LEDGP25Wireless chip GPIO, use "LED"GP25Wireless chip GPIO, use "LED"

All four boards share the same peripheral set at the pin level: 26 usable multi-function GPIO pins brought out to the header, 2 UARTs, 2 SPI controllers, 2 I2C controllers, 16 PWM channels, a USB 1.1 controller that can be device or host, and a 12-bit ADC with three channels on the header. The RP2350 adds a few extras such as more PWM slices and an HSTX high-speed serial output, but code written for the RP2040 pins carries over almost unchanged.

Understanding the Pinout

The most common beginner mistake is confusing physical pin numbers with GPIO numbers. Physical pins are numbered 1 to 40 around the board, starting at the top-left next to the USB connector and running down the left side, then up the right side. GPIO numbers (GP0 to GP28) are what you use in code. For example, physical pin 1 is GP0, but physical pin 3 is a ground pin, and GP25 is not on the header at all on the original Pico because it drives the onboard LED.

        USB
 GP0  1 |o    o| 40 VBUS
 GP1  2 |o    o| 39 VSYS
 GND  3 |o    o| 38 GND
 GP2  4 |o    o| 37 3V3_EN
 GP3  5 |o    o| 36 3V3(OUT)
 GP4  6 |o    o| 35 ADC_VREF
 GP5  7 |o    o| 34 GP28 / ADC2
 GND  8 |o    o| 33 AGND
 GP6  9 |o    o| 32 GP27 / ADC1
 GP7 10 |o    o| 31 GP26 / ADC0
 GP8 11 |o    o| 30 RUN
 GP9 12 |o    o| 29 GP22
 GND 13 |o    o| 28 GND
GP10 14 |o    o| 27 GP21
GP11 15 |o    o| 26 GP20
GP12 16 |o    o| 25 GP19
GP13 17 |o    o| 24 GP18
 GND 18 |o    o| 23 GND
GP14 19 |o    o| 22 GP17
GP15 20 |o    o| 21 GP16
  • VBUS (pin 40) is the 5 V from the USB cable; useful to power 5 V modules while on USB.
  • VSYS (pin 39) is the main input to the onboard regulator; you can feed roughly 1.8 V to 5.5 V here from batteries.
  • 3V3(OUT) (pin 36) is the regulated 3.3 V output for sensors; keep the load modest.
  • ADC_VREF and AGND (pins 35 and 33) are the analog reference and analog ground for the ADC.

Which Board Should You Buy?

For learning GPIO, PWM, ADC, I2C and motors, the plain Pico is enough and is the cheapest option. If your project needs to send data to a phone, a web dashboard or an MQTT broker, buy the Pico W or Pico 2 W; the wireless chip is on the board, so you do not need an ESP8266 module. Choose the Pico 2 family when you need more RAM, faster floating-point maths (for example filters or sensor fusion), more PIO state machines, or secure boot.

The "H" versions (Pico H, Pico WH and so on) come with headers already soldered, which is convenient for breadboard work.

Common Mistakes When Starting Out

  • Using the physical pin number in code, for example writing Pin(20) when the wire is on physical pin 20, which is actually GP15.
  • Expecting Pin(25) to blink the LED on a Pico W. On the W boards the LED is wired to the wireless chip, so use Pin("LED") in MicroPython.
  • Flashing Pico firmware onto a Pico 2 or the reverse. Each board needs its own UF2 file because the chips are different.
  • Driving motors or relays straight from a GPIO pin. The pins can supply only a few milliamps; use a transistor or driver module.

Summary

The Pico family gives you a dual-core microcontroller, flexible PIO hardware and a clean 40-pin layout at a very low price. The RP2040 boards (Pico and Pico W) are mature and widely documented; the RP2350 boards (Pico 2 and Pico 2 W) add faster cores, double the RAM and more PIO. Learn the difference between physical pins and GPIO numbers, remember that everything is 3.3 V, and note where your board's LED is connected. In the next tutorial you will install MicroPython with Thonny and run your first program.