Il Pianoforte a coda LEGO 21323 è un gran bel modello, con un sacco di dettagli interessanti e un livello di ingegneria veramente notevole.
Ci sono un po' di componenti elettronici, che parlano via Bluetooth con una app per telefono.

La app può suonare alcuni motivi predefiniti mentre fa girare il motore dentro al pianoforte, cosa che fa abbassare un po' dei tasti in una sequenza costante, per far finta che il pianoforte stia suonando la musica. Oppure, la app può aspettare che premiate un tasto qualsiasi (tutti i tasti muovono un pezzo di fronte al sensore ottico) per suonare ciascuna nota, per far finta che stiate suonando voi.
Carino, ma un po' tanto limitato: abbiamo 25 tasti indipendenti, ci deve essere un modo di fargli suonare la nota giusta!

Dopo un po' di ricerca, ho deciso di usare sensori ottici e un microcontroller potente. Non può essere tanto difficile, vero? ☺
Ho usato come sensore il QRD1114, che è molto semplice da usare: LED infrarosso più fototransistor, con campo visivo molto stretto e corto, per cui è difficile che tasti adiacenti producano falsi positivi.
Come controller ho usato un Lilygo TTGO-T7 v1.3, principalmente perché ne avevo una manciata. È un ESP32, espone 40 piedini, e può caricare una batteria al litio da USB.
Nota
La versione 1.3 è un d1_mini32 per quanto riguarda le librerie esp32-arduino, la 1.4 è un esp32wrover. Son sicuro che ci siano altre versioni in giro, potreste dover fare qualche aggiustamento su volete riprodurre quel che ho fatto
Per cominciare ho dovuto trovare il sistema di collegare i sensori al controller. Il LED del QRD1114 si accontenta di 20mA, per cui posso alimentarlo direttamente dai GPIO del ESP32, che reggono fino a circa 30mA. 25 sensori fanno una matrice 5×5, per cui qualcosa di simile a questo circuito dovrebbe funzionare:
Mettendo "alto" un piedino di riga (con gli altri "bassi") e "basso" un piedino di colonna (con gli altri ad alta impedenza / tristate), possiamo accendere un sensore alla volta. Quando un fototransistor vede la luce riflessa da un oggetto che gli sta davanti, abbassa il piedino "sense", che possiamo leggere con l'ADC del controller.
Testiamo il circuito su una breadboard per dimostrare che funziona!

Come facciamo a tenere i sensori al loro posto dentro il pianoforte? Stampiamo un supporto compatibile coi pezzi Lego!

La mia stampante (una Prusa i3 MK3S) riesce a stampare fori della dimensione giusta per i componenti elettronici, e l'intero supporto (lungo 29 unità Lego) in una passata sola. I sensori devono essere allineati ai martelletti (non c'è posto dietro le stecche dei tasti, inoltre i martelletti sono bianchi per cui più visibili ai sensori, e si muovono di più per cui riducono la probabilità di letture sbagliate). Ho usato OpenSCAD per costruire il modello del supporto.

Dobbiamo anche controllare l'allineamento sugli altri due assi, ovviamente.


A questo punto qualcuno si starà domandando: come si fa a saldare componenti elettronici su una basetta di plastica? E la risposta è che non saldiamo nulla! Ho usato la tecnica del wire-wrapping!

Ciascun sensore ha 4 piedini, numerati in senso antiorario guardando dalla faccia del LED / fototransistor:
- collettore del fototransistor, da collegare a una resistenza di pull-up e a un piedino "riga"
- emettitore del fototransistor, da collegare a un piedino "colonna"
- anodo del LED, da collegare a una resistenza di limitazione e a un piedino "riga"
- catodo del LED, da collegare a un piedino "colonna"
per cui i collegamenti vengono più o meno così:
aM aN aO aP aQ cM cN cO cP cQ 14 14 14 14 14 14 14 14 14 14 … 23 23 23 23 23 23 23 23 23 23 … Mb Nb Ob Pb Qb Md Nd Od Pd Qd
dove a, c vanno alle resistenze pull-up; b, d vanno alle resistenze di limitazione, e M, N, O, P, Q vanno ai piedini colonna.
Ho costruito la basetta del controller nella stessa maniera: stampa e wire-wrap (modello).

La svasatura serve a far spazio per il connettore della batteria, e il blocchetto rialzato regge l'amplificatore AdaFruit



Ho avuto un po' di problemi con i piedini per righe e colonne, perché non tutti i GPIO sono davvero usabili. Alla fine ho usato questi:
- righe: 05 23 19 18 26
- colonne: 17 33 16 21 22
- ADC: 02 04 12 27 14
- DAC: 25
- abilitazione dell'amplificatore: 32
Il programma ha richiesto un po' di attenzione, ma non è particolarmente complicato, potete leggerlo nel mio repository Git.
Nota
La circuiteria del TTGO mi ha dato un po' di problemi nel caricare il programma compilato, producendo errori tipo A fatal error occurred: Timed out waiting for packet content o Invalid head of packet (0xE0). Per evitarli, ho dovuto impostare esplicitamente la velocità di trasferimento nel Makefile.
Primo test con pochi sensori su una breadboard:
e con tutti i sensori, montati al loro posto nel pianoforte:
Ho rimosso i componenti elettronici Lego per far posto ai fili e al controller.
E, finalmente, il risultato assemblato:
Tutto bello, ma non suona nemmeno un po' come un pianoforte. Mi ci son voluti due giorni di esperimenti, ma alla fine son riuscito a far usare al ESP32 un soundfont, tramite la libreria TinySoundFount (in effetti, la versione ottimizzata per ESP):