Lumware
Software para tiras de luz programables. Un host Python decodifica medios, aplica el pipeline de color y envía frames por USB serie 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 a 299 LEDs (RGB), sostingut en transport
virtual; la mesura amb hardware real és pendent (perf spike, Epic 04). - Wire baud 500 000, frames binaris amb CRC8.
- Frame budget host ~8 ms, latency p99 < 12 ms (host → photon): objectius de disseny, encara no mesurats sobre Arduino.
- 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.
Serie completa
Qué es Lumware
Empecé queriendo hacer parpadear unos LEDs. He acabado diseñando una familia de software para tiras de luz programables.
De script a producto
Había un script de 200 líneas. Funcionaba. Ahí no acababa la historia — sin el paso siguiente, no habría familia.
La electrónica mínima para encender una tira
Seis componentes. Si falta uno, los síntomas engañan: primeros LEDs bien, después color aleatorio. Por qué cada pieza es imprescindible.
El firmware: Arduino y timing crítico
El Arduino Uno tiene 2 KB de RAM. Una tira de 300 LEDs son 900 bytes solo de píxeles. Cada decisión es una cuestión de espacio.
Por qué un protocolo binario (y no JSON)
La opción fácil era JSON. También era la que hacía imposible el target de 30 FPS. Un protocolo binario de seis bytes de overhead resuelve el cuello de botella.
Arquitectura del host: events, settings, scheduler
Tres decisiones cambiaron cómo pensé el host. Ninguna es espectacular por separado. Juntas, hacen toda la diferencia.
BMAD: planificar antes de escribir código
Si escribo código directamente, me pierdo a la tercera semana. Si planifico de más, me pierdo antes. Tuve que aprender a planificar sin ahogarme planificando.
Identidad: spectrum R/G/B/W
El nombre tardó más en salir que la arquitectura. Pero cuando salió, todo encajó — hasta los colores de la marca.
La UI web local: FastAPI dentro de la app
Un mando físico sería óptimo. Construirlo, no. Puse la UI en el navegador y la hice accesible desde cualquier dispositivo de la red.
Framerate real: benchmarks y bottlenecks
El techo teórico es una cosa. Lo que mides es otra. La diferencia entre ambos es donde vive el trabajo pendiente.