cominciamo ad usare Arduino (di Luigi Farucci)

by / venerdì, 05 maggio 2017 / Published in Collaboratori, Didattica, Scuola

 

COMINCIAMO AD USARE ARDUINO

di Luigi FARUCCI

 

AMBIENTE  DI PROGRAMMAZIONE: ARDUINO.EXE

Il programma che viene usato per scrivere i programmi per Arduino è arduino.exe ed è scaricabile dal sito http://arduino.cc/en/Main/Software. Sito ufficiale della piattaforma Arduino. Dopo l’installazione per aprire il programma basta fare doppio click sull’icona oppure selezionare apri dal menù a tendina che si visualizza premendo il tasto destro sull’icona del programma. Il programma si presenta con un’interfaccia grafica senza nome chiamata sketch che significa progetto come evidenziato dalla figura che segue.

 

Struttura del programma

La struttura base del linguaggio di programmazione di Arduino si sviluppa sulla definizione di due funzioni:

void setup()

void loop()

La funzione setup( ) è la prima ad essere chiamata quando viene eseguito uno sketch. Viene utilizzata per inizializzare le variabili, per impostare lo stato dei pin, per l’impostazione delle comunicazioni seriali. La funzione di setup() sarà la prima ad essere eseguita dopo ogni accensione o reset di Arduino.

