Lezione 2
Filed under: Programmazione Arduino
Comments: None
Operazioni di INPUT
In questa seconda lezione passiamo ad analizzare l’altra operazione che permette al microcontrollore che governa Arduino di interagire con il mondo “esterno”.
Si tratta dell’operazione di INPUT. L’operazione viene definita di “ingresso” (input) poichè i dati del mondo esterno “entrano” all’interno del microcontrollore.
A differenza della scorsa lezione si tratta quindi di operazioni di lettura.
Esercitazione 4: Uso di interruttori
Con la piattaforma TinkerCad realizziamo questo circuito
Quello che si vuole realizzare è un funzionamento di questo tipo:
- Commutando lo switch S1 si deve accendere/spengere il Led Verde
- Commutando lo switch S2 si deve accendere/spengere il Led Rosso
Il programma è quindi molto facile da realizzare… il codice lo trovate qui.
Scritto quasi ad “occhi chiusi” perchè tanto è semplice… ma, ma… andando in simulazione ci accorgiamo che non funziona. O meglio, qualcosa fa, ma non esattamente quello che volevamo. All’inizio a volte i led sono spenti, ma spesso sono accesi, in ogni caso facendo scorrere la slitta dell’interruttore si accendono e non si spengono più.
Per controllare meglio proviamo a collegare un multimetro, impostato come voltmetro, all’ingresso del microcontrollore. In effetti ci accorgiamo che la tensione passa da 5 volt (alimentazione positiva) a quasi zero, ma non zero, ovvero a poco più di 50 mV. Inoltre l’interruttore su cui abbiamo collegato il voltmetro adesso funziona perfettamente, ossia accende e spenge regolarmente il Led Rosso.
Cosa succede?
Quando spostiamo la slitta dell’interruttore e scolleghiamo il piedino del microcontrollore dalla tensione di +5 volt, il filo connesso al piedino rimane scollegato, libero, ossia non connesso a nessun potenziale elettrico, in gergo si dice che è “flottante”. Un conduttore lasciato libero in aria funziona come da antenna e riesce a captare piccoli segnali elettrici o a mantenere per lungo tempo il potenziale che aveva in precedenza, prima di riuscire a disperderlo. In sostanza in genere si comporta spesso come se fosse collegato ad una sorgente di tensione, in ogni caso il potenziale a cui si pone è assolutamente aleatorio.
Per evitare questo problema ogni conduttore deve essere sempre e comunque legato ad un potenziale alto (alimentazione positiva) o basso (alimentazione negativa o massa). Nel nostro caso possiamo risolvere collegando un resistore da 10 Kohm verso il negativo (resistore di pull-down), riprovando con il medesimo programma di prima vedremo che il problema non si ripresenta e tutto funziona correttamente. Vedremo anche che la tensione sul piedino andrà da +5 volt a 0 volt.
Esercitazione 5 e 6: Uso di pulsanti
Con la piattaforma TinkerCad realizziamo questo circuito
Memori dell’esperienza precedente questa volta mettiamo subito i resistori di pull-down sul piedino del microcontrollore.
Prima di effettuare i collegamenti occorre puntualizzare il tipo di pulsante da noi utilizzato. In questo tipo di pulsante i quattro terminali sono collegati a coppie: i piedini 1 e 2 sono collegati insieme tra loro, così come i piedini 3 e 4, quando viene premuto il pulsante queste due coppie 1-2 e 3-4 vengono a sua volta collegate fra loro.
Guardando lo schema realizzato con TinkerCad i piedini sulla sinistra ed etichettati con 1a e 1b costituiscono una coppia, mentre quelli con etichetta 2a e 2b costituiscono l’altra coppia. Per visualizzare l’etichetta basta posizionare il puntatore del mouse sul piedino ed attendere un istante.
La funzione da realizzare richiesta al programma è la seguente:
- All’inizio tutti i Led sono spenti.
- Premendo il pulsante di sinistra una volta il Led Verde si accende (poichè era spento)
- Premendo il pulsante di sinistra una volta ancora il Led Verde si dovrà spengere e così via.
- Il pulsante destro si comporterà come il precedente, però attivando/disattivando l’accensione del Led Rosso.
Come abbiamo visto durante la lezione, da adesso in poi converrà strutturare la sequenza del programma in questo modo:
- Il programma deve “leggere” lo stato di TUTTI gli ingressi e lo memorizza temporaneamente in memoria (RAM) per gli usi successivi. In pratica il microcontrollore fa una “foto” dello stato del mondo esterno.
- Il microcontrollore, tramite il programma, elabora questi dati e prende delle “decisioni”, in pratica crea altri dati.
- Il microcontrollore emette in uscita alcuni dati (risultati dalle elaborazioni precedenti e quindi dagli ingressi letti), “scrive” cioè verso il mondo esterno.
Il programma creato (che trovate qui), che a prima vista non presenta errori, però non si comporta come desiderato. Durante la simulazione a volte la pressione del pulsante fa cambiare di stato al Led associato ma, molto più spesso lo lascia invariato. Nel corso della lezione abbiamo visto che introducendo un certo ritardo nell’esecuzione della funzione loop(), si ottiene un miglioramento, ma il programma non funziona ancora correttamente. Inoltre vi ho già “intimato” di non utilizzare mai l’istruzione delay() poichè essa provoca un blocco totale del microcontrollore (in questo caso per 100 msec) durante il quale esso non fa altro che attendere…
Occorre modificare sostanzialmente il programma, impostandolo in modo che il microcontrollore in ogni momento sappia com’è lo stato di un ingresso, com’era in precedenza e quanto tempo è trascorso dall’ultima variazione di quell’ingresso. La procedura a prima vista potrebbe sembrare un’inutile complicazione, in realtà il tutto si traduce in una maggior sicurezza ed affidabilità del funzionamento, inoltre viene risolto anche un altro problema, quello dei “rimbalzi” a cui ho accennato durante la lezione.
In questo documento potete trovare spiegato l’argomento in maniera più dettagliata. Mentre a questo link trovate il programma definitivo che risolve anche i problemi presentatisi fino ad ora.
All’interno del programma trovate anche un ulteriore quesito. Prossimamente troverete qui sotto la soluzione da me proposta.
Riepilogo dei contenuti della lezione:
- L’istruzione digitalRead() effettua delle “letture” dagli ingressi ovvero il mondo “esterno” entra nel microcontrollore.
- Abbiamo visto che l’istruzione if() permette al microcontrollore di prendere delle decisioni (o effettuare scelte), essa può essere legata (opzionalmente) anche all’istruzione else che permette di effettuare decisioni alternative.
- Abbiamo utilizzato il simbolo “!“ che in linguaggio C significa negazione ovvero il contrario di…
- Abbiamo utilizzato il simbolo “>” ossia maggiore di (ovviamente esiste anche il contrario “<“) che può essere utilizzato nei confronti per prendere delle decisioni. Esiste anche il simbolo comparativo di uguaglianza “==” ed il simbolo di disuguaglianza “!=” (diverso da…) come anche i simboli “>=” e “<=” (maggiore o uguale a… e minore o uguale a...)
- Abbiamo utilizzato il simbolo “&&” per legare due condizioni (entrambe da verificare cioè devono essere entrambe vere) nel costrutto if().
Alla prossima lezione…