Lezione Seconda Primi passi di programmazione Arduino Lezione Seconda Primi passi di programmazione Prof. Ponte Vincenzo
Wiring Wiring e’ il linguaggio di programmazione, derivato dal C++, utilizzato per scrivere programmi installabili su Arduino. Il microcontrollore legge, attiva e disattiva le porte di Arduino seguendo le istruzioni contenute in uno sketch, e cioe’ un programma scritto in wiring e compilato attraverso l’IDE, un ambiente di sviluppo gratuito operante su pc.
Wiring L’IDE consente di utilizzare il PC per scrivere il programma, compilarlo e trasferirlo, tramite una connessione USB, su Arduino. L’IDE presenta una finestra riservata alla scrittura del programma, alcune icone per le funzioni di verifica, compilazione, carico e salvataggio dei programmi ed una serie di menu’ a tendina abbastanza intuitivi.
Wiring Una volta scritto e compilato lo sketch nell’IDE, dovete fare clic sul pulsante Verify. Se vedete che l’IDE fa apparire il messaggio Done compiling significa che avete scritto e verificato correttamente il vostro primo codice. Se no,dovete leggere il messaggio che vi mostra l’IDE e cercare di capire che cosa è successo.
struttura di un programma La struttura base del linguaggio di programmazione di Arduino si sviluppa sulla definizione di due funzioni: void setup() e void loop(). Queste due funzioni racchiuderanno le necessarie impostazioni per il funzionamento dei dispositivi collegati con Arduino e i blocchi di istruzioni per svolgere quanto richiesto. Attenzione: le variabili e le librerie vanno dichiarate prima del void setup()
struttura di un programma La funzione setup( ) è la prima ad essere chiamata quando parte uno sketch. Sarà la prima ad essere eseguita dopo ogni accensione o reset. Sintassi void setup( ) { // istruzioni varie; }
struttura di un programma void loop() // programma principale (main) --> //ciclo infinito (loop) { // istruzioni del programma che deve essere //eseguito all’infinito }
struttura di un programma setup() è la funzione per l’inizializzazione, mentre loop() è la funzione principale per l'esecuzione. La funzione setup() viene eseguita solo una volta, ed è usata per impostare le modalità di funzionamento dei pin come input/output (pinMode) o per inizializzare la comunicazione seriale. La funzione loop() che segue include il codice che deve essere eseguito in un ciclo infinito (loop), ad esempio con la lettura degli ingressi, la successiva elaborazione degli stessi e la modifica delle uscite, ecc. Questa funzione è il cuore di tutti i programmi di Arduino e risulta quella che esegue il software implementato per eseguire un determinato lavoro.
le parentesi graffe { } parentesi graffe Le parentesi graffe definiscono l'inizio e la fine dei blocchi di funzione e di blocchi delle istruzioni come il “void loop()” ed anche per le istruzioni “for”, “if”, “while”, etc. Una parentesi graffa aperta “{“ deve sempre essere seguita da una parentesi graffa di chiusura “}”
“;” punto e virgola Un punto e virgola deve essere utilizzato per terminare una istruzione e separare gli elementi o istruzioni del programma. Un punto e virgola è usato anche per separare le istruzioni sul contatore all’interno di un’struzione for.
/*... */ commento su più righe I commenti su più righe sono aree di testo che vengono ignorate dal programma e sono usate per le descrizioni di grandi dimensioni di codice o di commenti che aiutano a far capire ad altre persone tutte le parti del programma. Essi iniziano con “/*” e finiscono con “*/”. Poiché i commenti vengono ignorati dal programma e non occupano spazio di memoria dovrebbero essere usati con generosità e devono essere usati per "commentare" i blocchi di codice.
// linea di commento Il commento sulla riga singola inizia con “//” e termina quando si va a capo. Tutti i commenti vengono ignorati dal programma e non occupano spazio di memoria. // questa è una singola linea di commento I singoli commenti vengono spesso utilizzati dopo una dichiarazione valida per fornire maggiori informazioni su ciò che compie la dichiarazione o per fornire un promemoria futuro.
Variabili (definizione, dichiarazione) Le variabili sono sequenze di caratteri alfanumerici (lettere, numeri e caratteri di punteggiatura) che identificano uno o più bytes nella memoria del PC. Una dichiarazione è quindi una riga di programma del tipo: int calcolo; // indica che la variabile che si chiama calcolo è un intero .Nella dichiarazione si può anche dare un valore iniziale alla variabile int calcolo=3; // indica che la variabile che si chiama calcolo è un intero e a quel punto del programma vale 3.
Operazione di assegnazione Il simbolo “=” nella dichiarazione “ int calcolo=3; ” indica che il valore o l’espressione che sta a destra viene inserito nella variabile (nelle celle di memoria) che sta a sinistra; non vuol dire assolutamente che quello che c’è a destra è “=” a quello che c’è a sinistra, come in matematica. Se in una dichiarazione come quella precedente la differenza di definizione non è significativa, lo diventa in un’istruzione come “ i=i+1 ” espressione che in matematica è errata, ma che in linguaggio C significa che si somma alla variabile “i” il numero 1 e il risultato viene inserito nella cella dove prima c’era la variabile i. Il simbolo “=” in C si chiama operazione di assegnazione.
Variabili (definizione, dichiarazione) Esiste una situazione in cui si usa il doppio simbolo “=”, ovvero “==”: if (x==4) // se la variabile x e’ uguale 4 y=y+10; /* se la condizione precedente è vera allora aggiunge 10 alla variabile y */ In questo caso “x==4” è un’operazione di confronto: si controlla se il numero contenuto nelle celle di memoria identificate dalla x è uguale a 4, ma non si cambia il valore.
operatori aritmetici Gli operatori aritmetici inclusi nel compilatore sono addizione, sottrazione, moltiplicazione e divisione che restituiscono la somma, differenza, prodotto e quoziente (rispettivamente) dei due operandi. L'operazione è elaborata utilizzando il tipo dei dati degli operandi, così, per esempio, 9 / 4 fornisce come risultato 2 invece di 2,25 se i valori 9 e 4 sono del tipo “int” e vengono troncati i decimali.
operatori di confronto I confronti tra due variabili o costanti sono spesso utilizzati nelle istruzioni “if ... else” per verificare se una condizione specificata è vera. Le operazioni di confronto utilizzate sono:
true / false (vero / falso) Queste sono le costanti booleane che definiscono i livelli della logica. FALSE è definito come “0” (oppure livello logico BASSO = LOW), mentre VERO (TRUE) è definito come “1” (oppure livello logico ALTO = HIGH). Volendo utilizzare la logica booleana si ottiene che tutti i numeri diversi da zero corrispondono a VERO (TRUE) mentre solo il numero “0” corrisponde a FALSO (FALSE).
high / low (alto / basso) input / output (ingressi / uscite) Queste costanti definiscono i livelli dei pin come un livello alto o basso e vengono utilizzati durante la lettura e/o la scrittura dei pin digitali. Il livello ALTO (HIGH) viene definito come livello logico “1”, “ON” oppure +5V mentre il livello BASSO (LOW) è livello logico “0”, OFF oppure 0V (GND = GROUND).
if (se) L’istruzione “if” controlla se una certa condizione (compresa tra le parentesi tonde) si è verificata ed esegue le istruzioni all'interno delle parentesi graffe se l'affermazione è VERA. Se la condizione è FALSA, il programma salta alla prima istruzione dopo la chiusura della parentesi graffa. Nota: In condizione di uguaglianza occorre utilizzare il doppio simbolo “==”
if... else (se ... altrimenti) L’istruzione “if... else” permette di effettuare una scelta in base alla condizione dell’espressione contenuta nelle parentesi tonde.
Struttura del programma Nel linguaggio per Arduino occorre: 1) Dichiarare le variabili da utilizzare 2) Inizializzare la scheda definendo gli input (ingressi) digitali / analogici e gli output (uscite). 3) Funzione: setup() - viene eseguito una sola volta all'inizio per inizializzare le periferiche. 4) Funzione: loop() - vengono eseguite ripetutamente tutte le istruzioni comprese tra le parentesi graffe.
Funzioni implementate:vediamole pinMode( ) - impostare un pin come ingresso o uscita digitalWrite( ) - impostare un pin output digitale a livello alto / basso digitalRead( ) - leggi lo stato di un pin definito come input digitale analogRead( ) - legge e converte la tensione di un pin analogico in un valore numerico (10-bit) analogWrite( ) - scrive un valore "analogico" con PWM (8-bit) Delay( ) - aspetta un periodo di tempo (espresso in millisecondi) Millis( ) - si ottiene il tempo da quando la scheda è stata accesa.
INPUT / OUTPUT input / output digitale Come INPUT è possibile collegare e configurare qualsiasi pulsante o sensore tra i pin 2 e 12 della scheda [sono da escludere i pin O (RX), 1 (TX) e 13 (led interno)] Come OUTPUT è possibile collegare e configurare qualsiasi led tra i pin 2 e 13 della scheda [sono da escludere i pin O (RX), 1 (TX)]
PRIMO PROGRAMMA Lampeggio di un LED // Lampeggio LED int LED = 6; // LED connesso al pin digitale 6 // si può anche scrivere #define LED 6 “senza il ;” void setup( ) { // inizializza il pin del LED come uscita digitale: pinMode (LED, OUTPUT); } // Le istruzioni interne al loop vengono continuamente eseguite void loop( ) { digitalWrite(LED, HIGH); // Accende il LED delay(1000); // aspetta un secondo digitalWrite(LED, LOW); // spegne il LED
UTILIZZIAMO IL PULSANTE // Accendiamo e spegniamo un LED con 2 pulsanti int LED = 6; // LED connesso al pin digitale 6 int ButtonON =2; // pulsante connesso al pin2 int ButtonOFF =7; // pulsante connesso al pin7 /*Dichiarazione della variabile che legge lo stato del pulsante*/ int ButtonON_State = 0; int ButtonOFF_State = 0; void setup() { // inizializza il pin dei LED come uscita digitale: pinMode(LED, OUTPUT); pinMode(ButtonON, INPUT); // ìnizializza i l pin del pulsante come ingresso pinMode(ButtonOFF, INPUT); // ìnizializza i l pin del pulsante come ingresso digitalWrite(LED, LOW); // spengo il LED }
UTILIZZIAMO IL PULSANTE void loop() { // Legge Io stato dei pulsanti : ButtonON_State = digitalRead(ButtonON); delay(20); // attendo 20msec ButtonOFF_State = digitalRead(ButtonOFF); delay(20); // Se è premuto ON accende il LED): if (ButtonON_ State ==HIGH) { digitalWrite(LEDl, HIGH); // Accendo il LED } if (ButtonOFF_ State ==HIGH) { digitalWrite(LEDl, LOW); // Spengo il LED }
LABORATORIO Scegliere uno dei due progetti proposti: 1) Realizzare due giochi di luci con 4 led comandati da un pulsante. 2) Realizzare un semaforo che lampeggia quando si preme il pulsante.
Fine seconda parte Buon lavoro Prof. Ponte Prof. Ovazza