Introduzione ad Arduino
Struttura di un programma per Arduino
In Arduino la struttura base di un programma è impostata in questo modo:
//inclusione librerie
#include<Wire.h>//libreria di esempio
// Funzione che verrà chiamata automaticamente all'avvio del programma
void setup(){
}
// Funzione che verrà chiamata ripetutamente una volta terminato il setup
void loop(){
}
Scrittura e lettura di pin digitali
Su tutte le schede Arduino ci sono molti pin digitali, e per prima cosa dobbiamo imparare a riconoscerli.
I pin digitali possono essere identificati da un numero, oppure per rendere la sintassi più chiara con una D davanti. Ad esempio D10 è il pin digitale 10. Nella maggior parte dei casi le porte sono numerate correttamente sulla scheda, ma in alcuni casi non è così. Pertanto quando si inizia ad utilizzare una nuova scheda bisogna accertarsi di come vengono identificati i pin.
Inoltre è possibile utilizzare anche i pin di entrata analogica (ad esempio A0) come un pin digitale (dopo una corretta configurazione con pinMode
).
Funzione pinMode
Una volta identificati i pin è necessario configurarli correttamente con: pinMode(pin, modalità);
.
Il parametro "modalità" accetta i seguenti parametri:
OUTPUT
: Semplice modalità di output(3.3V, massimo 15 mA)INPUT
: Semplice modalità di input (di solito i pin in modalità lettura hanno una resistenza nell'ordine dei 100MOhm)INPUT_PULLUP
: 10kOhm. Se è scollegato segna HIGH
Nel caso di pullup o pulldown particolari sarà necessario realizzarli con un circuito esterno.
Funzione digitalWrite
Se è stata impostata la modalità OUTPUT si può scrivere con la funzione digitalWrite(pin, valore)
. Il valore può essere solo HIGH
(3.3V) o LOW
(0.0V).
Funzione digitalRead
Se è stata impostata la modalità INPUT oppure INPUT_PULLUP si può leggere il valore del pin con la funzione digitalRead(pin)
.
In caso il voltaggio sia vicino a 3.3V ritorna HIGH
, altrimenti LOW
.
Se il pin è scollegato, oppure non è possibile campionare correttamente il valore, la funzione restituirà valori randomici. Per evitare questo comportamento esiste INPUT_PULLUP
, che grazie al pullup interno imposta sempre un valore definito correttamente.
Un esempio
void setup(){
// imposto il pin 13 (ovvero il led sulla scheda) in modalità output
pinMode(D13, OUTPUT);
// imposto il pin 13 a high, accendendo il led.
digitalWrite(D13, HIGH);
}
void loop(){
}
Delay
Spesso un programma deve interfacciarsi con persone e/o sensori che non riescono a funzionare a velocità paragonabili al clock del controllore. Ed ecco che arrivano in nostro soccorso le funzioni delay
e delayMicroseconds
della libreria standard di Arduino. Entrambe prendono come parametro la quantità di tempo da attendere, la prima in millisecondi, e la seconda in microsecondi.
void setup(){
pinMode(D13, OUTPUT);
}
void loop() {
digitalWrite(D13, HIGH); // accende il led
delay(500); // aspetta mezzo secondo
digitalWrite(D13, LOW); // spegne il led
delay(500); // aspetta mezzo secondo
}
In generale questo tipo di funzioni sono precise e non causano problemi "strani" su piccoli delay, però se si vuole eseguire del codice con un periodo preciso non sono l'ideale, in quanto l'esecuzione del codice non è istantanea e quindi andrebbe ad aggiungere man mano del ritardo. Quando possibile il programma andrebbe quindi migrato usando le funzioni millis()
e micros()
.
Seriale
Per far parlare il nostro programma con un computer collegato è necessario scrivere sulla seriale. Tutti i controllori hanno della componentistica dedicata, ed è necessario solo imparare la sintassi base per saperli usare.
Funzione Serial.begin
Serial.begin(baud)
serve per inizializzare la connessione: prima di poter usare la seriale dobbiamo decidere un baudrate con cui inviare i dati.
Entrambi i terminali (computer e scheda) devono usare lo stesso baud, e baud più alti significa comunicazioni più veloci. Se a qualcuno interessano maggiori dettagli li può trovare qui. Il baudrate deve essere un baudrate standard, ecco una lista di quelli più comuni:
- 300
- 600
- 1200
- 2400
- 4800
- 9600
- 14400
- 19200
- 28800
- 31250
- 38400
- 57600
- 115200
Funzione Serial.print e println
Serial.print(parametro)
scrive il parametro in seriale. Serial.println(parametro)
dopo aver scritto un valore va a capo.
Esempio di uso della seriale
void setup() {
// apre la comunicazione seriale con baudrate di 9600
Serial.begin(9600);
// scrive "Setup!" e poi va a capo
Serial.println("Setup!");
}
void loop() {
// millis() restituisce il numero di millisecondi dall'inizio del programma
int millisecondi = millis();
// scrive "...ms" ad ogni iterazione di loop(), dove ... è il valore ottenuto qui sopra
Serial.print(millisecondi);
Serial.println("ms");
// aspetta un secondo prima di ripetere
delay(1000);
}