Heron Hardware Pinout
Overview
Heron Phase 1 is a Raspberry Pi Pico 2 W with three peripherals:
- SSD1306 OLED display (I2C bus 1, GP2/GP3)
- Passive buzzer (PWM, GP15)
- Pico UPS B with INA219 battery monitor (I2C bus 0, GP6/GP7)
All components run at 3.3V. USB port faces Row 1.
The Pico UPS B sits off-board (hardware components prevent flat stacking) and connects via flying-lead F-M jumper wires.
Power Rails
| Rail | Breadboard Column | Source | Jumper |
|---|---|---|---|
| 3V3 | Red | Pico Pin 36 (3V3 OUT) | i5 |
| GND | Blue | Pico Pin 3 (GND) | b3 |
Breadboard Row-by-Row Pinout
USB port faces Row 1. Pico straddles the center groove.
| Row | Left Side (a-e) | Right Side (f-j) | Connected To / Notes |
|---|---|---|---|
| 1 | Pico Pin 1 (GP0) | Pico Pin 40 (VBUS) | i1 connects to UPS VBUS |
| 2 | Pico Pin 2 (GP1) | Pico Pin 39 (VSYS) | i2 connects to UPS VSYS |
| 3 | Pico Pin 3 (GND) | Pico Pin 38 (GND) | b3 connects to Blue Rail (GND) |
| 4 | Pico Pin 4 (GP2) | Pico Pin 37 (3V3_EN) | b4 connects to b16 (OLED SDA) |
| 5 | Pico Pin 5 (GP3) | Pico Pin 36 (3V3 OUT) | b5 connects to b15 (OLED SCL); i5 connects to Red Rail |
| 6 | Pico Pin 6 (GP4) | Pico Pin 35 (ADC_VREF) | |
| 7 | Pico Pin 7 (GP5) | Pico Pin 34 (GP28) | |
| 8 | Pico Pin 8 (GND) | Pico Pin 33 (GND) | |
| 9 | Pico Pin 9 (GP6) | Pico Pin 32 (GP27) | b9 connects to UPS GP6 (SDA) |
| 10 | Pico Pin 10 (GP7) | Pico Pin 31 (GP26) | b10 connects to UPS GP7 (SCL) |
| 11 | Pico Pin 11 (GP8) | Pico Pin 30 (RUN) | |
| 12 | Pico Pin 12 (GP9) | Pico Pin 29 (GP22) | |
| 13 | OLED GND (a13) / Pico Pin 13 (GND) | Pico Pin 28 (GND) | b13 connects OLED GND to Blue Rail |
| 14 | OLED VCC (a14) / Pico Pin 14 (GP10) | Pico Pin 27 (GP21) | b14 connects OLED VCC to Red Rail |
| 15 | OLED SCL (a15) / Pico Pin 15 (GP11) | Pico Pin 26 (GP20) | b15 connects to b5 (Pico GP3) |
| 16 | OLED SDA (a16) / Pico Pin 16 (GP12) | Pico Pin 25 (GP19) | b16 connects to b4 (Pico GP2) |
| 17 | Pico Pin 17 (GP13) | Pico Pin 24 (GP18) | |
| 18 | Pico Pin 18 (GND) | Pico Pin 23 (GND) | |
| 19 | Pico Pin 19 (GP14) | Pico Pin 22 (GP17) | |
| 20 | Pico Pin 20 (GP15) | Pico Pin 21 (GP16) | b20 connects to b25 (Buzzer +) |
| 21-24 | Empty | Empty | |
| 25 | Buzzer (+) at e25 | Empty | Jumper from b25 to b20 (GP15) |
| 26-27 | Empty | Empty | |
| 28 | Buzzer (-) at e28 | Empty | Jumper from b28 to Blue Rail (GND) |
Pin Assignments Summary
| Pico Pin | GPIO | Function | Destination |
|---|---|---|---|
| 3 | GND | GND | Blue rail |
| 4 | GP2 | I2C1 SDA | OLED SDA (via b4 to b16) |
| 5 | GP3 | I2C1 SCL | OLED SCL (via b5 to b15) |
| 9 | GP6 | I2C0 SDA | UPS B SDA (via b9) |
| 10 | GP7 | I2C0 SCL | UPS B SCL (via b10) |
| 20 | GP15 | PWM | Buzzer (+) (via b20 to b25) |
| 36 | 3V3 | Power | Red rail (via i5) |
| 38 | GND | GND |
Peripherals
OLED Display (I2C1, GP2/GP3)
| Signal | Breadboard | Pico Pin |
|---|---|---|
| GND | a13 -> Blue rail | 3 (GND) |
| VCC | a14 -> Red rail | 5 (3V3) |
| SCL | a15 -> b5 | 5 (GP3) |
| SDA | a16 -> b4 | 4 (GP2) |
Address: 0x3C. Library: ssd1306 via MicroPython. I2C bus 1 at 400kHz.
Passive Buzzer (PWM, GP15)
| Signal | Breadboard | Pico Pin |
|---|---|---|
| (+) | e25 -> b25 -> b20 | 20 (GP15) |
| (-) | e28 -> Blue rail | 3 (GND) |
Library: machine.PWM. Non-blocking pattern player: tones are queued as (freq, ms) tuples and advanced in the main loop via buzzer.tick(). No time.sleep_ms() on the hot path.
Tones:
- Boot: 880 Hz, double beep
- DNS query (normal): 1000 Hz, 50 ms
- DNS query (flagged): 2000 Hz, 80 ms
- Low battery: 440 Hz, double beep
- WiFi lost: 500 Hz
Pico UPS B (I2C0, GP6/GP7)
The UPS B sits off-board due to hardware components preventing flat mounting. Connected via flying-lead F-M jumper wires.
| UPS Pin | Function | Connected To |
|---|---|---|
| Pin 40 (VBUS) | Charging input | Breadboard i1 (Pico VBUS row) |
| Pin 39 (VSYS) | System power | Breadboard i2 (Pico VSYS row) |
| Pin 38 (GND) | Ground | Blue rail (GND) |
| Pin 9 (GP6) | I2C0 SDA | Breadboard b9 (Pico GP6 row) |
| Pin 10 (GP7) | I2C0 SCL | Breadboard b10 (Pico GP7 row) |
Chips on board:
- INA219: voltage/current monitor (I2C addr 0x43)
- ETA6003: Li-po switching charger with power path management
- S8261 + FS8205: battery protection (overcharge/discharge, over-current, short circuit)
Battery: 600mAh 3.7V Li-po (not included with UPS B).
INA219 calibration: 32V bus range, gain 8 (320mV shunt), 0.1 ohm shunt resistor, 12-bit 32-sample averaging, continuous mode. Current LSB = 100uA, power LSB = 2mW.
Battery percent: linear map from 3.0V (0%) to 4.2V (100%), clamped. Not a precision fuel gauge -- good enough for status display and low-battery alerts.
Firmware: lib/ups.py. Reads voltage, current, power, and shunt voltage. Exposed via GET /power on the HTTP API. OLED rotates a battery status screen every third cycle.
I2C Bus Map
| Bus | SDA | SCL | Devices | Freq |
|---|---|---|---|---|
| I2C0 | GP6 | GP7 | INA219 (0x43, UPS B) | 400kHz |
| I2C1 | GP2 | GP3 | SSD1306 (0x3C, OLED) | 400kHz |
The OLED and UPS are on separate I2C buses. This is intentional: the OLED driver (ssd1306.py) manages its own I2C instance, and the INA219 needs independent read timing.
~~MicroSD Adapter (SPI0)~~: REMOVED
Removed from BOM 2026-06-18. The adapter was in the pinout but never used in firmware. No mount code, no persistence layer. DNS history lives in RAM (max 150 entries, lost on reboot). The Pico 2 W's 4MB onboard flash can handle persistent storage if needed later. GP16-GP19 are now free.
Power
- Main rail: 3.3V from Pico pin 36 (3V3 OUT) -> Red rail via jumper i5
- Ground: Pico pin 3 (GND) -> Blue rail via jumper b3
- UPS B: receives VBUS and VSYS from Pico pins 40 and 39. The ETA6003 manages battery charging and power path: when USB is connected, the battery charges and the Pico runs on USB power. When USB is disconnected, the battery takes over seamlessly.
Notes
- I2C1 (GP2/GP3) is the default I2C bus for the OLED on Pico 2 W.
- I2C0 (GP6/GP7) is used for the UPS B's INA219. Separate bus, separate driver instance.
- GP15 is PWM-capable. Buzzer uses
PWM.duty_u16()for tone generation with non-blocking pattern queue. - All pins are 3.3V logic. Don't connect 5V signals directly to GPIO.
- GP16-GP19 are free (MicroSD removed from BOM).
- GP0, GP1, GP4, GP5, GP8-GP14, GP20-GP28 are free for future expansion.