Arduino è una piattaforma per lo sviluppo di progetti basati su microcontrollore, principalmente per applicazioni embedded destinate al controllo a alla automazione.
Nato in Italia nel 2005 con l'intento di fornire una ambiente agile e soprattutto economico per scopi didattici, ha avuto negli anni una diffusione mondiale. Arduino è una piattaforma open source, l'hardware e il software sono disponibili e liberamente utilizzabili, solo il marchio è riservato e registrato. Questo significa che chiunque può realizzare un progetto con hardware copiato dal Arduino, ma non ne può usare liberamente il nome.
Il successo di Arduino, però, è dovuto anche alla ampia diffusione di documentazione e librerie.
Ma il successo "da alla testa" e ha portato i creatori di Arduino a dispute legali verso uno di loro cha ha pensato bene di impossessarsi del marchio, almeno in Italia. Da qui, per motivi commerciali, un nuovo marchio Genuino, per produrre schede del tutto identiche ad Arduino.
L'hardware di base è relativamente semplice e rende disponibile le risorse del processore (che varia in base alla piattaforma). In numerosi casi l' hardware di della scheda Arduino non è adeguato ad interfacciare il mondo esterno. per dare fronte a questi problemi si può ricorrere a numerose schede (dette shield) progettate per essere inserite facilmente e direttamente sulle schede Arduino. Naturalmente nulla vieta di progettare e produrre proprie shield
Arduino è disponibile in varie versioni con vari processori e potenzialità. Arduino Uno è una delle versioni più semplici ed economiche.
Informazioni dettagliate abbondano in rete, ed è inutile divulgarsi in merito. Lo scopo di questo documento è quello di illustrare i primissimi passi per realizzare semplici progetti.
Come qualunque altro sistema a processore, anche Arduino deve sottostare ad un programma. Serve quindi un linguaggio di programmazione, un compilatore, librerie ed un modo per 'scaricare' il programma a bordo del processore.
Viene in aiuto l'ambiente di sviluppo che integra, in una unica interfaccia, le varie funzionalità. L'ambiente di sviluppo, denominato IDE (Integrated Development Environment), raggruppa le principali risorse software, la configurazione per la piattaforma utilizzata, l'editor, il compilatore, il linker e le librerie.
L'editor facilita la scrittura del codice ed è in grado di rilevare e segnalare i principali errori di scrittura del codice. Il linguaggio è il C/C++ con il supporto una libreria (Wiring) necessarie per accedere alle risorse di I/O e alle periferiche.
Il programma viene chiamato sketch (dobbiamo abituarci alla mania di utilizzare questi termini, che sembrano inventati ad hoc per rendere la vita difficile).
L'IDE, sviluppato in Java, si scarica in rete ed è disponibile per Windows, Mac OS X e Linux.
Basta scaricarlo e installarlo, appena avviato si apre con una finestra di editor, pronto per la scrittura di un programma (o meglio sketch).
Naturalmente occorre aver installato java (www.java.com).
Il programma presenta tre sezioni fondamentali:
Con l'IDE di Arduino le due sezioni sono due funzioni void setup () e void loop().
Ben lontano dal volere entrare nella programmazione in C, sottolineo solo che una funzione altro non è che un insieme di istruzioni che elaborano dei dati ed eventualmente rendono il dato elaborato. Il codice della funzione è distribuito su più righe (in C) e racchiuso fra parentesi quadre.
void setup() definisce la funzione setup(), all'interno della quale va inizializzato il sistema. La dichiarazione void (mancante, vuoto) indica che la funzione eseguirà azioni ma non renderà nulla.
void loop() è il programma principale: qui va scritto quello che si vuol fare eseguire ad Arduino.
Il programma più semplice che si può immaginare è fare lampeggiare il led a bordo di Arduino Uno.
/* questo è il più semplice programma che si può immaginare:
* accendere e spegnere il led a bordo di Arduino.
*/
// il led è sulla porta numero 13
const byte ledPin = 13;
void setup() {
// put your setup code here, to run once:
// definisco la porta 13 come porta di OUTPUT
pinMode(ledPin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(ledPin, HIGH); // accendo il LED
delay (1000); // attendo 1 secondo (1000 millisecondi)
digitalWrite(ledPin, LOW); // spegno il LED
delay (1000); // attend0 1 secondo
}
// è il commento si una riga.
L'istruzione, su una riga, deve terminare con ;
Un blocco di programma è racchiuso fra parentesi graffe { .... }
Per scrivere ed eseguire il programma si avvia l'IDE.
Come prima cosa è bene selezionare la piattaforma in uso: dal menu di IDE Strumenti -> scheda Arduino/Genuino UNO
Si scrive il programma. Per un neofilo la situazione migliore è iniziare con semplici programmi copiati de esempi, che sono numerosi in rete e su libri per principianti e non.
Nell'esempio, viene definita la costante ledPin, che occuperà un byte )const byte ledPin = 13;.
In C le librerie devono essere definite o presenti in una libreria. Alcune funzioni, come PinMode(), digitalWrite() e delay(), che sono definite all'interno dell'IDE e quindi immediatamente utilizzabili. digitalWrite, ad esempio, richiede due parametri: il numero della porta e lo stato della porta.
Così come per alcune funzioni, IDE definisce anche costanti come HIGH e LOW (hanno valore di 1 e 0). Utilizzando il menu di aiuto dell'IDE è facile avere un approfondimento. In molte occasioni l'help di IDE rimanda alla rete. Es. https://www.arduino.cc/en/Reference/HomePage
Per preparare il programma si usa il menu Sketch -> Verifica/Compila.
L'IDE legge il programma, segnala eventuali errori, compila (traduce in linguaggio macchina il C), ingloba le librerie necessarie, aggrega il tutto (link) per il processore selezionato.
La compilazione riporta informazioni utili come ad esempio, lo spazio che il programma occuperà sul processore.
Caricare il programma su Arduino è possibile tramite un programmatore esterno o più semplicemente tramite il bootloader.
Un processore quando viene alimentato, deve trovare in memoria delle istruzioni adeguate. Normalmente il processore, se nuovo, non ha nulla di ciò. Serve quindi uno strumento per caricare in memoria (la memoria flash che mantiene i dati anche a dispositivo spento). Spesso si usa un programmatore, uno strumento esterno in grado di fare operazioni di scrittura del programma sulla flash. Questo metodo non è molto pratico, specie per lo sviluppo hobbistico.
Arduino adotta una soluzione detta di bootloader. Il processore sulla scheda non è completamente senza programmi, ma è preconfigurato con una procedura in grado ci gestire la porta seriale (USB), ricevere dei comandi e scrivere il programma in memoria.
Allo scopo l'IDE, quando viene installato, predispone alcuni driver USB in grado di colloquiare con la porta USB di Arduino.
Per scaricare il programma basta collegare Arduino ad una USB, attendere che questa venga correttamente riconosciuta, configurare in IDE la porta USB/seriale (Strumenti -> Porta)
e cliccare sul manu Sketch -> Carica.
Completato il caricamento, se tutto è stato fatto correttamente, il programma parte automaticamente e, nel caso del semplice esempio presentato, il led lampeggia!!.
Un display LCD è molto utile in tutti i progetti digitali. Comodo per messaggi, ma anche per informazioni di debug, quando non si dispone di un vero e proprio debugger.
L'IDE di Arduino mette a disposizione una libreria per la gestione di display compatibili con lo standard di fatto Hitachi HD44780, che hanno un costo abbordabile e sono molto diffusi.
Il display ha in connettore con 14 o 16 pin. Alcune linee di controllo, Enable (E), Registyer Select (RS), Read/Write (R/!W) e 8 linee dati, anche se abitualmente è pilotato con solo 4 linee dati. A queste linee si aggiungono 3 pin per l'alimentazione, la massa, e il contrasto. Alcuni modelli hanno due pin dedicati ad alimentare un LED per la retro illuminazione.
La libreria mette a disposizione funzioni per la gestione del display. La documentazione è disponibile qui: https://www.arduino.cc/en/Reference/LiquidCrystal
Per includerla nel nostro programma si usa il comando 'C' include: #include <LiquidCrystal.h>
Per inizializzare il display occorre dichiarare quali uscite di Arduino vengono utilizzate per pilotare il display: lo si fa con la funzione LiquidCrystal lcd();
lcd.begin() definisce il numero di colonne e di righe del display (ne esistono di vari modelli).
La funzione lcd.print() riproduce (stampa) una stringa di caratteri sul display.
In questo semplice caso, la funzione di loop() resta vuota, perché l'inizializzazione del display e l'output del messaggio è tutto quello che si desidera fare.
Il programma è un semplice esempio preso da internet e disponibile qui. A dimostrazione della vasta documentazione disponibile in rete.
Ora basta compilare ed inviare il programma ad Arduino. L'alimentazione di tutto il sistema è fornita dalla USB di Arduino.
Naturalmente le funzioni definite dalla libreria sono più numerose di quelle usate in questo esempi e si rimanda alla documentazione citata per un elenco completo.
Lo schema di collegamento è disponibile al link citato e qui, la versione realizzata con kicad.
Questo è il codice:
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
}