Phyduino Board Support - Hardware checklist

Run before every release on a real board, and after core changes in the area. Sketches are in tests/sketches/ and platform/libraries/*/examples/. The checklist itself lives in tests/hardware-checklist.md; results are recorded in the changelog.

v0.1.1-rc.1 Phyduino Pico 40 passed 0 to run

Phyduino Pico

1 · (any sketch) New board: SW1 to GND, reset, upload, SW1 backSketch runs; later uploads work with no buttons Passed 10-05
2 · blink No wiringLED blinks at 1 Hz Passed 10-05
3 · sdk_only_blink No wiringLED blinks at 2 Hz (pico-sdk calls only) Passed 10-05
4 · serial_echo Serial Monitor at 115200Banner appears; typed text echoes back Passed 10-05
5 · (any sketch) Upload twice from the IDESecond upload works without touching the board (1200-baud touch, then copy to RPI-RP2) Passed 10-05
5b · (any sketch) Board already in BOOTSEL (RPI-RP2 drive showing, no port)Upload without a port still works, using the IDE Upload button (tested with the IDE's built-in Blink example) Passed 10-09
6 · analog_read Jumper AREF (2.048 V) to each of A0–A5 in turn
 Phyduino Pico
 ┌───────────────┐
 │ AREF 2.048 V ●├──┐ jumper
 │ A0           ●├──┘
 │ A1           ●│
 │ A2           ●│   move the jumper's free end
 │ A3           ●│   to A0, then A1 … A5,
 │ A4           ●│   one input at a time
 │ A5           ●│
 └───────────────┘
A0–A2 ≈ 2540 (3.3 V scale), A3–A5 = 4095 (2.048 V scale); only the jumpered input changes
Passed 10-05
7 · pwm_fade No wiringLED fades smoothly up and down Passed 10-05
8 · interrupts Button D2 → GND
 Phyduino Pico
 ┌──────────────┐        button
 │ D2          ●├───────o  o──────┐
 │              │                 │
 │ GND         ●├─────────────────┘
 └──────────────┘
Count goes up once per press
Passed 10-05
9 · tone_test Piezo on D8
 Phyduino Pico          piezo
 ┌──────────────┐      ┌─────┐
 │ D8          ●├──────┤+    │
 │ GND         ●├──────┤-    │
 └──────────────┘      └─────┘
Eight-note scale
Passed 10-09
9b · tone_loopback Wire D8 → D2 (no buzzer needed)
 Phyduino Pico
 ┌──────────────┐
 │ D8          ●├──┐
 │              │  │ jumper
 │ D2          ●├──┘
 └──────────────┘
Measured ≈ set frequency, duty ≈ 50 %; timed tone playing at 100 ms, stopped at 300 ms
Passed 10-05
10 · uart_loopback Wire D1 → D0
 Phyduino Pico
 ┌──────────────┐
 │ D1 TX       ●├──┐
 │              │  │ jumper
 │ D0 RX       ●├──┘
 └──────────────┘
Counter values echo in the Serial Monitor
Passed 10-05
10b · uart2_loopback Wire D4 → D5
 Phyduino Pico
 ┌──────────────┐
 │ D4 TX       ●├──┐
 │              │  │ jumper
 │ D5 RX       ●├──┘
 └──────────────┘
Counter values echo in the Serial Monitor (Serial2)
Passed 10-05
11 · SpiLoopback Wire D11 → D12
 Phyduino Pico
 ┌──────────────┐
 │ D11 MOSI    ●├──┐
 │              │  │ jumper
 │ D12 MISO    ●├──┘
 └──────────────┘
received == sent
Passed 10-05
12 · I2CScanner Any I2C device on SDA / SCL
 Phyduino Pico              I2C device (3.3 V)
 ┌──────────────────┐       ┌──────────┐
 │ 3.3V            ●├───────┤ VIN      │
 │ GND             ●├───────┤ GND      │
 │ SDA (D18,GPIO24)●├───────┤ SDA      │
 │ SCL (D19,GPIO25)●├───────┤ SCL      │
 └──────────────────┘       └──────────┘
   No pull-ups on the Phyduino; most breakouts have their own.
Its address is listed (found BMP280 at 0x77, seesaw encoder at 0x36)
Passed 10-08
13 · PeripheralReceiver Second board running i2c_controller on SDA / SCL / GND (e.g. a Raspberry Pi Pico 2; 5 V boards such as the UNO R4 need a level shifter)
 Raspberry Pi Pico 2                Phyduino Pico
 (i2c_controller)                   (PeripheralReceiver, 0x42)
 ┌────────────────┐                 ┌───────────────────┐
 │ pin 6  GP4 SDA●├─────────────────┤● SDA (D18, GPIO24)│
 │ pin 7  GP5 SCL●├─────────────────┤● SCL (D19, GPIO25)│
 │ pin 8  GND    ●├─────────────────┤● GND              │
 └────────────────┘                 └───────────────────┘

 Pull-ups (were needed), anywhere on the bus:

   3.3 V ──┬────────┐
         [4.7k]   [4.7k]
           │        │
          SDA      SCL

   Don't join the 3V3 pins of the two boards.
   5 V controllers (e.g. UNO R4) need a level shifter.
“hello N” lines print; controller reads a rising counter (tested with a Raspberry Pi Pico 2)
Passed 10-08

CPU Speed

17 · cpu_speed Tools > CPU Speed at 50, 133 (default) and 200 MHz; Serial Monitor at 115200LED blinks at 1 Hz; sys = F_CPU; peri = sys up to 133 MHz, 48 MHz above; vreg 1.15 V above 133 MHz, else 1.10 V; delay(1000) ≈ 1000000 us; loop time ∝ 1/F_CPU (got 243060 / 90680 / 60204 us) Passed 10-09
18 · analog_read CPU Speed 200 MHz; a known voltage under 2.048 V on A3 (e.g. a 1.5 V cell, a divider from 3.3 V, or the Analog Shield's temperature front end). Checks the MAX11635 start-conversion pulse is still long enough at the fastest clock
 Phyduino Pico                 potentiometer (10 kΩ)
 ┌───────────────┐             ┌───────┐
 │ AREF 2.048 V ●├─────────────┤ end   │
 │ A3           ●├─────────────┤ wiper │
 │ GND          ●├─────────────┤ end   │
 └───────────────┘             └───────┘
   Set it anywhere, then leave it. Or: a 1.5 V cell
   (+ to A3, − to GND), or the Analog Shield's
   temperature front end on A3.
A3 reads the applied voltage (reading × 2.048 / 4095), same as at 133 MHz (Analog Shield temperature front end on A3: 2783 at 133 MHz, 2788 at 200 MHz, 2790 at 133 MHz again ≈ 1.39 V; steady within each run, the small rise is sensor drift)
Passed 10-09

USB-PD

14 · usbpd_status Tools > USB-PD Power: Up to 20 V. USB-PD charger that offers 20 V; Pico 2 running serial_bridge passes Serial1 to the PC (usbpd_status mirrors its output to Serial1). Open the Pico 2's Serial Monitor before plugging in the charger, or the “STUSB4500 found” line is missed
 USB-PD charger (20 V)                          PC
        │ USB-C                                  │ USB
        ▼                                        ▼
 ┌────────────────────┐              ┌─────────────────────┐
 │ Phyduino Pico      │              │ Raspberry Pi Pico 2 │
 │ (usbpd_status)     │              │ (serial_bridge)     │
 │ D1 TX (GPIO0)     ●├──────────────┤● GP5 RX  (pin 7)    │
 │ D0 RX (GPIO1)     ●├──────────────┤● GP4 TX  (pin 6)    │
 │ GND               ●├──────────────┤● GND     (pin 8)    │
 │ POK2 / POK3 LEDs   │              └─────────────────────┘
 └────────────────────┘
   Only these three wires: VBUS is 20 V on a 20 V contract.
“STUSB4500 found”; profiles 5.0V/2.0A 9.0V/1.0A 20.0V/0.5A; VBUS ≈ 20 V, POK3 lit (got 20.2 V)
Passed 10-09
15 · usbpd_status Same setup as 14; send 9, then 5, then f
 USB-PD charger (20 V)                          PC
        │ USB-C                                  │ USB
        ▼                                        ▼
 ┌────────────────────┐              ┌─────────────────────┐
 │ Phyduino Pico      │              │ Raspberry Pi Pico 2 │
 │ (usbpd_status)     │              │ (serial_bridge)     │
 │ D1 TX (GPIO0)     ●├──────────────┤● GP5 RX  (pin 7)    │
 │ D0 RX (GPIO1)     ●├──────────────┤● GP4 TX  (pin 6)    │
 │ GND               ●├──────────────┤● GND     (pin 8)    │
 │ POK2 / POK3 LEDs   │              └─────────────────────┘
 └────────────────────┘
   Only these three wires: VBUS is 20 V on a 20 V contract.
VBUS → ≈ 9 V (POK2 lit), → ≈ 5 V, → ≈ 20 V (got 9.1 V, 5.15 V, 20.2 V)
Passed 10-09
16 · usbpd_status Ordinary USB port (no PD)
 PC USB port ──── USB-C ────► Phyduino Pico (usbpd_status)
   5 V only; Serial Monitor at 115200
Contract offer 0, VBUS ≈ 5 V
Passed 10-05
19 · usbpd_nvm New board, once. Tools > USB-PD Power: Use chip's stored settings; Serial Monitor 115200; send r, then write5v; unplug and replug. Keep the printed r output as the board's backupr shows the NVM (ST factory: 3 profiles 5 V/1.5 A, 15 V/1.5 A, 20 V/1.0 A); after write5v the read-back shows 1 profile, 5 V/2.0 A and “OK: verified”; after replugging, usbpd_status (stored settings) shows profiles 5.0V/2.0A (got: factory NVM except sector 0 byte 3 = AB; only sector 3 written, 56 → 72; second board 11-11: same NVM, same result) Passed 10-09, 11-11
20 · usbpd_status After 19: same setup as 14 but Tools > USB-PD Power: Use chip's stored settings; plug in the 20 V charger. Then rebuild with Up to 20 V
 USB-PD charger (20 V)                          PC
        │ USB-C                                  │ USB
        ▼                                        ▼
 ┌────────────────────┐              ┌─────────────────────┐
 │ Phyduino Pico      │              │ Raspberry Pi Pico 2 │
 │ (usbpd_status)     │              │ (serial_bridge)     │
 │ D1 TX (GPIO0)     ●├──────────────┤● GP5 RX  (pin 7)    │
 │ D0 RX (GPIO1)     ●├──────────────┤● GP4 TX  (pin 6)    │
 │ GND               ●├──────────────┤● GND     (pin 8)    │
 │ POK2 / POK3 LEDs   │              └─────────────────────┘
 └────────────────────┘
   Only these three wires: VBUS is 20 V on a 20 V contract.
   Uploads: unplug the charger, then connect the
   Phyduino to the PC.
VBUS ≈ 5 V from plug-in, profiles 5.0V/2.0A; with Up to 20 V, VBUS ≈ 20 V (menu changes working registers only; r in usbpd_nvm still shows 5 V only) (got, second board after its 19: 5.0V/2.0A, offer 1, 5.10 V; Up to 20 V: offer 5, 500 mA, 19.98 V, POK3 lit; r unchanged, sector 3 = 72)
Passed 11-11
27 · UsbPdPower Same setup as 14, but Tools > USB-PD Power: 5 V only (default); send 20, then 9, then 5, then 7
 USB-PD charger (20 V)                          PC
        │ USB-C                                  │ USB
        ▼                                        ▼
 ┌────────────────────┐              ┌─────────────────────┐
 │ Phyduino Pico      │              │ Raspberry Pi Pico 2 │
 │ (UsbPdPower)       │              │ (serial_bridge)     │
 │ D1 TX (GPIO0)     ●├──────────────┤● GP5 RX  (pin 7)    │
 │ D0 RX (GPIO1)     ●├──────────────┤● GP4 TX  (pin 6)    │
 │ GND               ●├──────────────┤● GND     (pin 8)    │
 │ POK2 / POK3 LEDs   │              └─────────────────────┘
 └────────────────────┘
   Only these three wires: VBUS is 20 V on a 20 V contract.
   Commands arrive through the bridge on D0 RX,
   so that wire is needed here.
At start: profiles 5.0V/2.00A, VBUS ≈ 5 V; 20: “Asking for up to 20 V”, profiles 5.0V/2.00A 9.0V/1.00A 20.0V/0.50A, VBUS ≈ 20 V (POK3 lit); 9: VBUS ≈ 9 V (POK2 lit); 5: VBUS ≈ 5 V; 7: “Send 5, 9, 12, 15 or 20.” (got, second board, bridge on Serial2: start 5.0V/2.00A, offer 1, 5.10 V; 20: offer 5, 500 mA, 19.98 V, POK3 lit; 9: offer 2, 1000 mA, 9.00 V, POK2 lit; 5: offer 1, 5.10 V; 7 rejected; also 15: 15.0V/0.66A, offer 4, 14.97 V, then 9 again 9.00 V; each change within one status line)
Passed 11-11

Multicore, FreeRTOS and CMSIS-RTOS2 (v0.1.1)

28 · MulticoreBasics Tools > Operating System: None; Serial Monitor 115200“setup() runs on core 0”, then “loop() on core 0: n” once a second; LED flashes 100 ms on, 400 ms off at the same time Passed 10-19
29 · MulticoreFifo As 28LED blinks at 2 Hz throughout; four answers in order: 168, 1229, 9592, 78498 primes, the last about 20 s after the third (133 MHz) Passed 10-19
30 · multicore_idle As 28“PASS” once a second; echo = round + 1; count while idle +0, after resume a large number; LED blinks Passed 10-19
31 · multicore_idle, MulticoreBasics As 28 and 30, but Tools > Operating System: FreeRTOS (SMP)Same results as 28 and 30 Passed 10-19
32 · FreeRtosTasks FreeRTOS; Serial Monitor 115200LED toggles every 250 ms; “countTask on core 0/1: n” once a second; every 5 s a list with loop, blink, count, IDLE0, IDLE1, Tmr Svc; Cores 0x1 for loop, 0xffffffff for blink and count; no task's Stack column near 0 Passed 10-19
33 · FreeRtosQueue FreeRTOS; potentiometer wiper (or AREF) on A0
 Phyduino Pico                 potentiometer (10 kΩ)
 ┌───────────────┐             ┌───────┐
 │ 3.3V         ●├─────────────┤ end   │
 │ A0           ●├─────────────┤ wiper │
 │ GND          ●├─────────────┤ end   │
 └───────────────┘             └───────┘
   Or a jumper from AREF to A0 (as in 6).
A line every 100 ms, times 100 ms apart; A0 matches AnalogMillivolts; no “Queue full” (got, with the sketch's A0 changed to A3 for the wiring: 100 lines in 10 s all exactly 100 ms apart, A3 1804–1807 mV against 1803 mV in AnalogMillivolts, no “Queue full”)
Passed 10-22
34 · serial_echo FreeRTOS; type, then Upload another sketch with the port selectedEcho works; the IDE's 1200-baud reset still starts the upload (no BOOTSEL button) Passed 10-19
35 · CmsisRtos2Threads Tools > Operating System: FreeRTOS (SMP) + CMSIS-RTOS2; potentiometer wiper (or AREF) on A0
 Phyduino Pico                 potentiometer (10 kΩ)
 ┌───────────────┐             ┌───────┐
 │ 3.3V         ●├─────────────┤ end   │
 │ A0           ●├─────────────┤ wiper │
 │ GND          ●├─────────────┤ end   │
 └───────────────┘             └───────┘
   Or a jumper from AREF to A0 (as in 6).
“Kernel: FreeRTOS V11.1.0+”; LED flashes once a second (100 ms on); a line every 100 ms, times 100 ms apart; A0 matches AnalogMillivolts; no “Queue full” (got, with the sketch's A0 changed to A3 for the wiring: “Kernel: FreeRTOS V11.1.0+”, LED flashing once a second, 100 lines in 10 s all exactly 100 ms apart, A3 1804–1808 mV against 1803 mV in AnalogMillivolts, no “Queue full”)
Passed 10-22
36 · FreeRtosTasks, MulticoreBasics As 35 (CMSIS-RTOS2 option)Same results as 32 and 28, except that Prio is 23 for loop and 55 for Tmr Svc Passed 10-19

Analog acquisition (Phyduino examples)

21 · AnalogMillivolts AREF jumper to each of A0–A5 in turn (as in 6); Serial Monitor 115200
 Phyduino Pico
 ┌───────────────┐
 │ AREF 2.048 V ●├──┐ jumper
 │ A0           ●├──┘
 │ A1           ●│
 │ A2           ●│   move the jumper's free end
 │ A3           ●│   to A0, then A1 … A5,
 │ A4           ●│   one input at a time
 │ A5           ●│
 └───────────────┘
Full scale 3300 mV for A0–A2, 2048 mV for A3–A5; the jumpered pin reads ≈ 2048 mV on A0–A2 and ≈ 2047 mV on A3–A5 (got A0 2029–2058, A1 2035–2039, A2 2036–2041 mV, about 0.5 % low; A3, A4, A5 2047 mV)
Passed 10-21
22 · AnalogAveraging Potentiometer across 3.3 V and GND, wiper on A0; a second potentiometer across AREF and GND, wiper on A3; Serial Monitor 115200. Not AREF on A0 or a 3.3 V potentiometer on A3: each then follows the other ADC's reference and carries the slow ≈ 1 % drift of the 3.3 V rail, which averaging cannot remove
 Phyduino Pico                 potentiometer 1 (A0: 0–3.3 V)
 ┌───────────────┐             ┌───────┐
 │ 3.3V         ●├─────────────┤ end   │
 │ A0           ●├─────────────┤ wiper │
 │               │          ┌──┤ end   │
 │               │          │  └───────┘
 │ GND          ●├──────────┤  potentiometer 2 (A3: 0–2.048 V)
 │               │          │  ┌───────┐
 │               │          └──┤ end   │
 │ A3           ●├─────────────┤ wiper │
 │ AREF 2.048 V ●├─────────────┤ end   │
 │               │             └───────┘
 └───────────────┘
   10 kΩ potentiometers; set each anywhere, then leave it.
Spread shrinks as averaging rises from 1 to 32: clearly on A0 (≈ 10 → 1), only slightly on A3 (the MAX11635 is already quiet, ≈ 5 → 3) (got A0 spread 8–11, 4–5, 2–3, 2, 1–2 counts; A3 4–5, 7, 6, 4, 3. With AREF on A0 and a 3.3 V potentiometer on A3 the spread stayed 20–55 counts at every setting)
Passed 10-21
23 · AnalogDifferential Potentiometer wiper on A3 and A0 (one potentiometer for both, or one each; keep A3 under 2.048 V, e.g. a potentiometer across AREF and GND), A4 and A1 to GND; turn from 0 V up
 Phyduino Pico                 potentiometer (10 kΩ)
 ┌───────────────┐             ┌───────┐
 │ AREF 2.048 V ●├─────────────┤ end   │
 │ A3           ●├──────────┬──┤ wiper │
 │ A0           ●├──────────┘┌─┤ end   │
 │ A4           ●├──┐        │ └───────┘
 │ A1           ●├──┤        │
 │ GND          ●├──┴────────┘
 └───────────────┘
   One potentiometer for both pairs:
   A3 − A4 and A0 − A1 both read the wiper.
A3 − A4 matches A3 in AnalogMillivolts, below and above 1024 mV (above it, two readings); A0 − A1 matches A0 (got A3 − A4 870 and 1799 mV against A3 875 and 1802 mV, a few mV lower with the sketch's averaging 16; A0 − A1 1048 mV against A0 1058 − A1 8 mV; one potentiometer each)
Passed 10-21
24 · AnalogReadMultiple Serial Plotter 115200; AREF jumper to one analog pin at a time, or known, different voltages on several pins at once (e.g. the wiring of 23)
 Phyduino Pico
 ┌───────────────┐
 │ AREF 2.048 V ●├──┐ jumper
 │ A0           ●├──┘
 │ A1           ●│
 │ A2           ●│   move the jumper's free end
 │ A3           ●│   to A0, then A1 … A5,
 │ A4           ●│   one input at a time
 │ A5           ●│
 └───────────────┘
   Or the wiring of 23 (traces A0, A1, A3, A4 at once).
Six traces, ≈ 20 lines a second; only the jumpered pin's trace rises to ≈ 2048 mV (or each trace matches that pin in AnalogMillivolts) (got, wired as 23: A0 1056, A1 8, A3 1801, A4 0 mV, each matching AnalogMillivolts; 59 lines in 3 s)
Passed 10-21
25 · AnalogBurst Wire D2 → A0 (sketch plays 500 Hz on D2)
 Phyduino Pico
 ┌──────────────┐
 │ D2          ●├──┐
 │              │  │ jumper (500 Hz square wave, 0–3.3 V)
 │ A0          ●├──┘
 └──────────────┘
Plot shows a clean square wave, 40 samples per period; "Rate 20000 Hz"; mean ≈ 2048 (1950–2050: 500 samples are 12.5 periods, so it depends on where the burst starts) (got "Rate 20000 Hz", exactly 40 samples per period every time, duty 48–50 %, levels 9–11 and 4067–4080, no samples mid-edge, mean 1961–2050)
Passed 10-21
25b · AnalogBurst As 25, but PIN = A3, RATE_HZ = 200000 (MAX11635 clock mode 11); D2 → A3 through 10 kΩ, 10 kΩ from A3 to GND (1.65 V)
 Phyduino Pico
 ┌──────────────┐
 │ D2          ●├────[10k]────┐
 │ A3          ●├─────────────┤   A3: 0 V / ≈ 1.65 V at 500 Hz
 │ GND         ●├────[10k]────┘
 └──────────────┘
   The divider keeps A3 under its 2.048 V full scale.
Square wave between ≈ 0 and ≈ 3200–3300 counts (1.60–1.65 V, resistor tolerance); edges settle within ~8 samples (divider and the input filter); flat parts steady, with no isolated spikes or jumps by powers of two (those would mean misaligned result bytes); "Rate 197916 Hz" (nearest SPI clock to 200000); every burst the same. Rate / 500 ≈ 396 samples per period (edges ≈ 198 samples apart; 181 would mean the SPI is back in mode 0, which adds a gap between frames) (got lowest 0, highest 3234–3252, edges exactly 198 samples apart, no glitches in 2000 samples; on 10-21, before the fix, 181 apart)
Passed 10-22
26 · AnalogBurstBackground Steady voltage under 2.048 V on A3 (e.g. potentiometer); Serial Monitor 115200
 Phyduino Pico                 potentiometer (10 kΩ)
 ┌───────────────┐             ┌───────┐
 │ AREF 2.048 V ●├─────────────┤ end   │
 │ A3           ●├─────────────┤ wiper │
 │ GND          ●├─────────────┤ end   │
 └───────────────┘             └───────┘
   Set it anywhere, then leave it.
LED blinks steadily at 2 Hz, from when the Serial Monitor opens (setup() waits for it); ten lines a second; mean matches A3 in AnalogMillivolts, RMS of a few tenths of a mV (got 199 lines in 20 s, mean 1803.9 mV against A3 1801–1806 mV, RMS 0.20–0.23 mV)
Passed 10-21

Notes

Board tested One Phyduino Pico, 2026-10-05, 2026-10-08, 2026-10-09, 2026-10-18, 2026-10-19, 2026-10-21 and 2026-10-22 (dates in the table are 2026). A second Phyduino Pico (COM23) on 2026-11-11 for 19, 20 and 27.
Multicore 28–32, 34, 36 2026-10-19, board on COM5. 29: the 78498 answer took 20.1 s on core 1 at 133 MHz. 30–31: count while idle +0 in every round; after resume about 11 390 counts in 10 ms without FreeRTOS, 10 800–11 100 with it. 36: Prio 23 for loop, 55 for Tmr Svc; least free stack (words) loop 1940, count 902, blink 488; 32 the same with Prio 1 for loop. 34: echo checked in Tera Term (needs DTR on: with it off the board drops everything it sends), then Arduino IDE Upload of Blink with COM5 selected, no button. 33 and 35 were run later and passed on 2026-10-22 (see their rows).
Analog 21–26 2026-10-21, board on COM5. Built with the CMake preset phyduino_pico; UF2 made with picotool 2.0.0, because the installed 2.2.0-a4 crashed on uf2 convert on that PC (see Windows Smart App Control). 3.3 V rail: slow drift of about ±1 % (≈ ±30 mV, from AREF read on A0), seen on A0–A2 whenever the source does not follow the rail. A3 reads lower with averaging, about 7.5 mV at 32 against 1 in every round, with a potentiometer as the source; probably the source impedance, not yet checked with a stiff source. 25b: the MAX11635 clock mode 11 burst sampled at ≈ 181 kHz while it reported 197 916 Hz: in SPI mode 0 the PL022 adds 1.5 SCLK between frames (17.5 per sample, not 16). Fixed 10-22 by running the burst in mode 3 (the chip accepts either); passed 10-22.
A3–A5 pull-downs On this board R47–R49 (100 kΩ) appear not to be connected, so unconnected A3–A5 inputs float. Hardware, not firmware.
Windows Smart App Control Blocks the unsigned picotool used to build the UF2. Turned off on the development PC; distribution fix still open.
First PD contract current On plugging into a charger the first 20 V contract asks 1000 mA, although the profiles (from the chip's NVM) read 20 V/0.5 A; after setProfiles() renegotiates it asks 500 mA. Cause not known yet.
Pico 2 used for 13–15, 20, 27 Its GP0 (pin 1) does not transmit, so for 14–15 the bridge used Serial1.setTX(12) (pin 16) instead. That board only; a working Pico 2 could use GP0/GP1. On 2026-11-11, rebuilt with arduino-pico 6.3.2, Serial1 sent nothing from GP12 either (loopback test), while Serial2 on GP4/GP5 worked both ways; serial_bridge now uses Serial2 (GP4 TX pin 6, GP5 RX pin 7), as the diagrams show.