[TUTORIAL] 6 – Costruire un cronometro da pista con Arduino – Il codice per Arduino

Il CODICE PER ARDUINO

Adesso che abbiamo connesso le fotocellule, l’accelerometro e la pedana di Bosco/Vittori ad Arduino, è giunto il momento di caricarci sopra il codice in grado di raccogliere le informazioni da questi, elaborarla e inviarla tramite la seriale al PC, sui quale è in esecuzione un’applicazione (TestManager, che vedremo successivamente) in grado di raccogliere queste informazioni, visualizzarle e, se necessario, archiviarle catalogandole in base a Atleta e Società sportiva se necessario.

Inizio con il postare il codice, non fatevi spaventare dalla lunghezza, in realtà è un codice abbastanza semplice. Proverò a spiegarvelo passo per passo nei punti più salienti.

Arduino comunica con l’applicazione che gira sul PC attraverso dei CHAR, ad ogni lettera corrisponde un evento che accade oppure un ordine da parte del PC verso Arduino. Tutte le lettere sono commentate nel codice con il proprio significato.

Iscriviti al nostro canale YouTube per saperne di più! 🙂
Nella definizione delle variabili c’è modo di assegnare quale funzione volete che svolga ciascun pin. Quelli di di “default” sono quelli che rispettano la configurazione Hardware che vi ho proposto fino ad adesso, ma se preferite cambiarli siete liberi di farlo.
[crayon-5dd87185b98ad987684463/]
Nel loop() sono presenti solamente 2 macrofunzioni:

SerialEvent() : Svolge la funzione di leggere il buffer della seriale e, in base a quello che è stato ricevuto dal PC eseguire varie azioni, come restituire in comando di START (come se qualcuno fosse passato dalla barriera) oppure di STOP, oltre che a molte altre funzioni. All’interno di SerialEvent() c’è uno switch(), case() che a seconda del carattere ricevuto sceglie la funzione da eseguire:

TastoPremuto() : Interroga in sequenza tutti gli ingressi verificando se avvengono interruzioni della barriera oppure è presente qualche corpo sulla pedana di bosco (anche se per iniziare questo test è necessario un comando da parte dell’applicazione). Le funzioni collegate al tasto premuto sono essenzialmente 3:

doStart() : La chiamata di questa funzione scatenerà l’invio da parte di Arduino, attraverso la porta seriale, verso l’applicazione su PC (TestManager) del carattere “s” concatenato al tempo in millisecondi dall’accensione di Arduino.

doStop() : La chiamata di questa funzione scatenerà l’invio da parte di Arduino, attraverso la porta seriale, verso l’applicazione su PC (TestManager) del carattere “p” concatenato al tempo in millisecondi dall’accensione di Arduino.

Avrete capito che, molto semplicemente, il cronometraggio del tempo avviene relativamente al contatore interno di Arduino (il cui valore viene restituito dalla funzione millis()). Si ottiene infatti il cronometraggio sottraendo ai millisecondi ai  quali avviene l’arrivo i millisecondi ai quali avviene la partenza, tale calcolo e conversione in base sessagesimale avviene all’interno dell’applicazione TestManager sul PC.

doStartJump() e doStopJump() : Queste due funzioni svolgono essenzialmente una funzione simile a quelle appena descritte, con la differenza che per i salti serve raccogliere in sequenza tutti gli istanti al quale la pedana di bosco viene toccata, e tutti quelli al quale ci stacchiamo dalla pedana. Questo per riuscire a determinare tutti i tempi di volo e correlarli a tutti i tempi di contatto.

Andando avanti con la descrizione delle funzioni vediamo che quelle che possono essere chiamate attraverso comandi sulla seriale sono di più. Oltre a doStart() e doStop() è presente anche:

doConnect() : Questa funzione serve in fase di avvio dell’applicativo a determinare o meno la presenza dell’Arduino connesso al PC. ATTENZIONE: senza aver connesso l’Arduino al PC l’applicativo non sarà in grado di svolgere nessuna delle sue funzioni dal momento che il contatore utilizzato per la misura di tutti i tempi è quello di Arduino.

doReactTime()  e doReactTimeSpeed() : Entrambe queste funzioni generano un Beep() dopo un tempo random. A partire da questo Beep() Arduino inizia a campionare i segnali sugli ingressi analogici ai quali è connesso l’accelerometro, e a sommare i 3 segnali i quadratura in modo da ottenere il modulo dell’accelerazione totale. dopo circa 500ms ( tempo che dovrebbe essere di gran lunga superiore al vostro tempo di reazione a meno che no siate Bradipi!! 😉 ) i campioni salvati vengono inviati a TestManager tramite la funzione Transfer() chiamata ciclicamente. Alla completa trasmissione dei campioni l’applicazione TestManager provvederà a disegnare su un grafico la vostra accelerazione. La funzione doReactTimeSpeed() oltre che a svolgere quello appena descritto, continua anche il test misurando anche il tempo sulla distanza come un normale test di velocità.

Vi sarete accorti che la funzione Beep() viene chiamata sia nella funzione doStart() che nella funzione doStop(). Molto probabilmente avrete anche pensato che questo ritardo di 30ms potrebbe non essere trascurabile relativamente al cronometraggio che state effettuando. In effetti no! 30ms non sono un tempo trascurabile, però essendo presente sia in fase di START che in fase di STOP i due ritardi si elidono perfettamente! Quindi state pure tranquilli!! 🙂

Potete scaricare gratuitamente il codice per Arduino da GitHub dal seguente pulsante.

Nel post successivo vi illustrerò le principali funzioni dell’applicazione per PC TestManager.

 

 

 

 

 

Precedente [TUTORIAL] 2 - Arduino & Processing - Inviare messaggi da Arduino a Processing Successivo [TUTORIAL] 7 - Costruire un cronometro da pista con Arduino - Applicazione su PC