Sintassi void setup( ){ // istruzioni varie; }

Esempio

int pulsante=3;

void setup( )

{ Serial.begin(9600);

pinMode(pulsante,OUTPUT); }

In questo esempio si impostata la velocità di comunicazione seriale con il computer a 9600 bit per secondo (baud) che serve per poter visualizzare sul PC tramite il Serial Monitor (funzionante solo quando Arduino è collegato al computer) l’esito delle operazioni, il pin 3 impostato come OUTPUT.

 Dopo la creazione della funzione setup(), che inizializza e imposta i valori iniziali, la funzione loop() permette l’esecuzione del programma, interagendo con la scheda Arduino.

Sintassi void loop( ){ // istruzioni da ripetere in modo ricorsivo; }

Esempio

void loop( )

{ digitalWrite(3, HIGH); // metti il pin 3 allo stato alto

delay(1000); // mantieni questo stato per 1 secondo

digitalWrite(3, LOW); // metti il pin 3 allo stato basso

delay(1000); // mantieni questo stato per un secondo }

SINTASSI del  PUNTO E VIRGOLA

Il punto e virgola ( ; ) deve essere inserito alla fine di un’istruzione per separare gli elementi del programma. Il ( ; )  è anche utilizzato per separare gli elementi di un ciclo for. Omettere ( ; )  al termine di un’istruzione darà errore di compilazione. L’errore nella digitazione del testo è normale mentre correggerlo spesso è complicato. Quando si rileva un errore nella compilazione per prima cosa conviene verificare se c’è stata l’omissione del ( ; )

Nella pagina dello sketch, in basso e con caratteri di color rosso su sfondo nero, vengono evidenziati  le omissioni e l’errore segnalato dal compilatore.

SINTASSI  le PARENTESI GRAFFE{ }

Un blocco di istruzioni o un gruppo di istruzioni deve essere racchiuso entro parentesi graffe { }. La differenza tra blocco di istruzioni e gruppo di istruzioni è che il blocco crea un ambito locale per le istruzioni che contiene, nel blocco si posso dichiarare ed impiegare variabili locali che esistono solo al suo interno. Ogni istruzione interna al blocco stesso viene, a meno di istruzioni di salto, eseguita in sequenza. Le parentesi graffe { } quindi definiscono l’inizio e la fine di un blocco di istruzioni o di una funzione. Normalmente nella tastiera non troviamo la parentesi graffa, per inserirla nel programma dobbiamo digitare:

ALT 123        {  apertura

ALT 125        }  chiusura                           

SINTASSI  I COMMENTI  

I commenti rappresentano del testo che viene ignorato dal compilatore e vengono utilizzati per descrivere il codice o come aiuto al programmatore.

Blocco di commenti /* …. */

Un blocco di commenti inizia con il simbolo /* e termina con il simbolo */ Tra questi simboli possiamo inserire qualunque codice senza che in fase di compilazione venga occupata memoria. I commenti vengono ignorati dal compilatore.

Linea di commento //

Quando si vuole commentare solo la fine della linea si utilizzano le doppie //  

// linea di commento Le linee singole di commento vengono spesso usate dopo un’istruzione per fornire più informazioni al programmatore.

                   
SINTASSI LE CONSTANTI

Le costanti sono variabili predefinite nel linguaggio per Arduino e vengono utilizzate per rendere il programma più semplice da leggere. Le costanti possono essere:

Costanti booleane

Le costanti booleane definiscono i livelli logici di vero ( true ) e falso ( false ). false è rappresenta lo zero (0) ; true invece rappresenta una condizione di non-zero (non solo di “uno”, ma valori diversi da 0).

Importante: true e false sono scritte in minuscolo.

Costanti INPUT ed OUTPUT

Queste costanti definiscono il tipo (comportamento) da associare ai pin.

INPUT configurando un pin come INPUT con pinMode(), il pin viene utilizzato per leggere un sensore, per la precisione il suo valore di tensione.

OUTPUT configurando un pin come OUTPUT il pin viene utilizzato per pilotare un sensore utilizzando la sua tensione. In questa modalità il pin fornisce una piccola quantità di corrente. I pin configurati come output possono essere danneggiati se cortocircuitati verso massa o verso la linea di alimentazione a 5V.

Valori HIGH e LOW

Per definire il livello di un pin usiamo: HIGH e LOW

HIGH assume diversi significati a seconda del modo del pin. – Quando un pin è settato in modalità INPUT tramite pinMode e viene letto con il comando digitalRead un valore superiore a 3V restituirà il valore HIGH. – Quando un pin è impostato come OUTPUT con il comando pinMode e viene settato al valore HIGH con digitalWrite, al pin verrà applicata una tensione di 5V. In questo modo diventa una sorgente di corrente verso il carico.

LOW – Quando un pin è impostato come INPUT tramite pinMode() e viene letto con il comando digitalRead viene restituito questo valore se la tensione è inferiore ai 2V. – Quando un pin come OUTPUT con il comando pinMode() viene settato al valore LOW con digitalWrite, al pin verrà applicata una tensione di 0V. In questa modalità il pin assorbe corrente

 

SINTASSI LE VARIABILI
Dichiarazione di una variabile

Le variabili permettono di assegnare un nome e memorizzare un valore alfanumerico da utilizzare per gli scopi del programma. Le variabili assumono valori che possono cambiare a differenza delle costanti che invece non possono mai cambiare. Conviene scegliere il nome della variabile in modo descrittivo in modo da rendere il codice più semplice da ricostruire. Tutte le variabili devono essere dichiarate prima del loro utilizzo. Dichiarare una variabile significa definire il tipo 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 se necessita mediante operazioni aritmetiche o altri tipi (ad esempio l’assegnamento).

Esempio: il seguente codice dichiara una variabile inputVar e le assegna il valore analogico letto dal pin 2.

int inputVar=0; //inizializza la variabile di nome inputVar

inputVar=analogRead(2);

/* assegna alla variabile su inizializzata il valore  letto dal pin analogico 2 variandone il contenuto /*

inputVar è sempre la stessa variabile.

La variabile si può assegnare, riassegnare, inoltre si può testarne il valore e utilizzarlo direttamente.

Esempio

if(inputVar<199) // testa se il valore è minore di 100

inputVar=20; // se la condizione è vera assegna un verto valore alla variabile  }

delay(inputVar); // usa la variabile direttamente come argomento del comando delay

Una variabile può essere dichiarata e inizializzata localmente all’interno di una funzione, e definita anche in un blocco di istruzioni come in un ciclo in questo caso la variabile si chiama “variabile locale”.

 

SINTASSI LE FUNZIONI

Una funzione è un blocco di codice eseguito nel momento che viene chiamata.

 

Dichiarazione di funzione

La funzione è dichiarata tramite la specificazione del suo tipo. Il valore restituito (return) dalla funzione è dello stesso tipo. Se non deve essere restituito alcun valore la funzione sarà del tipo “void”. Dopo la dichiarazione del tipo si dichiara il nome e si fa seguire le parentesi tonde entro cui vanno inseriti i parametri che possono essere passati alla funzione.

Sintassi

tipo nomeFunzione (parametro1, parametro2, … , parametro n)

istruzioni da eseguire;  }

Esempio di una funzione che effettua la somma tra due numeri interi num1 e num2

int x=somma(4,6); // esempio di chiamata di una funzione denominata somma

int somma(int num1, int num2){  int numeroSomma=num1+num2;

return numeroSomma;  }

dove:

int specifica il tipo di funzione;

somma è il nome della funzione

num1 e num2 sono i parametri che vengono passati alla funzione stessa

numeroSomma è il valore di tipo int che la funzione restituisce in caso di chiamata.

La presenza dei parametri non è obbligatoria: la chiamata ad una funzione si può fare anche senza parametri.

Funzioni  I/O digitali

pinMode(…); digitalWrite(…); analogWrite(…);

 

-pinMode(pin,mode);

Utilizzato in void setup(), serve per configurare un determinato pin e stabilire se deve essere un ingresso o un’uscita.

pin numero del pin di cui si vuole impostare la modalità ingresso o uscita

mode sempre INPUT o OUTPUT

Esempio int ledPin=10; //led connesso al pin digitale 10

void setup( )

pinMode(ledPin,OUTPUT); //imposta il pin digitale come uscita (output)  }

-digitalWrite()

Scrive il valore HIGH o LOW su un pin impostato come digitale. Se il pin è stato impostato come OUTPUT, la sua tensione sarà impostata al valore di 5V per HIGH e 0V per LOW. Se il pin è impostato come INPUT, scrivendo il valore HIGH con digitalWrite() si abiliterà un resistore interno di PullUp da 20K.

digitalWrite(pin,valore)

pin è il pin di cui si vuole impostare il valore valore HIGH o LOW

Esempio

int ledPin=13; // led connesso al pin digitale 13

void setup( )

pinMode(ledPin, OUTPUT); // imposta il pin digitale come output  }

void loop( )

digitalWrite(ledPin, HIGH); // accende il LED

delay(1000); // aspetta per 1 secondo

digitalWrite(ledPin, LOW); // spegni il LED

delay(1000); // attendi 1 secondo  }

-digitalRead()

Legge lo stato di un pin di input e restituisce un valore HIGH se al pin è applicato un tensione o un valore LOW o se non è applicato nessun segnale. Il pin può essere specificato come una variabile o costante.

 

digitalRead(pin);

pin è il pin di cui si vuole leggere il valore alto o basso.

Esempio

int ledPin = 13; // LED connesso al pin digitale13

int inPin = 7; // pulsante connesso al pin digitale7

int val = 0; // variabile che memorizza il valore letto

void setup( )

pinMode(ledPin, OUTPUT); // imposta il pin digitale 13 come uscita

pinMode(inPin, INPUT); // imposta il pin digitale 7 come ingresso  }

void loop( )

{   val = digitalRead(inPin); // legge il pin di ingresso e lo memorizza in val

 digitalWrite(ledPin, val); // imposta il LED a seconda dell’azione svolta

// sul pulsante  }

 

Funzioni  I/O analogiche

analogRead()

Legge il valore da un pin di tipo analogico. La scheda Arduino contieni 6 canali ( 8 nel mini e Nano, 16 sul Mega) collegati ad un convertitore analogico digitale a 10 bit. Questo significa che i 5 V vanno dal valore 0 al valore 1023. La risoluzione sarà di 5V/1023 cioè 4.9mV per unità.

 

analogRead(pin);

pin: numero del pin analogico da leggere che va da 0 a 5. Restituisce un intero da 0 a 1023.

Esempio

int analogPin = 3; /*Cursore del potenziometro ( terminale centrale) connesso al pin 3 analogico ; gli altri due morsetti rispettivamente a massa e a +5V /*

int val = 0; // variabile che memorizza il valore letto

void setup( )

{   Serial.begin(9600); // setup serial  }

void loop( )

{   val = analogRead(analogPin); // legge il valore del pin di ingresso

 Serial.println(val); // visualizza il valore  }

analogWrite( )

Scrive il valore analogico (PWM – Pulse Width Modulation) su un pin. Può essere utilizzato per far illuminare un led variandone l’intensità luminosa oppure per comandare un motore e variarne la velocità. La frequenza del segnale PWM è all’incirca 490Hz.  

analogWrite(pin,valore);

Esempio

Setta l’uscita sul LED proporzionalmente al valore letto da un potenziometro.

int ledPin = 9; // LED connesso al pin digitale 9

int analogPin = 3; // potenziometro connesso al pin analogico 3

int val = 0; // variabile per memorizzare il valore letto

void setup( )

{   pinMode(ledPin, OUTPUT); // imposta il pin come uscita  }

void loop( )

{   val = analogRead(analogPin); // legge il pin di input con valori da 0 a 1023

 analogWrite(ledPin, val / 4); // i valori di analogWrite vanno da 0 a 255  }

 

SINTASSI TIME

­– Millis ()

Restituisce il numero di millisecondi da quando la scheda Arduino ha iniziato l’esecuzione del  programma corrente. Il tipo di dato è un unsigned long.

Esempio

unsigned long tempo ;

void setup( ){  Serial.begin(9600); }

void loop( ){   Serial.print (“Tempo: “);

tempo = millis( ); //stampa il tempo da quando il programma funziona

Serial.println(tempo) ;

delay(1000); // attesa di 1 secondo in modo da non inviare una gran quantità di dati da visualizzare su PC

-Micros( )

Restituisce il numero di microsecondi da quando Arduino ha iniziato a far funzionare il programma corrente.  Mette in pausa il programma per la quantità specificata di microsecondi.

Esempio

unsigned long tempo_micro;

void setup( ){   Serial.begin(9600); }

void loop( ){   Serial.print(“Tempo: “);

tempo_micro = micros( );

Serial.println(time); // stampa tempo_micro da quando il programma è  iniziato

delay(1000); // attesa di 1 secondo in modo da non inviare una gran  quantità di dati

-Delay( )

Mette in pausa un programma per la quantità di tempo specificato in millisecondi. Il valore 1000  è pari a 1 secondo. delay( ms ) ms è il numero di millisecondi di pausa di tipo unsigned long.

Esempio

int ledPin = 13; // LED connesso al pin digitale 13 già presente su Arduino

void setup( ) {  pinMode(ledPin, OUTPUT); // imposta il pin digitale come output  }

void loop( )

{   digitalWrite(ledPin, HIGH); // imposta allo stato alto il pin digitale led acceso             

delay(1000); // aspetta 1 secondo

digitalWrite(ledPin, LOW); // spegni LED

delay(1000); // attendi 1 secondo }

-DelayMicroseconds()

Mette in pausa il programma per la quantità specificata di microsecondi.

delayMicroseconds(us)

Esempio

int outPin = 8 ; // pin digitale 8 di uscita

void setup( )

{  pinMode(outPin, OUTPUT); // imposta il pin di uscita }

void loop( )

{  digitalWrite(outPin, HIGH); // imposta il pin allo stato alto            

delayMicroseconds(50); // metti in pausa per 50 microsecondi             

digitalWrite(outPin, LOW); // imposta il pin allo stato basso            

delayMicroseconds(50); // metti in pausa per 50 microsecondi  }
SINTASSI ISTRUZIONI CONDIZIONALI
Istruzione if

L’istruzione if permette di eseguire blocchi di codice diversi in base al risultato di una condizione. La struttura è 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.

 

Esempio di if seguito da un blocco di istruzioni

if(x>120)

{  digitalWrite(LED1,HIGH); // accendi LED1

digitalWrite(LED2,LOW); // spegni LED2

delay(2000); // mantieni queste condizioni per 2 secondi

digitalWrite(LED1,LOW); // spegni LED1

digitalWrite(LED2,HIGH); // accendi LED2

delay(2000); // mantieni queste condizioni per 2 secondi }

Condizione if/else

La parola else (facoltativa) introduce il blocco di istruzioni (o la singola istruzione) che deve essere eseguito nel caso in cui la condizione introdotta da if risulti falsa.

Esempio

if(pin5<500)

{   digitalWrite(LED1,HIGH); //accendi LED1

digitalWrite(LED2,HIGH); //accendi LED2 }

else

{   digitalWrite(LED1,LOW); //spegni LED1

digitalWrite(LED2,LOW); //spegni LED2 }

Ciclo while

Il ciclo while esegue ripetutamente un’istruzione o un blocco finchè la condizione è vera.

 

Sintassi while(condizione) { corpo di istruzioni; }

La condizione è un’espressione booleana: se il suo valore è true (vero), le istruzione specifiche nel corpo vengono eseguite e la condizione è nuovamente valutata; si continua così finché la condizione diventa falsa. Il corpo del ciclo può essere un blocco di istruzioni ma può anche essere una sola istruzione.

Esempio

var=0;

while(var<200)

{ avanti( ); //chiama un metodo che fa andare avanti due motori var++; }

Istruzione for / ciclo for

Il ciclo for ripete un’istruzione o un blocco di istruzioni per un numero prefissato di volte. Il ciclo for viene utilizzato per ripetere un blocco di istruzioni per un numero prefissato di volte e utilizza un contatore terminare il ciclo.

Sintassi for (inizializzazione ; condizione ; incremento){   istruzioni; }
Esempio

for(int i=0; i<10;i++)

{  int pin = i ;

digitalWrite(pin,HIGH);     // mette i pin che vanno da 0 a 9 a livello alto dopo una pausa di 500ms             delay(500); }

 

Farucci Luigi

IV A M.A.T.

Anno 2017

(202)

TOP