Bring the five-panel hex portal online with a browser 3D/schematic preview, Pi SPI backends, and renamed multi-panel Pico UDP firmware. Co-authored-by: Cursor <cursoragent@cursor.com>
67 lines
1.8 KiB
Markdown
67 lines
1.8 KiB
Markdown
# Portal Pico firmware (Pico SDK)
|
||
|
||
C firmware for a **Pico + W5500 + WS2812** panel adapter under `firmware/pico/`.
|
||
Replaces the CircuitPython `adapter/code.py` path with native UDP + PIO WS2812.
|
||
|
||
## Hardware
|
||
|
||
| Signal | GPIO |
|
||
|--------|------|
|
||
| W5500 CS | GP9 |
|
||
| SPI1 SCK | GP10 |
|
||
| SPI1 MOSI | GP11 |
|
||
| SPI1 MISO | GP12 |
|
||
| W5500 RST | GP13 |
|
||
| Status LED | GP25 |
|
||
| WS2812 strip 0 | GP28 |
|
||
| WS2812 strip 1 | GP27 |
|
||
|
||
**Two strips** per Pico. Pixel count comes from each UDP frame.
|
||
`MAX_LEDS` (512) is capacity only — edit `board_config.h` to raise it.
|
||
|
||
## Build
|
||
|
||
```bash
|
||
# From repo root
|
||
make deploy PANEL_ID=0
|
||
make reset && make monitor
|
||
make build
|
||
```
|
||
|
||
Requires [pico-sdk](https://github.com/raspberrypi/pico-sdk) and `arm-none-eabi-gcc`.
|
||
UF2: `firmware/pico/build/panel.uf2`.
|
||
|
||
## Options
|
||
|
||
```bash
|
||
make deploy PANEL_ID=0 # 10.1.1.10
|
||
make deploy PANEL_ID=1 # 10.1.1.11
|
||
make deploy PANEL_ID=0 NO_DHCP=0
|
||
make deploy PANEL_ID=0 WS2812_PIN=26 WS2812_PIN1=28
|
||
```
|
||
|
||
| Panel | IP | MAC |
|
||
|-------|-----|-----|
|
||
| 0 | 10.1.1.10 | 02:50:52:54:4C:00 |
|
||
| 1 | 10.1.1.11 | 02:50:52:54:4C:01 |
|
||
| … | … | … |
|
||
| 4 | 10.1.1.14 | 02:50:52:54:4C:04 |
|
||
| 255 (bench) | 10.1.1.19 | 02:50:52:54:4C:FF |
|
||
|
||
## UDP protocol (port 50007)
|
||
|
||
| Payload | Action |
|
||
|---------|--------|
|
||
| **N×3 bytes** | Raw RGB → strip 0 |
|
||
| **1 + N×3 bytes** | `strip_id` + RGB (`0`/`1`, or `255` = all) |
|
||
| **5 bytes `PIN\\0` + gpio** | Bind strip 0 |
|
||
| **8 bytes `PIN\\0` + strip + gpio + len_lo + len_hi** | Bind strip (optional LED hint) |
|
||
| **4 bytes `SHOW`** | Reserved |
|
||
|
||
```bash
|
||
# Both strips on one Pico (strip0=GP28, strip1=GP27)
|
||
pipenv run python examples/panel_color_test.py --panel-index 0 --pins 28:405,27:351
|
||
```
|
||
|
||
Pi sends logical **RGB**. Firmware converts to **GRB** on the wire (`FORMAT_GRB`).
|