Lumware
Software per a tires de llum programables. Un host Python decodifica mèdia, aplica el pipeline de color i envia frames per USB sèrie a un Arduino que pinta una tira NeoPixel.
Lumware streams light. Real pixels, real frames, real photons. No mood-lighting heuristics: the colour that hits the LED is the same colour the dashboard previews.
En xifres
- 30 fps sostingut a 299 LEDs (RGB), measured.
- Wire baud 500 000, frames binaris amb CRC8.
- Frame budget host ~8 ms, latency p99 < 12 ms (host → photon).
- Transport
serialper a hardware real; transportvirtualper a desenvolupament sense Arduino — la UI rep exactament els mateixos bytes que rebria la tira.
La família
- Lumware (flagship, aquest hub) —
host → strip. - Lumware Capture —
sensor → host. Repository separat, planejat. - Lumware Stage —
unity ↔ strip. Repository separat, planejat.
Què no és
No automatització de la llar. No mood-lighting. No núvol — viu a
la LAN. No depèn de hardware: el transport virtual arrenca sense
Arduino i les imatges de calibració se sembren soles al primer boot.
Aprofundir
Els deep-dives — un script de 200 línies que es converteix en una família, l’electrònica mínima, el firmware Arduino, el protocol binari, l’arquitectura Python, BMAD i les branques, la identitat spectrum R/G/B/W, la UI web local, els benchmarks — viuen com a sèrie al blog. Cada article enllaça amb l’anterior i el següent dins de la sèrie.
Sèrie completa
Part de Lumware 01/10
Què és Lumware
Vaig començar volent fer parpellejar uns LEDs. He acabat dissenyant una família de software per a tires de llum programables.
Part de Lumware 02/10
De script a producte
Hi havia un script de 200 línies. Funcionava. Aquí no acabava la història — sense la passa següent, no hi hauria família.
L'electrònica mínima per encendre una tira
Sis components. Si en falta un, els símptomes són enganyosos: primers LEDs bé, després color aleatori. Per què cada peça és imprescindible.
Part de Lumware 04/10
El firmware: Arduino i timing crític
L'Arduino Uno té 2 KB de RAM. Una tira de 300 LEDs són 900 bytes només de pixels. Cada decisió és una qüestió d'espai.
Part de Lumware 05/10
Per què un protocol binari (i no JSON)
L'opció fàcil era JSON. També era la que feia impossible el target de 30 FPS. Un protocol binari de sis bytes d'overhead resol el coll d'ampolla.
Part de Lumware 06/10
Arquitectura del host: events, settings, scheduler
Tres decisions van canviar com vaig pensar el host. Cap d'elles és espectacular per separat. Juntes, fan tota la diferència.
Part de Lumware 07/10
BMAD: planificar abans d'escriure codi
Si escric codi directament, em perd a la tercera setmana. Si planifico massa, em perd abans. Vaig haver d'aprendre a planificar sense ofegar-me planificant.
Part de Lumware 08/10
Identitat: spectrum R/G/B/W
El nom va trigar més a sortir que l'arquitectura. Però quan va sortir, tot va encaixar — fins i tot els colors de la marca.
Part de Lumware 09/10
La UI web local: FastAPI dins l'app
Un comandament físic seria òptim. Construir-lo, no. Vaig posar la UI al navegador i la vaig fer servir des de qualsevol dispositiu de la xarxa.
Framerate real: benchmarks i bottlenecks
El sostre teòric és una cosa. El que mesures és una altra. La diferència entre tots dos és on viu la feina pendent.