Introduzione alla Robo0ca Ing. Fabrizio Flacco Dipar1mento di Ingegneria Informa1ca, Automa1ca e Ges1onale Lezione 3 Programmare Arduino Cos’è un programma Un programma è una serie di istruzioni che vengono leCe dall’alto verso il basso e conver1te in eseguibile e poi trasferite sulla scheda Arduino. Per eseguire un programma è necessario compilarlo. Il processo di compilazione trasforma le istruzioni scriCe in linguaggio naturale in una serie di istruzioni macchina eseguibili dal microprocerssore. Per ARDUINO la fase di compilazione si traduce e completa essenzialmente nella fase di caricamento del codice sulla scheda stessa. I programmi in ARDUINO sono chiama1 “Sketch”. Fabrizio Flacco 2 Programmare Arduino Stru?ura di un programma Istruzioni: Le istruzioni di programma vanno terminate con il punto e virgola. Un gruppo di istruzioni deve essere racchiuso tra parentesi graffe. I commen0: I commen1 inseri1 all'interno del sorgente tra le istruzioni di programma permeCono di documentare le par1 del programma. I commen1 sono ignora1 dal processore. Blocco di commen0 /* .... */ Un blocco di commen1 inizia con /* e termina con i simboli */ /*Tra ques1 simboli posso commentare il codice che sviluppo senza che in fase di compilazione venga occupata memoria. Ques1 commen1 vengono ignora1.*/ Linea di commento// Quando si vuole commentare solo una linea si u1lizzano le doppie // // linea di commento Le linee singole di commento vengono spesso usate dopo un'istruzione per fornire più informazioni rela1vamente a quanto serva l'istruzione per poterlo ricordare anche in seguito. Fabrizio Flacco 3 Programmare Arduino Variabili Le variabili permeCono di assegnare un nome e memorizzare un valore numerico da u1lizzare per scopi successivi nel corso del programma. Scegliere il nome della variabile in modo descriVvo in modo da rendere il codice più semplice da ricostruire. TuCe le variabili devono essere dichiarate prima del loro u1lizzo. Dichiarare una variabile significa definire il 1po di valore, come ad es. int, float, long, assegnarle un nome e assegnarle opzionalmente un valore iniziale. Il valore della variabile può essere cambiato in ogni momento si necessita mediante operazioni aritme1che o altri diversi 1pi di assegnamen1. Fabrizio Flacco 4 Programmare Arduino Variabili Tipi di dato Fabrizio Flacco 5 Programmare Arduino Variabili { int num1=4; int num2=6; int numeroSomma=num1+num2; //somma di due numeri } Fabrizio Flacco 6 Programmare Arduino Funzioni Una funzione è un blocco di codice che viene eseguito nel momento in cui essa viene chiamata. Dichiarazione di funzione La funzione è dichiarata tramite la specificazione del 1po di funzione. Questo è il valore che res1tuisce (return) la funzione stessa. Se non deve essere res1tuito alcun valore la funzione sarà del 1po “void”. Dopo la dichiarazione del 1po si dichiara il nome e si fa seguire le parentesi tonde entro cui vanno inseri1 i parametri che devono essere passa1 alla funzione se necessari. Sintassi 0po nomeFunzione(parametro1, parametro2, ... , parametro n){ istruzioni da eseguire; } Fabrizio Flacco 7 Programmare Arduino Funzioni Esempio di una funzione che effeCua la somma tra due numeri interi num1 e num2 int somma(int num1, int num2){ int numeroSomma=num1+num2; return numeroSomma; } int specifica il 1po di funzione; somma è il nome della funzione num1 e num2 sono i parametri che vengono passa1 alla funzione stessa numeroSomma è il valore di 1po int che la funzione res1tuisce in caso di chiamata. int x = somma(4,6);// esempio di chiamata di una funzione denominata somma Fabrizio Flacco 8 Programmare Arduino Stru?ura di uno sketch ARDUINO La struCura 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 disposi1vi collega1 con Arduino e i blocchi di istruzioni per svolgere quanto richiesto. void setup( ) La funzione setup( ) è la prima ad essere chiamata quando parte uno sketch. Viene u1lizzata per inizializzare variabili, per impostare lo stato dei pin, per far par1re le librerie da usare... La funzione di setup() sarà la prima ad essere eseguita dopo ogni accensione o reset di Arduino. Sintassi void setup( ){ //istruzioni varie; } Fabrizio Flacco 9 Programmare Arduino Stru?ura di uno sketch ARDUINO void loop( ) Dopo la creazione della funzione setup(), che inizializza e imposta i valori iniziali, la funzione loop() fa proprio quanto suggerisce il proprio nome eseguendo ciclicamente il programma definito al suo interno. PermeCe l'esecuzione del programma, interagisce con la scheda Arduino. Sintassi void loop( ){ // istruzioni da ripetere; } Fabrizio Flacco 10 Fflacco Fflacco omponents Circuit Scribe Blog Help Search Shop Primo programma $ Watch 0 & Fork 0 ! Edit Circuit D7 D6 D5 D4 D3 D2 D1 D0 Code Editor AREF GND D13 D12 D11 D10 D9 D8 Start Simulation % Star 0 Comandiamo il led RST 3v 5v Gnd Vin 0 1 2 3 4 5 Analog In D1 ARDUINO Diecimila /RESET 3V 5V GND2 GND1 VIN Duemilanove 0 Comments 123D Circuits Fabrizio Flacco UNO R1/R2 U1 A0 A1 A2 A3 A4 A5 R1 ! Login 11 ! Share / Embed Primo programma Comandiamo il led int led=13; void setup() { pinMode(led, OUTPUT); //imposta il pin led come uscita } void loop() { digitalWrite(led, HIGH); //accendi il led delay(1000); //aCendi un secondo digitalWrite(led, LOW) //spegni il led delay(1000); //aCendi un secondo } Fabrizio Flacco 12 Un circuito elettrico, più precisamente, è costituito da una catena ininterrotta di elementi che si lasciano attraversare da particelle cariche e per questo sono chiamati conduttori elettrici: un filo metallico, una lampadina, la ‘resistenza’ di uno scaldabagno ne sono esempi. Gli elettroni non gareggiano fra loro ma si spostano più L’interru?ore o meno tutti assieme. Ciò che li spinge lungo il circuito è la forza, di natura elettrica, prodotta da un generatore, Nuovo componente apparecchio utilizzatore (lampadina) conduttore metallico interruttore aperto elettroni interruttore chiuso generatore elettrico (pila) elettrica posseduta da un singolo elettrone è piccolissima. Per farci un’idea, diciamo che 1 ampere è approssimativamente la corrente che deve scorrere in una torcia elettrica per far accendere la lampadina. Per far marciare un locomotore elettrico occorre una corrente molto più intensa, attorno a 1.000 A. Ancora più intense, di circa 100.000 A, ma di brevissima durata, sono le correnti generate quando scocca un fulmine. Ma anche correnti elettriche debolissime possono essere molto importanti. Per esempio, sono indispensabili le correnti che, mentre stiamo leggendo, portano informazioni dagli occhi al cervello attraversando i circuiti formati dalle fibre del nostro sistema nervoso; oppure quelle di intensità compresa fra un miliardesimo e un milionesimo di ampere, che fanno funzionare i milioni di circuiti elettronici (microchips) contenuti all’interno di un calcolatore. locomotore elettrico 1.000 A fulmine 100.000 A CORRENTE, TENSIONE E RESISTENZA DI UN CIRCUITO Da che cosa dipende l’intensità della corrente che scorre in un circuito elettrico? I fattori essenziali sono due: la tensione elettrica del generatore, che rappresenta la forza con cui il generatore spinge le cariche elettriche Fabrizio Flacco 13 L’interru?ore Schema del circuito Fabrizio Flacco 14 Istruzioni condizionali IF L'istruzione if permeCe di eseguire blocchi di codice diversi in base al risultato di una condizione. La struCura è composta dalla parola if, seguita da una condizione booleana e poi da un blocco di istruzioni (eventualmente anche una sola istruzione) che viene eseguito se la condizione è verificata. if (x>120){ digitalWrite(LED1,HIGH); } Le condizioni che vengono valutate all'interno delle parentesi tonde () richiedono l'uso di uno o più operatori seguen1 (operatori di confronto): x == y // x uguale a v x!= y // x diverso da y x<y // x minore di y x>y // x maggiore di y x<=y // x minore o uguale a v x>=y // x maggiore o uguale a y Fabrizio Flacco 15 Istruzioni condizionali IF Condizioni if/else La parola else (facolta1va ) introduce il blocco di istruzioni (o la singola istruzione) chedeve essere eseguito nel caso in cui la condizione introdoCa da if risul1 falsa. Esempio if (x>120){ digitalWrite(led1,HIGH); }else{ digitalWrite(led2,HIGH); } Fabrizio Flacco 16 L’interru?ore Codice int led = 13; int buCon = 2; void setup() { pinMode(led, OUTPUT); pinMode(buCon, INPUT); } void loop() { int stato_buCon=digitalRead(buCon); //leggi lo stato dell’interruCore if (stato_buCon==HIGH){ //se è premuto digitalWrite(led, HIGH); //accendi il led }else{ //altrimen1 digitalWrite(led, LOW); //spegni il led } } Fabrizio Flacco 17 Istruzione for cicli Il ciclo for ripete un'istruzione o un blocco di istruzioni per un numero prefissato di volte. Il ciclo for viene u1lizzato per una iterare (ripetere) un blocco di istruzioni per un numero prefissato di volte e u1lizza un contatore per incrementare e terminare un ciclo. Sintassi for (inizializzazione ; condizione ; incremento){ istruzioni; } inizializzazione: è un'espressione che inizializza un ciclo. In un ciclo guidato da un indice, esso viene dichiarato ed inizializzato qui.Le variabili dichiarate in questa parte sono locali e cessano di esistere al termine dell'esecuzione del ciclo. condizione: è la condizione valutata a ogni ripe1zione. Deve essere un'espressione booleana o una funzione che res1tuisce un valore booleano (i<10 ad es.). Se la condizione è vera si esegue il ciclo, se falsa l'esecuzione del ciclo termina. incremento: è un'espressione o una chiamata di funzione. Solitamente è u1lizzata per modificare il valore dell'indice o per portare lo stato del ciclo fino al punto in cui la condizione risulta falsa e terminare. Fabrizio Flacco 18 Istruzione for cicli Fabrizio Flacco 19 Istruzione for Codice int buCon = 2; void setup() { for (int led=9; led<=13; led++){ pinMode(led, OUTPUT); } pinMode(buCon, INPUT); } void loop() { int stato_buCon=digitalRead(buCon); //leggi lo stato dell’interruCore if (stato_buCon==HIGH){ //se è premuto for (int led=9; led<=13; led++){ digitalWrite(led, HIGH); //accendi il led } }else{ //altrimen1 for (int led=9; led<=13; led++){ digitalWrite(led, LOW); //accendi il led } } } Fabrizio Flacco 20