← Ars Magna Lab

Un futbolí Córdoba restaurat

Domotitzant un futbolí(amb Home Assistant)

Barreres d'infrarojos als carrils de recollida i un ESP32 amb ESPHome que du la partida. El marcador és un dashboard a la tauleta, amb locutor i música, es controla per veu amb Assist i els gols se celebren amb WLED. Va amb bateria, amagat dins el moble, i la porteria no s'ha tocat.

ESPHomeWLEDAssistDashboardESP32Barreres IR
El futbolí en plena partida, amb la tauleta al costat marcant 2-1

01

Què fa

Es juga amb 11 bolles i guanya qui arriba a 6. Amb 5-5, la darrera bolla es tira al centre: és «la bona». L'ESP32 coneix aquestes regles i publica la fase de la partida a sensor.futbolin_fase. Tota la resta (marcador, so i llums) reacciona a aquesta fase.

Sortida

«Nova partida» per veu. Marcador a zero i el locutor presenta el clàssic.

normal
Gol

Suma tot sol. Ona de llum del color de l'equip i una frase del locutor.

event.futbolin_gol
Bolla de partit

En arribar a 5, les tires respiren del color de qui la té.

bola_partido_a
La bona

5-5: duel d'ones, batec daurat i cartell al marcador.

la_buena
Victòria

Festa de llums i pantalla del guanyador. Els gols que sobren ja no compten.

fin_a

02

Un Córdoba de tota la vida

És un futbolí Córdoba antic, negre i restaurat. Això va fixar les regles del muntatge:

  • Per fora, igual que sempre. Sense pantalles aferrades ni botons nous. L'únic que es veu és un interruptor general, per davall.
  • La porteria no es toca. La bolla és massissa i surt disparada: qualsevol sensor dins la porteria acabaria romput o tornant la bolla al camp.
  • Sense cables mentre es juga. Tot va amb bateria.
  • Sense botons al futbolí. Tot es maneja des de Home Assistant.

L'àbac de comptes vermells i blaus continua al seu lloc, per si de cas.

El futbolí Córdoba restaurat, negre, amb els ninots blancs i granats
El Córdoba, ja restaurat. Per fora no es veu res de nou.
Placa de llautó de la Delegació d'Indústria de Barcelona: marca Justo A. Córdoba, futbol de saló, tipus taula, aprovat el 1950
La placa original: «fútbol de salón», tipus taula, aprovat per la Dirección General de Seguridad el 1950.
El mateix futbolí abans de restaurar-lo, pintat de vermell i amb els ninots gastats
Així estava el 2022, abans de restaurar-lo.
Detall dels ninots abans de la restauració, amb la pintura gastada
Els ninots, amb dècades de partits a sobre.

03

Com sap que és gol?

L'intuïtiu seria mirar a la porteria, però és millor mirar després. Quan la bolla entra, cau per una ranura a un carril de fusta que la du rodolant fins al calaix. Allà ja no va a cent per hora: rodola a poc a poc i sempre pel mateix camí.

A cada carril hi ha una barrera d'infrarojos, amb un emissor a un costat i un receptor al davant. Quan la bolla passa, talla el feix unes desenes de mil·lisegons, i això és un gol.

El menys intrusiu possible

Zero forats

Dues falques de fusta aferrades amb cola dins el carril. No s'ha foradat ni la porteria ni el carril.

Es lleva

Les falques es desaferren i els sensors van amb connectors. El futbolí torna a estar com abans.

Fora del camí

Cada sensor està a cobert darrere la seva falca. La bolla mai no el toca i la rampa la guia sense frenar-la.

No s'escapa

El feix travessa el carril de paret a paret, així que la bolla el talla passi per on passi.

Què fa el firmware

Tall del carril amb l'emissor i el receptor a cada costat de la bolla, i el senyal al GPIO 32: el feix es talla uns 35 ms amb el gol, el bloqueig de 400 ms ignora els rebots i els talls molt curts es descarten com a soroll
La barrera vista de front i el senyal que arriba a l'ESP32 amb un gol. Els diagrames són en castellà.
El carril de recollida amb les dues falques de fusta aferrades a les parets i els sensors darrere
Les dues falques al carril, amb un sensor darrere cada una.
La bolla passa entre les falques i talla el feix. A velocitat real.

04

Arquitectura

