Lezione 1
Filed under: Programmazione Arduino
Comments: None
Operazioni di OUTPUT
Partiamo dalle più semplici operazioni gestibili con un microcontrollore come quello utilizzato nella scheda Arduino.
Esercitazione 1: Lampeggio Verde/Rosso
Con la piattaforma TinkerCad realizziamo questo circuito
Il funzionamento richiesto deve essere il seguente (con temporizzazioni fisse di 0,5 sec ovvero 500 msec):
- Si deve accendere il solo Led Verde
- Quindi si accende anche il Led Rosso insieme al Verde
- Si spenge il Led Verde (ma rimane acceso il Rosso)
- Si spegne anche il Led Rosso
- Il ciclo si ripete all’infinito
Il codice completo lo trovate qui (utilizzatelo solo dopo aver provato da soli).
Esercitazione 2: Semaforo semplificato a due vie
Come seconda prova propongo questo circuito
Immaginiamo di dover realizzare la gestione di una sequenza semaforica costituita da due gruppi di luci (rosso/giallo/verde) presenti in un incrocio di due vie. Per semplificare le due direzioni NS (Nord-Sud) e EW (Est-Ovest) hanno le stesse luci a coppie ossia il Rosso Nord si accenderà insieme al Rosso Sud, il Verde Nord insieme al Verde Sud, ecc.
Chiaramente quando nella direzione NS è acceso il colore Verde oppure Giallo, nella direzione ortogonale EW dovrà obbligatoriamente essere acceso il colore Rosso. Per questa ragione prendiamo in considerazione solo le sequenze di accensione dei colori Verde e Giallo, il Rosso opposto sarà acceso di conseguenza.
Le temporizzazioni richieste, inizialmente, sono di 5 secondi per il Verde e di 2 secondi per il Giallo. In seguito verrà chiesto di differenziare la tempistica per una delle due direzioni.
Il funzionamento richiesto è il seguente:
- Si accende il Verde nella direzione NS per 5 secondi (e quindi il Rosso EW)
- Si accende il Giallo nella direzione NS per 2 secondi (e quindi rimane acceso il Rosso EW)
- Si accende il Verde nella direzione EW per 5 secondi (e quindi anche il Rosso NS)
- Si accende il Giallo nella direzione EW per 2 secondi (e quindi rimane acceso il Rosso NS)
- Si ripete la sequenza dall’inizio
Nota: Le luci non indicate dovranno essere spente in ogni singolo punto, consiglio quindi di pilotare TUTTE le volte TUTTE le uscite, alcune saranno accese mentre altre spente.
Il codice completo lo trovate qui (utilizzatelo solo dopo aver provato da soli).
Esercitazione 3: Lampeggio “Real Time”
Come ultima prova di questa lezione propongo questo circuito
La funzione richiesta questa volta sembra molto semplice:
- Il Led Verde deve lampeggiare con un ritmo di 2 sec. ON / 2 sec. OFF
- Il Led Rosso deve lampeggiare con un ritmo di 0,5 sec. ON / 0,5 sec. OFF
- Il tutto ripetuto all’infinito
A prima vista, ripeto, potrebbe sembrare molto semplice da realizzare. In realtà è impossibile (o quasi) da ottenere con le tecniche viste finora, cioè con semplici sequenze lineari di istruzioni. Impossibile no, perchè prendendo il programma della prima esercitazione e modificandolo, con un numero di righe di istruzione circa 4-5 volte più grande si può ottenere il risultato richiesto. Ma se vi dicessi che va aggiunto un terzo Led, lampeggiante anch’esso e magari con un numero di volte che sta in rapporto di numero primo con gli altri ?
Il codice completo lo trovate qui (utilizzatelo solo dopo aver provato da soli).
I più attenti fra voi avranno notato un terzo Led di colore Blù che non è stato citato nel testo e non è utilizzato. A cosa serve? A complicare ancora di più le richieste:
- Ad ogni 5 lampeggi del Led Rosso il Led Blu si deve accendere per 1 secondo e quindi spengersi.
Il codice completo lo trovate qui (utilizzatelo solo dopo aver provato da soli).
Riepilogo dei contenuti della lezione:
- Le righe che iniziano con il simbolo // sono commenti e sono ignorate dal compilatore in linguaggio C. Usatele per chiarire i punti critici.
- Nel software della piattaforma Arduino la funzione setup() viene eseguita per prima ed una sola volta. Usatela per impostare le condizioni iniziali della macchina.
- Nel software della piattaforma Arduino la funzione loop() viene richiamata in continuo (in loop appunto) dopo la funzione setup() e non ha mai termine (solo con lo spengimento della macchina).
- La funzione pinMode() serve per impostare la modalità di funzionamento del piedino del microcontrollore della scheda di Arduino: INPUT o OUTPUT. Abbiamo visto per adesso solo la seconda possibilità.
- La funzione digitalWrite() serve per impostare un valore digitale su di un piedino di Arduino. Scrivendo HIGH o 1 sul pin saranno presenti 5 volt ed eventuali componenti connessi verranno “accesi”, mentre scrivendo LOW o 0 sul pin saranno presenti 0 volt ed eventuali componenti connessi verrano “spenti”. Il piedino deve essere definito come OUTPUT in precedenza.
- La dichiarazione #define non è una funzione del linguaggio C (manca infatti della coppia di parentesi tonde), ma bensì una direttiva o comando del preprocessore del linguaggio C. In pratica si può utilizzare per definire delle costanti utilizzate nel nostro programma. In realtà è molto più potente.
- La funzione if() esegue un controllo, in genere fra variabili utilizzate nel programma, per determinare se eseguire un pezzo di codice oppure (else) un altro pezzo di codice. La parte che segue subito la funzione if(), contenuta nella prima coppia di parentesi graffe, viene eseguita se il risultato del controllo è vero (true), altrimenti (else) viene eseguita la parte contenuta nella seconda coppia di parentesi graffe. Notare che, mentre la prima parte è obbligatoria la parte con else e seconda coppia di parentesi può anche mancare.
Alla prossima lezione…