Layout fixes (user reported BPM/time were still bumping the header at 0.0.3): - All Y coords below the header divider shifted down 6px: BPM 30->38, time 32->38, bar 44->50, train 52->58, setlist tab 66->72, title 82->88. - GRID_TOP 104 -> 110. Restored the Kit-style footer practice log: - LOG_TOP=218, LOG_ROWH=14, LOG_ROWS=6. - MAXLANES dropped from 6 visible to 4 visible (rowh capped at 26 so the grid doesn't run into the log). Tracks with more lanes still play silently. - _build_scene now appends g_log (with a divider above it). - draw_log() draws the current-track log into the footer; load() + _log_play() + the seam apply path all call it. The Practice-log menu entry is kept for the full scrollable history. Editor diagnostics for the firmware push (the user got chunk-1 ACK then the device's MIDI badge went gray, meaning chunks 2+ never reached it): - editor.html + editor-beta.html _pushFirmware() now logs every MIDI output + input it sees along with which ones _isDevicePort() matched, plus per- chunk send/ACK timing for the first 3 chunks and any failed chunk. - This narrows down whether the failure is (a) wrong-port routing (filter doesn't match the Pimoroni Explorer's name), (b) ACK never arriving back to the host, or (c) chunks sent fine but the device's RX buffer is dropping them. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| app.py | ||
| boot.py | ||
| code.py | ||
| programs.json | ||
| README.md | ||
PM_X-1 "Explorer" — CircuitPython edition (Pimoroni Explorer · RP2350)
The CircuitPython firmware for the Pimoroni Explorer Kit (PIM744),
set up as a self-contained appliance. Sibling to the PM_K-1 build in ../pico-cp/ (the 52Pi EP-0172
kit) — same engine, same program strings, same programs.json, same web editor.
This board is a 2.8″ ST7789V LCD + 6 user buttons + piezo speaker built around an RP2350B (Pico 2 class chip). No touchscreen, no joystick, no RGB LED. Editing is done in the web editor with Live sync on; the device mirrors changes in real time and emits its own play/stop/bpm/sel deltas back.
Hold the device in portrait with the A/B/C buttons along the top and X/Y/Z along the
bottom. The firmware drives the LCD as a 240 × 320 portrait at display.rotation = 270 —
same UI shape as the PM_K-1 Kit, just shorter. If the screen comes up upside-down on your
unit, change DISPLAY_ROTATION near the top of app.py to 90 (or 180 if rotated 180°)
and re-flash.
Controls
| Button | Action |
|---|---|
| A | play / stop |
| B | tap tempo |
| C | menu (Settings / Help / About / Practice log) |
| X | prev track (hold to repeat) |
| Y | tempo −1 (hold to repeat; after ~1.5 s the step grows to −5) |
| Z | next track (hold to repeat) |
| X + Z | tempo +1 (chord; same hold-repeat as Y) |
In a menu: X / Z move the cursor up / down, Y decrements the focused value, A commits or cycles, B = back, C = close.
Install
- Flash CircuitPython for Pico 2 / RP2350. Hold BOOTSEL on the Explorer, plug it in over
USB-C, drop the Pimoroni Explorer (RP2350) CircuitPython
.uf2onto theRP2350drive. ACIRCUITPYdrive appears. - Copy the bundle onto
CIRCUITPY—boot.py,code.py,app.mpy,programs.json,font_s.bin/font_m.bin/font_l.bin,logo.bin/midi.bin/usb.bin,editor.html(offline editor). If an oldapp.pyis on the drive, delete it. - Power-cycle. It boots into appliance mode and runs.
Program it from the web
Open https://metronome.varasys.io in Chrome / Edge / Firefox. The set-list ⋯ menu →
📟 Save to device pushes a programs.json over USB-MIDI; the device persists it and reloads.
Click 🔗 Live sync to mirror edits in real time.
Pin reference
The display, buttons, and audio are wired into the board — no jumpers required. CircuitPython's
official board definition for pimoroni_explorer2350 exposes board.DISPLAY pre-initialized, so
the firmware just uses it.
| Function | GPIO |
|---|---|
| Button A | GP16 |
| Button B | GP15 |
| Button C | GP14 |
| Button X | GP17 |
| Button Y | GP18 |
| Button Z | GP19 |
| Piezo audio (PWM) | GP12 |
| Piezo amp enable | GP13 |
| I²C SDA (QwSTEMMA) | GP20 |
| I²C SCL (QwSTEMMA) | GP21 |
| Display | board.DISPLAY (8080 parallel bus on GP26..GP39, initialized by board.c) |
Calibration (flags at the top of app.py)
- Speaker too loud / quiet: the piezo + amp gain is fixed in hardware.
MUTE_SPEAKERsilences the click;SPEAKER_AUTO_MUTEauto-mutes when a MIDI host is listening. - Buttons feel inverted: the polarity is hard-coded to active-low (pull-up). If a button
fires on release instead of press, check the
BTN_*pin map at the top ofapp.py. - Display orientation: the board's CircuitPython init mounts the panel landscape (320 × 240). If your screen looks rotated, that's a board.c-level thing — file a CircuitPython bug, don't patch the firmware.
If app.py ever errors, CircuitPython prints the traceback on the screen and over USB serial —
send me that.