KnockBox – (2) Elettronica e software

Questa è la seconda parte di una serie di tre articoli riguardanti il progetto KnockBox: qui tratteremo delle sue componenti elettroniche e del software.

Elettronica

I componenti necessari sono i seguenti:

  • un piezo;
  • un motore servo;
  • un capacitor da 100uF;
  • tre LED (uno rosso, uno verde, uno blu);
  • tre pulsanti;
  • tre resistenze da 220Ω, tre resistenze da 10kΩ e una resistenza da 1MΩ.

Analizziamo nel dettaglio il materiale utilizzato nel progetto.

Il piezo è il cuore di tutto: è il sensore che rileva il colpo con le nocche. Calcolando il tempo trascorso tra un tocco e l’altro all’interno di una serie, riusciamo a distinguere il ritmo e a confrontarlo con quello registrato.

Il motore servo è invece utilizzato per aprire e chiudere la serratura: di questo tratteremo più ampiamente nel prossimo articolo. Va però detto che, quando un motore servo comincia a muoversi, consuma più corrente di quando è già in movimento. Questo causa una flessione nel voltaggio. A questo serve il capacitor: collegandolo tra l’alimentazione ed il ground del servo, riusciamo ad appianare eventuali cambiamenti di voltaggio. Attenzione: assicurati di collegare al ground il catodo (la parte con la striscetta nera) e l’anodo all’alimentazione. Invertire il senso di collegamento potrebbe causare l’esplosione del dispositivo.

I LED servono a comunicare all’utente lo stato del sistema. Il LED verde acceso indica che la scatola è aperta, il rosso che è chiusa, il blu che è stato registrato un input.

I tre pulsanti attivano tre diversi comportamenti della scatola:

  1. Chiusura della serratura;
  2. Riproduzione del ritmo registrato;
  3. Registrazione di un nuovo ritmo.

Tutte e tre le funzioni collegate ai pulsanti possono essere attivate solo quando la serratura è già stata aperta.

Le resistenze permettono il corretto funzionamento degli altri componenti.

Lo schema del circuito elettrico è questo:KnockBox_scheme

Il risultato è questo:KnockBox - Closed KnockBox - Open KnockBox - Input

Software

Il software necessario al funzionamento di KnockBox è un unico sketch Arduino: data la sua complessità rispetto a tutti i post precedenti, è utile analizzarlo nel dettaglio. Si basa sul paradigma di programmazione OOP (Object-Oriented Programming), e ho cercato di tenerlo quanto più ordinato e semplice possibile.

Il codice si può reperire qui.

Lo sketch si compone di due classi, Rhythm e Box, e delle due funzioni tipiche di Arduino, ovvero setup() e loop().

La classe Rhythm fornisce gli strumenti necessari per gestire input e ritmi. Essa utilizza tre costanti:

  • RHYTHM_SIZE = 10: il numero massimo di intervalli tra un tocco e l’altro del ritmo registrato (esso può quindi essere composto al massimo da 11 tocchi).
  • TOLERANCE = 150: tolleranza in millisecondi calcolata quando si confronta l’input con il ritmo registrato. Ciò significa che, se nel ritmo il primo intervallo dura 500ms, un input di 400ms sarà considerato valido, ma uno di 700ms no.
  • TRESHOLD = 20: la soglia minima dell’input registrato dal piezo affinché esso sia considerato un tocco valido. Se il sensore registra un input inferiore di questo valore, esso non verrà considerato.

Inoltre, Rhythm offre in tutto 10 funzioni:

  • Rhythm(): il costruttore. Si occupa di impostare un ritmo predefinito a compile-time.
  • void getRhythm(int *rhythm_a): copia il ritmo registrato nell’array puntato da *rhythm_a
  • void setRhythm(const int rhythm_a[RHYTHM_SIZE]): imposta un nuovo ritmo. Richiede come argomento un array di interi, di grandezza RHYTHM_SIZE che contenga i valori in millisecondi degli intervalli del nuovo ritmo.
  • int getActualSize() const: ritorna un intero che rappresenta il reale numero di intervalli presenti nel ritmo registrato. Questa funzione è necessaria poiché si può registrare un ritmo di intervalli inferiori a RHYTHM_SIZE. Se ciò accade, il resto dell’array viene riempio di valori -1 (ad esempio, un ritmo di 4 tocchi quindi 3 intervalli viene salvato in questo modo: [INTERVALLO_1, INTERVALLO_2, INTERVALLO_3, -1, -1, -1, -1, -1, -1, -1].
  • int getActualSize(const int rhythm_a[RHYTHM_SIZE]) const: identico alla funzione precedente, ma ritorna il numero di intervalli del ritmo rhythm_a passatogli come argomento.
  • void play() const: riproduce il ritmo registrato.
  • void play(const int rhythm_a[RHYTHM_SIZE]) const: riproduce il ritmo rhythm_a passatogli come argomento.
  • int listenForKnock() const: attende un input di valore superiore o uguale a TRESHOLD e ritorna il tempo in millisecondi trascorso dalla chiamata della funzione alla ricezione dell’input.
  • void listenForRhythm(int *rhythm_a): registra un intero ritmo e ne salva gli intervalli all’interno dell’array di dimensione RHYTHM_SIZE puntato dall’argomento *rhythm_a.
  • boolean checkRhythm(): registra un ritmo e controlla che corrisponda a quello registrato, applicando una tolleranza in millisecondi di valore TOLERANCE. Ritorna TRUE se i ritmi coincidono, FALSE altrimenti.

La classe Box fornisce gli strumenti necessari per gestire il funzionamento della serratura. Si compone di 5 metodi:

  • Box(): il costruttore. Inizializza il motore servo, chiude la serratura ed accende il LED rosso.
  • boolean isLocked() const: ritorna TRUE se la serratura è chiusa, FALSE se è aperta.
  • void openBox(): attiva il motore servo per aprire la serratura ed accende il LED verde.
  • void closeBox(): attiva il motore servo per chiudere la serratura ed accende il LED rosso.
  • void recordNewRhythm(Rhythm *rhythm): registra un nuovo ritmo e lo riproduce. Se viene premuto il pulsante di chiusura, la registrazione viene annullata. Se viene premuto il pulsante di registrazione, il nuovo ritmo viene salvato e la serratura viene chiusa. L’argomento *rhythm è il puntatore all’istanza della classe Rhythm in uso.

Restano da discutere le due funzioni setup() e loop(): la prima si occupa di inizializzare i pin per l’input e l’output; la seconda, invece, esegue le giuste operazioni in base all’input ricevuto.

Per osservare all’opera il funzionamento del sistema, vi rimando al video all’inizio del post.

Stay tuned!

Advertisements

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...