feat(uno-q): bundle the granular skill set alongside arduino-uno-q on every node

Vendors the fork's 11 granular UNO Q skills (bridge, flashing, led-matrix,
uno-q-hardware, sketch-patterns, modulino, linux-led, audio, vision, wireless,
arduino-app-lab) next to the comprehensive arduino-uno-q skill, and installs the
whole set into every agent's workspace on each board.

Why both: the comprehensive skill is the rich cloud reference (read_skill →
references); the granular skills are keyword-triggered and match the fork's eager
skill-inliner rules, so the on-board Qwen auto-inlines them (no read_skill
round-trip). flashing + led-matrix carry the exact uno_q_flash + frame-API /
ArduinoGraphics-not-installed detail that makes flashing reliable.

- push-skill.sh generalized: a single skill dir (has SKILL.md) OR a parent dir
  installs every skill under it; provision-fleet now ships all of skills/.
- Verified on board 65301572: cloud/Sonnet-5 lists all 12 skills.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Omar Sobh
2026-07-16 09:32:11 -07:00
co-authored by Claude Opus 4.8
parent d2135a1938
commit 62c435c648
14 changed files with 555 additions and 37 deletions
+89
View File
@@ -0,0 +1,89 @@
---
name: led-matrix
description: Drive the Arduino Uno Q's built-in 13x8 blue LED matrix — draw frames with the always-bundled Arduino_LED_Matrix frame API, or scroll text with ArduinoGraphics when it's installed. Load this whenever the user mentions the LED matrix, drawing pixels, or displaying words on the board.
---
# Uno Q Built-in LED Matrix
The Uno Q has a built-in **13 columns × 8 rows** (104-pixel) **blue** LED matrix,
driven by the STM32U585 MCU. (It is NOT an LCD, and NOT red.)
## Prefer the frame API (always available)
`Arduino_LED_Matrix` is bundled with the `arduino:zephyr` core — **no lib install**.
The **frame API** works on every core version and is the safe default. A frame is
**four `uint32_t` words** (128 bits; the first 104 map to the pixels). `loadFrame`
displays one:
```cpp
#include "Arduino_LED_Matrix.h"
Arduino_LED_Matrix matrix;
const uint32_t FULL[4] = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}; // all on
const uint32_t BLANK[4] = {0, 0, 0, 0}; // all off
void setup() {
matrix.begin(); // REQUIRED — without it the matrix stays dark
}
void loop() {
matrix.loadFrame(FULL);
delay(500);
matrix.loadFrame(BLANK);
delay(500);
}
```
- `matrix.loadFrame(const uint32_t[4])` — show a raw frame.
- `matrix.renderBitmap(bitmap, rows, cols)` — show an 8×13 `uint8_t` bitmap (1 = on).
- The matrix is **charlieplexed**: the MCU must keep running to refresh it. If the
sketch halts or stops driving it, the display freezes/goes dark — a *static*
pattern that never changes usually means the sketch isn't running (see `flashing`).
## Scrolling text (needs `ArduinoGraphics` — install it first)
Text scrolling needs `ArduinoGraphics`. On core 0.51.0 the matrix lib includes it
**conditionally** (`__has_include`), so it is NOT present by default — a scroll
sketch fails with `'endText'/'SCROLL_LEFT' not declared`. Install it once (needs
network), then it stays available offline:
```
arduino-cli lib install ArduinoGraphics # run with TMPDIR=/tmp on the Uno Q
```
Verified working sketch on core 0.51.0 with ArduinoGraphics@1.1.5 (compiles to ~7.6 KB):
```cpp
#include "ArduinoGraphics.h" // MUST come before Arduino_LED_Matrix.h (defines SCROLL_LEFT)
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix; // ArduinoLEDMatrix and Arduino_LED_Matrix are aliases
void setup() {
matrix.begin();
matrix.textFont(Font_5x7); // fits the 8-row height
matrix.textScrollSpeed(80); // ms per step; lower = faster
}
void loop() {
matrix.beginText(0, 1, 0xFF, 0xFF, 0xFF); // x, y, R, G, B — the 5-arg form
matrix.print(" HELLO UNO Q "); // pad with spaces so it scrolls in and out
matrix.endText(SCROLL_LEFT);
delay(200);
}
```
If installing a library isn't an option (fully offline, no network ever), scroll a
hand-rendered font with the frame API instead: build an 8×N `uint8_t` bitmap of the
message and `renderBitmap(window, 8, 13)` a sliding 13-column window each step.
## Pitfalls
- **`ArduinoGraphics` may be absent** (core 0.51.0) — prefer the frame API; only use
the text API when the sketch is known to compile against a core that bundles it.
- Always call `matrix.begin()` in `setup()`, or the matrix stays dark.
- Include order for the text path: `ArduinoGraphics.h` **before** `Arduino_LED_Matrix.h`.
- Use the **5-argument** `beginText(x, y, R, G, B)` form; the 3-arg form is a
training-data artifact.
- It's a monochrome **blue** matrix — RGB args only set on/off, not hue.