Arduino Uno INTRODUZIONE INTRODUZIONE ALL'USO DELLE TECNOLOGIE ICT PER I SISTEMI URBANI ED IL TERRITORIO CONOSCENZE NECESSARIE La piattaforma Arduino: concetti di base • CARATTERISTICHE PRINCIPALI DELLA PIATTAFORMA ARDUINO • ARCHITETTURA ARDUINO UNO • COMPONENTI AGGIUNTIVE NELLO STARTER KIT Perché Arduino Arduino è una scheda elettronica che permette di programmare in maniera «semplice» un microcontrollore. Un microcontrollore è un dispositivo elettronico che permette di acquisire dati in ingresso (input), elaborarli e restituire dei risultati (output). E’ una versione ridotta del processore o CPU Le caratteristiche interessanti di Arduino sono varie: • Interfaccia semplice con sensori di vari tipo (sia analogici che digitali) • Programmazione molto semplice • Compatto • Molto diffuso • Bassi consumi Concetti di base dell'elettronica • L'elettricità è una forma di energia che si propaga attraverso conduttori (come i fili elettrici). Questa energia è facilmente trasformabile in altre forme di energia ad esempio per accendere una lampadina o far sentire suoni in un altoparlante. I dispositivi utilizzati per fare questo sono detti trasduttori. • Più in particolare i dispositivi che trasformano altri tipi di energie in energia elettrica sono detti sensori, mentre quelli che convertono energia elettrica in altre forme sono detti attuatori. • Un circuito è un insieme di componenti elettroniche che muove elettricità tra le componenti. Sono cicli chiusi di connessioni con un'alimentazione (es. batteria). • In un circuito elettricità fluisce da un punto a potenziale energetico maggiore (indicato come alimentazione, VCC o semplicemente +) ad un punto di potenziale inferiore. La terra o massa (o GND o -) è tipicamente il punto a minor potenziale. Concetti di base dell'elettronica • Corrente I (misurata in ampere, simbolo A): è la quantità di carica elettrica che passa attraverso uno specifico punto del circuito • Voltaggio V (misurato in volt, simbolo V): è la differenza di energia tra un punto del circuito ed un altro (o tensione) • Resistenza R (misurata in ohm, simbolo Ω): misura quanto un componente resiste al passaggio dell'energia elettrica • Potenza P (misurata in watt, simbolo W): misura l'energia dissipata dal circuito Legge di Ohm: V=R•I Prima legge di Joule: P=V•I=R•I2=V2/R Concetti di base dell'elettronica In un circuito, perché funzioni, ci deve essere almeno un percorso completo dall'alimentazione (VCC) a massa (GND) La corrente elettrica cerca sempre il percorso con meno resistenza possibile. Ciò vuol anche dire che se creata una connessione diretta (senza componenti, quindi senza o quasi resistenza, un filo ad esempio) tra VCC e GND, tutta la corrente fluirà lì (e nulla nel resto del circuito) e avrete fatto un corto circuito che provoca surriscaldamento e scintille e spesso brucia il circuito. Architettura di Arduino Uno Architettura di Arduino Uno Architettura di Arduino Uno Architettura di Arduino Uno Analogico vs Digitale Segnale analogico • Può assumere qualunque valore (eventualmente in un intervallo) • È continuo in ampiezza (quanto vale) • È continuo nello spazio e/o nel tempo. Segnale digitale • Può assumere un insieme finito di valori, cioè • è discreto in ampiezza • È una sequenza di numeri, quindi è discreto • nel tempo (e/o nello spazio) PIN digitali (2/2) • SPI: Serial Peripheral Interface, altro protocollo per la comunicazione seriale, realizzato mediante i pin 10-13 • Pin 13: questo è anche automaticamente collegato al LED che dicevamo prima e quindi se questo pin è a valore alto (1) il led è acceso, altrimenti è spento Altri componenti a disposizione Tralasciando i fili, i componenti principali sono: • BreadBoard (in italiano spesso chiamata millefori): è il componente su cui inserire i vari componenti sia per tenerli fermi sia per collegarli tra loro • Resistenze: ce ne sono molte e di tipo diverso. La caratteristica principale è il loro valore di resistenza (in ohm). • LED: sfruttano la proprietà di alcuni semiconduttori di emettere fotoni tramite emissione spontanea. Di solito hanno due terminali: anodo e catodo. L'anodo è il terminale più lungo, oppure il catodo presenta una piegatura. Per farli funzionare bisogna collegare l'anodo al + (VCC) e il catodo al – (GND) • Switch o interruttore: uno switch interrompe il flusso di corrente, "spezzando" il circuito quando aperto e chiudendolo quando chiuso. • Potenziometro: è un dispositivo che permette la variazione della tensione letta in uscita modificato tramite una manovella la resistenza del dispositivo. Ha 3 terminali, uno da collegare a VCC, uno a GND e il terzo (centrale o isolato) per leggere la tensione variabile. •PRIMO PROGETTO CON ARDUINO •SERIE VS PARALLELO NEI CIRCUITI ELETTRICI Primo Progetto Prima di cominciare a parlare di programmazione di Arduino facciamo un paio di prove per capire il concetto fondamentale di serie e parallelo. Qui Arduino fa solo da tramite fornendo alimentazione al circuito, ma null'altro. Innanzitutto colleghiamo Arduino all'alimentazione. La cosa più pratica è di utilizzare il cavo USB a disposizione nel kit collegandolo ad un computer (ad es il portatile). Componenti necessari: Arduino e breadboard, magari nella piattaforma in legno del kit • Due cavi lunghi (poss. rosso e nero) • Un led rosso • Uno switch o pulsante • Una resistenza da 220 ohm • Due connettori corti Primo Progetto Prima di cominciare a parlare di programmazione di Arduino facciamo un paio di prove per capire il concetto fondamentale di serie e parallelo. Qui Arduino fa solo da tramite fornendo alimentazione al circuito, ma null'altro. Innanzitutto colleghiamo Arduino all'alimentazione. La cosa più pratica è di utilizzare il cavo USB a disposizione nel kit collegandolo ad un computer (ad es il portatile). Componenti necessari: Arduino e breadboard, magari nella piattaforma in legno del kit • Due cavi lunghi (poss. rosso e nero) • Un led rosso • Uno switch o pulsante • Una resistenza da 220 ohm • Due connettori corti Primo Progetto • 1) Scollegare l'alimentazione prima di costruire il circuito • 2) Collegare cavo rosso da pin 5V di Arduino a uno qualsiasi dei fori nella linea + della breadboard. Stessa cosa con cavo nero tra pin GND e foro nella linea -. • 3) Posizionare lo switch a cavallo delle due parti della breadboard. La piega sui piedini deve andare verso il centro della board • 4) Mettere una resistenza da 220 ohm tra VCC e un lato dello switch Primo Progetto • 5) Collegare l'anodo (piedino più lungo) il led rosso con l'altro piedino dello switch mediante un filo (di colore qualsiasi) • 6) Collegare l'altro lato (catodo) del led con GND mediante un filo (colore qualsiasi) 7) Collegare l'alimentazione con il cavo USB e provare a premere lo switch Serie e Parallelo • Due componenti si dicono in serie quando vengono uno dopo l'altro. Due componenti di dicono in parallelo se esistono due percorsi paralleli della corrente, uno di fianco all'altro. • Modifichiamo l'esempio precedente mettendo prima due switch in serie e poi in parallelo. • In questo caso solo la pressione di entrambi gli switch fa accendere il led. Serie e Parallelo • Nel caso del parallelo invece basta che uno degli switch sia premuto per far accendere il led. PROGRAMMAZIONE ARDUINO INSTALLAZIONE SOFTWARE COMUNICAZIONE CON LA SCHEDA PRIME ISTRUZIONI PRIMO PROGETTO DI PROGRAMMAZIONE Programmazione dell’ Arduino • Cominciamo a vedere, sempre tramite esempi pratici, come programmare il microcontrollore di Arduino. • Programmarlo serve per modificare il suo comportamento a seconda degli ingressi (tipicamente dai sensori) e dell'algoritmo che si vuole realizzare. Tralasceremo se non strettamente necessario di fare disamine teoriche su algoritmi e concetti della programmazione • Innanzitutto è necessario che vi scarichiate ed installate l'IDE (Integrated Development Environment) per Arduino. Un IDE è un software che vi permette di scrivere direttamente il codice, compilarlo e scaricarlo sulla scheda Arduino per farlo funzionare. Spesso mette a disposizione anche altre funzionalità (come il debugger, l'help, l'evidenziazione delle parole chiavi, ecc.) Progetto con IDE Il progetto prevedrà 3 led (due rossi e uno verde): inizialmente il led verde sarà acceso e gli altri spenti. Alla pressione di un pulsante (switch – già visto) vogliamo che il verde si spenga e i due rossi lampeggino. Componenti necessari: • Arduino e breadboard • Due cavi lunghi (poss. rosso e nero) • Due led rossi e uno verde • Uno switch o pulsante • Tre resistenze da 220 ohm e una da 10 Kohm • Quattro connettori lunghi e uno corto Progetto con IDE 1) Come al solito come prima cosa collegiamo GND e VCC 2) Inseriamo i 3 led 3) Colleghiamo l'anodo di ciascuno con un PIN digitale (es: 4 e 5 ai rossi e 3 al verde). Il catodo è invece collegato attraverso una resistenza da 220 ohm a GND 4) Mettiamo lo switch come negli esempi precedenti. Colleghiamo ad alimentazione e a massa attraverso una res. da 10 kohm 5) Aggiungiamo una connessione tra un lato dello switch e il PIN digitale 2 Progetto con IDE In pratica noterete che questa volta non c'è un collegamento diretto tra switch e led, ma solo attraverso Arduino che utilizzerà il pin digitale 2 per verificare se è stato premuto lo switch e a questo punto cambierà il comportamento (acceso/spento) dei led mediante i pin digitali 3,4 e 5. Dobbiamo quindi scrivere il codice che effettua questa operazione Uso dei pin digitali I pin digitali hanno solo due stati possibili: HIGH (o ON, acceso) e LOW (o OFF, spento). Se un PIN in OUTPUT è messo HIGH significa che avrà una tensione di 5V. • Come detto in precedenza, i pin digitali di Arduino possono essere posti sia come input che come output • Di solito si parte almeno con il pin 2 perché i pin 0 e 1 come visto sono utilizzati per la trasmissione seriale ci serviranno 3 comandi: 1. pinMode per scegliere se un pin è input o output per quel programma 2. digitalRead per leggere un valore da un pin digitale in input 3. digitalWrite per scrivere un valore su un pin digitale in output Uso dei pin digitali Ogni programma o sketch di Arduino ha due funzioni principali. Una funzione è una parte di programma che esegue comandi specifici (simile al concetto di funzione in matematica). Le funzioni hanno nomi univoci e vengono "chiamate" (o "invocate") quando serve. Le funzioni principali di Arduino sono chiamate setup() e loop() (dove le parentesi stanno ad indicare i parametri di ingresso alla funzione che in questo caso non ci sono). La dichiarazione base di queste funzioni è la seguente: void setup() { } void loop() { } Il codice racchiuso tra parentesi graffe rappresenta la lista di comandi di quella funzione Uso dei pin digitali I programmi (in qualsiasi linguaggio) ricevono in ingresso dei dati, li elaborano e forniscono in uscita dei risultati. Per raggiungere questo risultato fanno uso di variabili, costanti, funzioni e comandi • Le variabili sono delle entità che memorizzano dei dati (all'interno della memoria di Arduino). Esse hanno un nome (significativo), un tipo (che indica quale tipo di dato può essere memorizzato) ed eventualmente un valore iniziale (o di default; se non indicato il valore può essere zero o indefinito a seconda del processore). Il dato contenuto in una variabile può appunto variare valore, a differenza delle costanti. Basti per ora sapere che la dichiarazione di una variabile si fa con: <tipo> <nome> [ = <valore iniziale ]; Uso dei pin digitali Le variabili possono essere dichiarate fuori da qualsiasi funzione (ed in tal caso si chiamano globali) o all'interno di una funzione (ed in tal caso si chiamano locali). Le variabili globali sono "visibili" (cioè utilizzabili) da tutto il programma e da ogni funzione. Le variabili locali sono invece visibili solo all'interno della funzione dove sono dichiarate. • Non possono esserci due variabili "allo stesso livello" con lo stesso nome, ma possono esserci (anche se meglio non farlo per evitare confusione) due variabili con lo stesso nome (e tipo diverso volendo!) che tra loro sono visibili. Es: int a=0; int a=0; void setup() { int a=1; int a=1; } void setup() { } OK! NO!! Il codice Programma di prova (2/3) La fuzione setup() citata prima viene eseguito solo una volta quando l'Arduino viene acceso (o la prima volta che viene caricato un nuovo sketch). In questa funzione di solito si fanno le operazioni di inizializzazione del programma. Nel nostro esempio dobbiamo solo settare per i 4 pin digitali se sono input o output. void setup() { pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(2,INPUT); } Il codice • La fuzione loop() invece viene eseguita in continuazione dopo la fine dell'esecuzione di setup(). Questo è il cuore del programma. Nel nostro caso dobbiamo leggere il valore del pin 2 per verificare se è stato premuto il bottone e di conseguenza cambiare lo stato switchState e il comportamento dei led. • Per verificare il valore di un pin in input si usa digitalRead con un parametro che è il numero del pin da leggere. void loop() { switchState = digitalRead(2); • // questo è un commento Se avete necessità di inserire un commento si usano le doppie barre (dritte /, sopra al 7, non quelle rovesciate \ a sinistra di 1). • Se c'è tensione sul pin 2 (e si ha solo se il circuito è chiuso dal bottone, quindi il bottone è premuto), allora nella variabile switchState si mette il valore 1 (HIGH) altrimenti il valore 0 (LOW). IF ed ELSE Cominciamo a vedere le strutture di controllo. Queste permettono di modificare l’esecuzione sequenziale del programma. La prima e più semplice (anche più usata) è l'istruzione condizionale IF che permette di eseguire due parti di programma diverse a seconda che una condizione sia VERA o FALSA. Per verificare una condizione si usano i predicati booleani e gli operatori relazionali o Gli operatori relazionali sono: == (uguale), != (diverso), <, <=, >, >=. Mettono a confronto due valori e se il confronto è vero (es 5>4) allora restituiscono il valore VERO (true, 1) altrimenti FALSO (false, 0). IF ed ELSE I predicati booleani si basano sull'Algebra di Boole. I simboli (valori) di base dell’algebra di Boole sono lo 0 (falso) e 1 (vero), come nel sistema binario. oLe operazioni di base dell’algebra sono: o somma o OR logico oprodotto o AND logico ocomplemento o NOT logico O Le tabelle di verità di queste operazioni sono le seguenti: Legge di De Morgan: NOT(a AND b) = NOT(a) OR NOT(b) NOT(NOT(a) OR (b AND c)) = a AND NOT(b AND c) = = a AND NOT(b) OR NOT(c) Il codice Riprendiamo quindi il nostro progetto. Eravamo rimasti alla funzione loop() che iniziava così: void loop() { switchState = digitalRead(2); Ora verifichiamo il valore letto dal pin 2: if (switchState == LOW) { digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); } Quindi se il pulsante non è premuto, il pin 2 è a LOW, quindi anche switchState, quindi si esegue la parte IF accendendo il led verde e tenendo spenti quelli rossi Il codice Se invece il pulsante viene premuto vogliamo far lampeggiare i due led rossi e spegnere il verde: else { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); delay(250); // aspetta per ¼ di secondo digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); delay(250); // aspetta per ¼ di secondo } } // fine loop()