La decisió clau: la partida la du l'ESP32, no Home Assistant. Compta, calcula la fase i la desa a la flash (restore_value) per no perdre-la en un reinici o una actualització OTA.

Des d'allà avisa per dos camins. A HA, per l'API nativa d'ESPHome. A WLED, directament per l'API JSON ({"ps": 3}), sense passar per HA, perquè l'efecte surti a l'instant.

Si cau la WiFi o Home Assistant, l'ESP32 segueix comptant, i en tornar la tauleta mostra el marcador correcte. HA no du cap lògica de la partida: només mostra les entitats i prem els botons.

05

El que veu Home Assistant

El dispositiu ESPHome es diu futbolin, així que totes les entitats queden com <domini>.futbolin_*. Els equips són A i B: a ca nostra, A és el Madrid i B el Barça.

Estat

EntitatQuè és
sensor.futbolin_goles_a / _bGols de cada equip, de 0 a 6
sensor.futbolin_fasereposo, normal, bola_partido_a/_b, la_buena, fin_a/_b
event.futbolin_golgol_a o gol_b, només amb els gols que veuen les barreres. És el disparador natural de les automatitzacions
sensor.futbolin_bateria% de bateria, calculat amb la tensió més alta dels darrers 10 min perquè els pics de les tires no el facin botar
binary_sensor.futbolin_autotestResultat de l'autotest de les barreres

Controls

EntitatQuè fa
button.futbolin_nueva_partida0-0 i a jugar
button.futbolin_gol_a_mas / _menosCorregeix el marcador. La fase es recalcula: un −1 des de 6-5 torna la bolla de partit
button.futbolin_anular_partidaTorna a reposo
switch.futbolin_efectos_luzActiva o desactiva els efectes de les tires
number.futbolin_luces_bateria_minima% de bateria per davall del qual es tallen els llums
switch.futbolin_modo_enchufadoPer jugar amb una font de 12 V en lloc de bateries: amaga la bateria i silencia els seus avisos

06

El marcador: un dashboard amb locutor

El marcador és un dashboard d'HA fet amb una sola button-card amb HTML propi: dígits de matriu de punts, la columna de les 11 bolles amb l'ordre dels gols, l'animació de «GOL!», el cartell de «la bona» i la pantalla del guanyador. Mentre està obert, HA lleva l'estalvi de pantalla de la tauleta.

El locutor

Cada gol el canta un locutor que segueix el partit: el primer gol, l'empat, la ratxa, la remuntada, la bolla de partit, el gol que salva el partit… Són 348 locucions generades per endavant amb una veu TTS d'OpenAI, en castellà. HA calcula el moment del partit com a atribut d'un sensor i el dashboard tria una frase a l'atzar, sense repetir l'anterior.

La tauleta amb el marcador a 0-0, recolzada al futbolí devora l'àbac
El marcador a la tauleta, devora l'àbac de tota la vida.

El truc de la música

Amb música sonant a la tauleta, el locutor l'ha d'abaixar i no aturar-la. Android només abaixa la música si el so nou demana el focus d'àudio «temporal, es pot abaixar», i el WebView només el demana així per a mitjans de menys de 5 s. Amb una locució més llarga, la música es pausava i no tornava.

La solució: mentre parla el locutor, sona en bucle un <audio> amb 1 s de silenci, que demana el focus curt. La veu va a part per Web Audio, que no demana focus. En acabar, es buida el src del silenci i es crida load(): amb pause() tot sol, el focus no es deixa anar i la música es queda baixa.

07

Control per veu amb Assist

El futbolí no té botons: tot es fa amb Assist des de la tauleta. Les frases són disparadors de conversa d'una automatització que premen els botons d'ESPHome. Es resolen en local abans d'arribar al LLM, així que no cal exposar el futbolí a Assist.

triggers:
  - trigger: conversation
    command:
      - "gol del Madrid"
      - "gol de los blancos"
actions:
  - action: button.press
    target:
      entity_id: button.futbolin_gol_a_mas
FraseAcció
«Nueva partida», «echamos una»Nova partida i marcador a la tauleta
«Gol del Barça»+1
«Ese no vale el del Madrid»−1
«¿Cómo vamos?»Respon amb el marcador i la fase
«Anula la partida»Tornada a repòs
«Pon la música»Música a la tauleta

Les frases són en castellà, l'idioma de l'Assist de casa.

