Come far suonare in Pianoforte LEGO

Altre lingue

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.

un sensore ottico Lego, motore, e scatola di controllo,
su una larga base di pezzi montati di lato; il motore fa girare
un lungo asse con camme ortogonali

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!

la tastiera del pianoforte Lego piano, 2 ottave + 1, con
tasti bianchi e neri in sequenza corretta; ciascun tasto ha
il suo martelletto

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:

schema elettrico; quattro QRD1114 sono disposti a quadrato;
un filo etichettato "row1" è collegato agli anodi di due LED
tramite una resistenza di 330Ω e ai collettori di due
fototransistor tramite una resistenza di 10kΩ; un filo "row2"
è collegato in maniera simile agli altri due sensori; un filo
"col1" è collegato al catodo del LED e all'emettitore del
fototransistor di un sensore per riga; un filo "col2" è
collegato in maniera simile agli altri due; tra ciascuna
resistenza da 10kΩ e i fototransistor ci sono fili
etichettati "sense1" e "sense2"

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!

breadboard con un ESP32, 4 sensori QRD1114, quattro
resistenze, e un po' di fili. Un LED fa una debole luce rosa,
gli altri sono spenti

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

rettangolo di plastica bianca prodotto da una stampante 3D,
di dimensioni pari a 6×2 pezzi Lego; ci sono pispoli di
dimensione standard su uno dei lati lunghi, con 2 manine 1×1
attaccate; cinque sensori QRD1114 sull'altro lato

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.

rettangolo di plastica bianca prodotto da una stampante 3D,
di dimensioni pari a 29×2 pezzi Lego, con 25 gruppi di 4 fori
ciascuno per reggere i sensori, appoggiato sopra le "corde"
del pianoforte; i fori sono allineati coi martelletti

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

un sensore QRD1114 inserito nel supporto stampato, appeso a
una delle "corde" con una manina Lego; il sensore è appena
sopra e dietro l'ultimo martelletto a destra; il martelletto
è a riposo stessi pezzi di prima; il martelletto è sollevato, proprio
davanti al sensore

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!

retro del rettangolo 29×2, con 10 sensori montati dal davanti
nei loro fori, e tanti fili elettrici isolati in giallo che
collegano alcuni dei piedini

Ciascun sensore ha 4 piedini, numerati in senso antiorario guardando dalla faccia del LED / fototransistor:

  1. collettore del fototransistor, da collegare a una resistenza di pull-up e a un piedino "riga"
  2. emettitore del fototransistor, da collegare a un piedino "colonna"
  3. anodo del LED, da collegare a una resistenza di limitazione e a un piedino "riga"
  4. 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).

rettangolo di plastica bianca prodotto da una stampante 3D,
con due gruppi di fori 10×2 intorno a una scritta "esp", due
gruppi di fori 5×2 intorno a scritte "220Ω" e "10kΩ", tre
gruppi di 5 fori ciascuno accanto a scritte "led", "gnd",
"pht", e un gruppo di 9 fori accanto a una scritta "amp"; c'è
uno svaso vicino alla scritta "esp" e un rettangolo rialzato
vicino alla scritta "amp"

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

stessa basetta, con tutti i componenti al loro posto; i fori
"led", "gnd" e "pht" hanno dei connettori retro della basetta, un sacco di fili elettrici isolati in
giallo collegano i piedini stessa basetta, con un piccolo altoparlante collegato
all'amplificatore

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):

DateCreato: 2020-08-28 10:39:28 Ultima modifica: 2020-08-29 09:16:54