Proyecto para una pista de carreras con tira LED NeoPixel, dos pulsadores de jugador, selector de modo, telemetria por puerto serie y publicacion MQTT. Incluye tambien un motor sencillo de torneo por eliminatorias.
main/main.ino: firmware Arduino para controlar la carrera, la tira LED, el modo luces y la telemetria serie.bridge/bridge.js: puente Serial -> MQTT. Lee los eventos JSON del Arduino y los publica en topics MQTT.tournament-engine.js: motor de torneo por bracket. Leeplayers.txt, genera los enfrentamientos y publica el estado por MQTT.players.txt: lista de participantes, un jugador por linea.
El sketch usa estos pines por defecto:
| Funcion | Pin |
|---|---|
| Tira NeoPixel | D2 |
| Pulsador jugador 1 | A0 |
| Pulsador jugador 2 | A2 |
| Audio | D3 |
| Switch de modo | D4 |
Los pulsadores y el switch usan INPUT_PULLUP, por lo que se activan conectando el pin a GND.
El switch de modo funciona asi:
- Cerrado: modo luces.
- Abierto: modo carrera.
- Node.js
- npm
- Broker MQTT, por ejemplo Mosquitto en
mqtt://localhost:1883 - Arduino IDE o Arduino CLI
- Libreria Arduino
Adafruit_NeoPixel
Instala las dependencias del motor de torneo:
npm installInstala las dependencias del puente serie/MQTT:
cd bridge
npm installAbre main/main.ino con Arduino IDE, instala Adafruit_NeoPixel, selecciona tu placa y puerto, y sube el sketch.
Valores importantes configurables en el sketch:
MAXLED: numero de LEDs de la pista.DEFAULT_LAPS: vueltas por defecto.TRACK_KM: kilometros por vuelta para calcular telemetria.ACEL,kfytdelay: comportamiento de aceleracion y frenado.CRASH_SPEED_THRESHOLD: velocidad desde la que puede haber accidente.
En Linux:
cd bridge
SERIAL_PORT=/dev/ttyACM0 npm run start:linuxEn Windows:
cd bridge
npm run start:winTambien puedes ejecutar manualmente:
cd bridge
SERIAL_PORT=/dev/ttyUSB0 BAUD_RATE=115200 MQTT_BROKER=mqtt://localhost:1883 node bridge.jsVariables de entorno soportadas:
SERIAL_PORT: puerto serie del Arduino. Por defecto/dev/ttyUSB0.BAUD_RATE: velocidad serie. Por defecto115200.MQTT_BROKER: URL del broker MQTT. Por defectomqtt://localhost:1883.MQTT_USER: usuario MQTT opcional.MQTT_PASS: password MQTT opcional.
El puente publica:
| Topic | Contenido |
|---|---|
openledrace/player/1/km |
Kilometros del jugador 1 |
openledrace/player/1/laps |
Vueltas del jugador 1 |
openledrace/player/1/kmh |
Velocidad del jugador 1 |
openledrace/player/2/km |
Kilometros del jugador 2 |
openledrace/player/2/laps |
Vueltas del jugador 2 |
openledrace/player/2/kmh |
Velocidad del jugador 2 |
openledrace/race/event |
Eventos JSON de carrera |
openledrace/race/status |
Estado retenido de la carrera |
Ejemplo para escuchar eventos:
mosquitto_sub -h localhost -t 'openledrace/#' -v- Pon el switch abierto para entrar en modo carrera.
- El Arduino muestra la salida con una secuencia rojo, naranja y verde.
- Cada jugador pulsa su boton para acelerar.
- Si un jugador supera el umbral de velocidad, puede sufrir un accidente y queda unos segundos en recuperacion.
- Gana quien completa primero el numero de vueltas configurado.
Para abortar una carrera, manten ambos botones pulsados durante 4 segundos.
Con el switch cerrado, la pista entra en modo luces.
Desde el modo luces:
- Manten ambos botones pulsados durante 4 segundos.
- Entra el selector de vueltas.
- Pulsa P1 para subir vueltas.
- Pulsa P2 para bajar vueltas.
- Pulsa ambos botones durante 3 segundos para confirmar.
Edita players.txt con un participante por linea:
Jugador 1
Jugador 2
Jugador 3
Jugador 4Arranca el motor de torneo:
MQTT_BROKER=mqtt://localhost:1883 node tournament-engine.jsEl motor crea un bracket de potencia de 2, resuelve automaticamente los BYE y publica el estado por MQTT.
Topics usados por el torneo:
| Topic | Uso |
|---|---|
openledrace/tournament/state |
Estado completo del torneo, retenido |
openledrace/tournament/command |
Comandos JSON de entrada |
openledrace/tournament/event |
Eventos del torneo |
openledrace/tournament/mode |
Modo actual, retenido |
Marcar ganador:
mosquitto_pub -h localhost -t openledrace/tournament/command -m '{"action":"set_winner","matchId":"r1-m1","winner":"Jugador 1"}'Cambiar modo:
mosquitto_pub -h localhost -t openledrace/tournament/command -m '{"action":"set_mode","mode":"race"}'Pedir estado:
mosquitto_pub -h localhost -t openledrace/tournament/command -m '{"action":"get_state"}'Reiniciar torneo o recargar jugadores:
mosquitto_pub -h localhost -t openledrace/tournament/command -m '{"action":"reset_tournament"}'
mosquitto_pub -h localhost -t openledrace/tournament/command -m '{"action":"reload_players"}'El proyecto incluye una pantalla grande para carrera/bracket y un control movil de torneo hechos con Node-RED Dashboard.
La documentacion de la interfaz, los topics usados, el control desde el movil y el funcionamiento del derrape estan en:
- Arranca el broker MQTT.
- Carga
main/main.inoen el Arduino. - Ejecuta
bridge/bridge.jscon el puerto serie correcto. - Edita
players.txt. - Ejecuta
tournament-engine.js. - Importa los flows en Node-RED y abre el dashboard.
- Escucha
openledrace/#para integrar pantalla, dashboard o automatizaciones.
-
Si el puente no abre el puerto serie, revisa
SERIAL_PORTy permisos del dispositivo. -
En Linux puede hacer falta pertenecer al grupo
dialoutpara leer/dev/ttyUSB*o/dev/ttyACM*. -
Si no llegan mensajes MQTT, confirma que el broker esta arrancado y que
MQTT_BROKERcoincide en el puente y el torneo. -
Si el torneo no arranca, revisa que
players.txtexista y tenga al menos 2 jugadores. -
Si la tira LED no coincide con la longitud real, ajusta
MAXLEDenmain/main.ino.
- Adrían Manzanares~ Amanza17
- Adrían Madinabeitia ~ madport
- Iván Porras ~ Ivan-Porras
- Óscar Martínez ~ OscarMrZ