08

Llums amb WLED

Hi ha una tira LED a cada costat del camp (WS2811 de 12 V, 28 píxels cada una), mogudes per un controlador Gledopto amb WLED. Cada tira és un segment. Amb bateria gasten massa per anar enceses tota la partida, així que només fan efectes d'uns segons i tornen a apagar-se totes soles.

Cada moment és un preset (o una playlist de presets) que l'ESP32 llança per l'API JSON. Els presets surten d'un script generador, així que es versionen amb la resta del codi.

El bus de 12 V alimenta el Gledopto amb WLED, que té dues sortides: la tira A al GPIO 16 (píxels 0 a 27) i la tira B al GPIO 2 (píxels 28 a 55)
Cada tira va a la seva pròpia sortida del Gledopto i és un segment de WLED.
PresetQuanQuè fa
gol_a / gol_bGolOna del color de l'equip cap a la porteria contrària i focs artificials, 3 s
bola_partido_*Un equip arriba a 5Les tires respiren del seu color 8 s
la_buena5-5Duel d'ones, cada una des de la seva porteria, i batec daurat
fin_a / fin_bGol que guanyaFesta del color del guanyador 10 s
avisoEmbús o autotest fallitVermell fix fins que es resol

Amb la bateria baixa, l'ESP32 talla els llums tot sol: si el % passa 60 s per davall de number.futbolin_luces_bateria_minima, els apaga, i no els torna a encendre fins que la bateria puja 10 punts per damunt del mínim. Aquest marge evita que el tall reboti, perquè els mateixos efectes fan baixar la tensió.

09

Cablejat i bateries

Tota l'electrònica va en un panell de contraxapat devora les bateries, a la part fixa del moble: l'ESP32, el buck que baixa de 12 a 5 V, una regleta que fa de bus de 12 V i la interfície de les barreres. Les tires prenen els 12 V directament.

A cada carril arriba un cable de 5 fils que acaba en dos connectors JST-SM, un per al receptor i un altre per a l'emissor. Les resistències de pull-up van soldades a l'extrem del cable, devora l'ESP32, i un divisor de 100k/20k du els 12 V al GPIO 34 per calcular el % de bateria.

Esquema general: dues bateries amb el seu fusible, l'interruptor, el bus de 12 V, el Gledopto amb les tires, el buck a 5 V, l'ESP32 i la interfície amb els cables dels dos carrils
L'esquema general. En vermell, els +12 V.

L'ESP32 i les barreres

Connexió d'una barrera a l'ESP32: 3,3 V i GND per regletes, el senyal del receptor al GPIO 32 amb pull-up de 5,1 kΩ i 1 kΩ en sèrie, l'emissor al GPIO 14 i el divisor de bateria al GPIO 34
Com es connecta una barrera a l'ESP32, amb el divisor de bateria al GPIO 34.

Les bateries

Són dues bateries de plom de 12 V i 7 Ah en paral·lel, cada una amb el seu fusible de 5 A, i un interruptor general per davall del moble. Segons els comptes, donen per a unes 7 hores de joc (falta mesurar-ho). Per jugar endollat, es lleven les bateries i es connecta una font de 12 V al seu lloc.

Cablejat de les bateries: cada una amb el seu portafusibles de 5 A, els dos positius a l'interruptor i d'allà a les regletes de 12 V, que reparteixen a Gledopto, buck i interfície; els negatius a la regleta de GND
Cada bateria du el seu fusible devora el born i els dos positius s'uneixen a l'interruptor.
El futbolí amb el tauler de joc abatut i l'electrònica dins el moble
Amb el tauler aixecat: tot cap dins el moble.
La caixa de l'electrònica, amb l'ESP32 a la seva placa de borns, el buck i les connexions
L'ESP32 a la seva placa de borns, el buck i les connexions de les barreres.
Les dues bateries de plom i el controlador Gledopto dins una caixa blava
Les dues bateries, amb els seus fusibles, i el Gledopto.
L'interruptor general, un polsador rodó amb anell vermell cargolat per davall del moble
L'interruptor general: tot s'encén des de davall del moble.

El codi

Tot és a GitHub, amb codi obert: el firmware d'ESPHome, el paquet de Home Assistant amb el dashboard del marcador i les frases d'Assist, els presets de WLED amb el seu generador, el generador de les locucions i els diagrames.