Il passatempo dell’estate 2021

Come ogni estate il tempo libero abbonda e non si sa bene come arrivare a fine giornata senza annoiarsi. Ognuno ha le sue strategie; chi può va in vacanza, ovviamente non tanto per godere del mare e della spiaggia, certo che no, lo scopo è quello di dare un senso a questo vuoto creando delle routine giornaliere che ci impongono di svolgere delle attività: in qualche modo la vacanza ci permette di rimanere in un binario in modo che seppure è chiaro che si perda tempo, tutto ciò è giustificato ed inoltre abbiamo comunque la parvenza di essere indaffarati in qualche tipo di attività.

Ma l’estate è lunga da passare, tre mesi, alla fine ci si annoierà, a meno di non porsi degli obiettivi, dei compiti da svolgere entro la fine dell’estate; ed allora ecco che c’è chi si lancia nello spazio costruendosi un razzo e sparandosi in prima persona (vedi i ricconi Richard Branson, Jeff Bezos che hanno fatto le cose per bene e sono partiti e tornati sulla Terra senza intoppi, emuli di quel Mike Hughes a cui però andò male…) c’è chi legge libri o addirittura pubblica un libro, completa il giornale dei sudoku o si dedica alla ristrutturazione della casa.

Sempre meglio di quelli che si dedicano alle cosiddette “palline clac-clac” che per fortuna non vedo più da qualche estate (ma sono sicuro che torneranno… si ritorneranno… AH-AH-AH! E tu non ci potrai fare nulla! NULLA! AH-AH-AH!

Stiamo parlando quindi di hobby (o per chi conosce meglio la lingua di Shakespeare hobbys), ovvero attività ricreative diverse da quella lavorativa, fatte a volta anche con un reale impegno, come può essere ad esempio scrivere delle amenità su un blog, in generale senza alcun fine di lucro (e in questo caso ci mancherebbe altro).

Un bel passatempo rilassante e alla portata di tutti per esempio è la realizzazione di circuiti guidati da un microcontrollori come Arduino, che possono essere facilmente programmati in linguaggio C: uno spasso insomma. Di progettini da realizzare copiando schemi e codici su blog e pagine web dedicate ce ne sono parecchi, ma è bello dare sfogo alla propria fantasia e immaginazione creando tutto da zero.

L’idea è quella di clonare il gioco del Simon: sono presenti quattro lucette di diversi colori e quattro tasti in corrispondenza. Viene eseguita una sequenza casuale di accensioni e il giocatore deve replicarla. Se ci riesce alla sequenza precedente si aggiunge un nuovo elemento casuale e così via.

Si tratta di un vecchio gioco della Hasbro, in produzione dalla fine degli anni ’70 (del XX secolo) cioè da quando l’elettronica conquistava i primi spazi nell’universo ludico. La realizzazione è semplice perché basta gestire dei diodi led, un cicalino e dei pulsanti. Il microcontrollore usato è l’Arduino nano, molto più piccolo di altri modelli di Arduino e quindi più adatto ad essere usato in dispositivi che hanno anche lo scopo di essere maneggevoli.

Per il diodo led è sufficiente collegare in serie una resistenza adeguatamente dimensionata. Per il led blu è stata usata una resistenza da 140 ohm, mentre per verde, rossa e gialla una da 220 ohm. La resistenza è dimensionata in base alla tensione che assorbe il diodo e tenendo conto che l’intensità di corrente deve rimanere entro determinati limiti, altrimenti si rischia dover buttare il led. La classica formula da applicare è la seguente:

I=\frac{V-V_{led}}{R}

La tensione V è quella in uscita dai pin digitali dell’arduino ed è +5 V, la V_f dipende dal colore, è 3 volt per il blu mentre per rosso, giallo e verde si intorno ai 2 volt; per la precisione rosso 1,8 V, giallo 1,9 V e verde 2,0 V ma poco importa perché le resistenze vanno scelte in modo da avere una corrente al di sotto dei 20 mA.

I pulsanti invece collegano direttamente la tensione con i pin corrispondenti, ma in più in serie aggiungiamo una resistenza da 10 k\Omega verso il GRD. Infine il cicalino (un buzzer passivo) viene aggiunto direttamente tra pin e GRD. Lo schema è essenzialmente questo:

I vari componenti sono abbastanza semplici da inserire nel momento che si comprende lo schema con cui le connessioni si ripetono: l’importante è non fare confusione. Il risultato finale è questo qua:

Quindi abbiamo quattro led di vari colori a cui corrispondono altri quattro pulsanti più un pulsante bianco; il buzzer è il cilindretto nero all’estrema destra. Si tratta in questo momento solo di un hardware spoglio, ovvero senza alcun software che lo gestisca. Il programma di prova che carichiamo funziona perfettamente, quindi andiamo avanti scrivendo un po’ di codice per implementare il gioco: ci serve un generatore di valori casuali che aggiunge ad ogni passo un elemento in una sequenza, visualizzi questa sequenza attraverso l’accensione dei led e controlli che la sequenza replicata dal giocatore corrisponda a quella prevista, insomma un po’ un casino, ma niente di particolare. Il file sorgente è disponibile qui: miniSimon.ino.

Il risultato è illustrato in questo video; ma con lo stesso hardware si potrebbe fare anche di più, si potrebbe immaginare un altro tipo di gioco o altre funzioni; senza cambiare nulla nei collegamenti e modificando solo il codice si può fare tutto quello che la fantasia ci suggerisce; quindi non finisce qui, l’estate è ancora lunga.

[Update]
Infatti non ho impiegato molto tempo per trasformare quest’oggetto in uno strumento musicale: ogni combinazione di tasti produce un tono (nella scala temperata a temperamento equabile, che per chi segue questo blog dovrebbe risultare familiare, altrimenti cliccate qua).

L’associazione tra tasti e note musicali è data dal seguente schema; inoltre premendo il tasto bianco si ottengono le stesse note un’ottava più in alto:

BluVerdeRossoGiallo
Do   
Do#/Reb  
Re   
Re#/Mib  
Mi   
Fa  
Fa#/Solb   
Sol  
Sol#/Lab 
La  
La#/Sib 
Si  
Do 

Il codice si può trovare su questo Pastebin; la cosa interessante di questo codice consiste nel modo con cui definisce le frequenze delle note: definito 523 MHz la frequenza del Do, frequenze delle note successive si calcolano moltiplicando più volte per 1,0594…. ovvero per la radice dodicesima di 2, mentre in molti esempi che ho visto in giro le note erano definite da una serie di direttive #define. Il motivo lo trovate nell’articolo già citato.

   frequency[0]=523;
   f=523;
   for(int i=1;i<25;i++){
      f=f*1.0594630943592952646;
      frequency[i]=(int)(f+.5);
   }

Il risultato non è eccezionale, qui un esempio:

Ma adesso spegniamo le luci e…. magia!