Developer

Heron Hardware Pinout

Version: Phase 1 Breadboard Prototype Date: 2026-07-09

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

RailBreadboard ColumnSourceJumper
3V3RedPico Pin 36 (3V3 OUT)i5
GNDBluePico Pin 3 (GND)b3

Breadboard Row-by-Row Pinout

USB port faces Row 1. Pico straddles the center groove.

RowLeft Side (a-e)Right Side (f-j)Connected To / Notes
1Pico Pin 1 (GP0)Pico Pin 40 (VBUS)i1 connects to UPS VBUS
2Pico Pin 2 (GP1)Pico Pin 39 (VSYS)i2 connects to UPS VSYS
3Pico Pin 3 (GND)Pico Pin 38 (GND)b3 connects to Blue Rail (GND)
4Pico Pin 4 (GP2)Pico Pin 37 (3V3_EN)b4 connects to b16 (OLED SDA)
5Pico Pin 5 (GP3)Pico Pin 36 (3V3 OUT)b5 connects to b15 (OLED SCL); i5 connects to Red Rail
6Pico Pin 6 (GP4)Pico Pin 35 (ADC_VREF)
7Pico Pin 7 (GP5)Pico Pin 34 (GP28)
8Pico Pin 8 (GND)Pico Pin 33 (GND)
9Pico Pin 9 (GP6)Pico Pin 32 (GP27)b9 connects to UPS GP6 (SDA)
10Pico Pin 10 (GP7)Pico Pin 31 (GP26)b10 connects to UPS GP7 (SCL)
11Pico Pin 11 (GP8)Pico Pin 30 (RUN)
12Pico Pin 12 (GP9)Pico Pin 29 (GP22)
13OLED GND (a13) / Pico Pin 13 (GND)Pico Pin 28 (GND)b13 connects OLED GND to Blue Rail
14OLED VCC (a14) / Pico Pin 14 (GP10)Pico Pin 27 (GP21)b14 connects OLED VCC to Red Rail
15OLED SCL (a15) / Pico Pin 15 (GP11)Pico Pin 26 (GP20)b15 connects to b5 (Pico GP3)
16OLED SDA (a16) / Pico Pin 16 (GP12)Pico Pin 25 (GP19)b16 connects to b4 (Pico GP2)
17Pico Pin 17 (GP13)Pico Pin 24 (GP18)
18Pico Pin 18 (GND)Pico Pin 23 (GND)
19Pico Pin 19 (GP14)Pico Pin 22 (GP17)
20Pico Pin 20 (GP15)Pico Pin 21 (GP16)b20 connects to b25 (Buzzer +)
21-24EmptyEmpty
25Buzzer (+) at e25EmptyJumper from b25 to b20 (GP15)
26-27EmptyEmpty
28Buzzer (-) at e28EmptyJumper from b28 to Blue Rail (GND)

Pin Assignments Summary

Pico PinGPIOFunctionDestination
3GNDGNDBlue rail
4GP2I2C1 SDAOLED SDA (via b4 to b16)
5GP3I2C1 SCLOLED SCL (via b5 to b15)
9GP6I2C0 SDAUPS B SDA (via b9)
10GP7I2C0 SCLUPS B SCL (via b10)
20GP15PWMBuzzer (+) (via b20 to b25)
363V3PowerRed rail (via i5)
38GNDGND

Peripherals

OLED Display (I2C1, GP2/GP3)

SignalBreadboardPico Pin
GNDa13 -> Blue rail3 (GND)
VCCa14 -> Red rail5 (3V3)
SCLa15 -> b55 (GP3)
SDAa16 -> b44 (GP2)

Address: 0x3C. Library: ssd1306 via MicroPython. I2C bus 1 at 400kHz.

Passive Buzzer (PWM, GP15)

SignalBreadboardPico Pin
(+)e25 -> b25 -> b2020 (GP15)
(-)e28 -> Blue rail3 (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 PinFunctionConnected To
Pin 40 (VBUS)Charging inputBreadboard i1 (Pico VBUS row)
Pin 39 (VSYS)System powerBreadboard i2 (Pico VSYS row)
Pin 38 (GND)GroundBlue rail (GND)
Pin 9 (GP6)I2C0 SDABreadboard b9 (Pico GP6 row)
Pin 10 (GP7)I2C0 SCLBreadboard 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

BusSDASCLDevicesFreq
I2C0GP6GP7INA219 (0x43, UPS B)400kHz
I2C1GP2GP3SSD1306 (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.