Arduino Programmazione Wiring
Arduino Programmazione Wiring
if.. else
for
switch case break default
while
dowhile
break
continue
operatori matematici
operatori di comparazione
operatori booleani
operatori computazionali
Librerie e funzioni
conclusioni
Introduzione
Wiring e il linguaggio di programmazione, derivato dal C++, utilizzato per scrivere programmi
installabili sul microcontrollore ATmega328 che equipaggia Arduino uno.
Il microcontrollore legge, attiva e disattiva le porte di Arduino seguendo le istruzioni contenute in
uno sketch, e cioe un programma scritto in wiring e compilato (e cioe tradotto in linguaggio
macchina) attraverso lIDE, un ambiente di sviluppo gratuito operante su pc.
LIDE e quindi indispensabile per operare su Arduino ed e liberamente scaricabile da qui:
https://www.arduino.cc/en/main/software
LIDE consente di utilizzare il PC per scrivere il programma, compilarlo e trasferirlo, tramite una
connessione USB, su Arduino.
LIDE presenta una finestra riservata alla scrittura del programma, alcune icone per le funzioni di
verifica, compilazione, carico e salvataggio dei programmi ed una serie di menu a tendina
abbastanza intuitivi. Nella sezione aiuto e anche presente unesaustiva spiegazione di ogni
singolo elemento di programmazione (variabili, funzioni, istruzioni e relativa sintassi).
Sotto laspetto pratico, una volta scaricata, installata ed
aperta lIDE, bisogna specializzarla (una sola volta, al
primo utilizzo), selezionando strumenti e poi scheda
arduino. e quindi, dal menu che si apre, il tipo di
scheda Arduino di cui si dispone (Arduino uno, Arduino
mega, Arduino due, ecc.).
Ora, per compilare, caricare e lanciare un programma
si deve:
Collegare Arduino al pc mediante il cavo usb in
dotazione. Appena inserito il cavo alcune spie di
Arduino si illumineranno, a conferma
dellavvenuto collegamento.
Copiare (o digitare) il programma nella zona di
editing dellIDE, parzialmente gia occupata da
La testata dellIDE
alcune istruzioni predefinite (che dovranno
essere cancellate e sostituite dal programma copiato).
Premere il pulsante di compilazione (la freccia rivolta a destra, piazzata nella riga dei
comandi, in alto a sinistra)
Attendere il completamento della compilazione, rilevabile dalle scritte bianche che
compaiono nella parte bassa dellIDE e dal pulsare, per pochi attimi, dei led di Arduino.
Il programma, una volta compilato viene automaticamente caricato sulla scheda ed a questo punto
Arduino inizia immediatamente a lavorare e a compiere le azioni per le quali e stato programmato.
Come primo programma da far girare e consigliabile ricorrere al buon giorno reperibile qui. Il
programma, molto semplice e facilmente interpretabile, non richiede alcun particolare componente
(solo Arduino, il cavo usb ed il pc) e non solo consente di rendersi conto di cose e di come
funziona la compilazione, ma anche di impratichirsi nelluso del monitor seriale, residente sullIDE.
Se durante la compilazione appaiono delle segnalazioni di colore rosso/arancione nella zona
bassa dellIDE, significa che qualcosa non e andata bene per cui bisogna interpretare le
segnalazioni e provvedere alle necessarie azioni correttive.
le funzioni che il programma deve svolgere (es: acquisizione di dati dai sensori, decisioni
da prendere, algoritmi di calcolo, modalita di attivazione degli attuatori)
cosa deve fare ogni singola funzione (che dati servono, che problematiche deve gestire e
cosa deve produrre)
la sequenza nella quale devono essere attivate le singole funzioni
/*------------------------------------------------ programma di esempio ----------------------------------------------Questo programma verifica tramite il modulo HC-SR04 la distanza di un ostacolo. Il modulo, lancia
un fascio di ultrasuoni e si mette in attesa di ricevere un segnale di ritorno. Il tempo intercorso tra
il momento del lancio ed il momento del ritorno determina la distanza dellostacolo che, convertita
in centimetri, viene poi evidenziata sul monitor seriale (residente su PC). Lo schema vede il
trigger del modulo collegato alla porta 2 di Arduino, l'echo alla porta 3, il negativo alla terra ed il
positivo allalimentazione da 5 volt. */
float cm = 0;
void loop()
{
misurazionedistanza ();
comunicazionedistanza ();
delay (2000);
}
Lultima considerazione riguarda le parentesi graffe. Sono essenziali e segnano linizio e la fine del
setup, del loop, delle routine e delle parti di codice subordinate ad una condizione. Non solo sono
indispensabili, ma contribuiscono in maniera determinate a rendere un programma piu facilmente
comprensibile.
In ogni caso, al di la dellinterpretazione di ogni singola istruzione che con le cognizioni attuali puo
risultare difficile, e possibile, semplicemente leggendo le note, i titoli delle varie parti ed
osservando le parentesi graffe, rendersi conto di come il programma sia stato diviso in parti e di
quali funzioni siano svolte da ogni parte.
Struttura di un programma
Un programma wiring e normalmente composto da tre parti separate da due dichiarazioni
( void setup() e void loop() ). La struttura standard di un programma e questa:
/* prima parte, per la dichiarazione delle librerie, delle variabili, delle costanti e per la codifica delle
routine e cioe parti di codice che vengono eseguite solo quando sono richiamate da una specifica
istruzione*/
/* -----( note esplicative sulle finalita e sul funzionamento del programma ) -----*/
/*-----( dichiarazione delle eventuali librerie utilizzate dal programma )-----*/
/*-----( dichiarazione degli oggetti utilizzati, ad esempio display a cristalli liquidi o servomotori )---*/
/*-----( dichiarazione delle costanti )-----*/
/*-----( dichiarazione delle variabili )-----*/
/*-----( codifica di eventuali routine )-----*/
void setup() /* seconda parte o parte di setup, eseguita solo allavvio del programma*/
{ /* ----( inizio del setup )------*/
/* ----( dichiarazione delle porte di input e di output )----*/
/* ----( eventuali istruzioni da eseguire allavvio del programma )----*/
}/* ----( fine del setup )---*/
void loop() /*terza parte o parte di loop, parte principale del programma, che viene eseguita e
ripetuta fino al termine dellalimentazione o fino alla pressione del pulsante reset*/
{ /* ----( inizio del loop )----*/
/* ----( istruzioni di programma )-----*/
} / *----( fine del loop )----*/
Alcuni programmatori inseriscono le routine anche al termine della sezione di loop o tra la sezione
di setup e quella di loop. Questa pratica e consentita, ma tende a rendere piu difficile e dispersiva
linterpretazione del programma.
Ad ogni parentesi aperta deve corrispondere una parentesi chiusa. Lassenza di una
parentesi di chiusura o di apertura qualche volta impedisce la compilazione (e quindi
lesecuzione) del programma ed in ogni caso ne rende imprevedibile i funzionamento;
La combinazione di caratteri /* indica linizio di una zona di note, che puo estendersi su
piu righe e che deve necessariamente essere chiusa dalla combinazione */
La combinazione // indica linizio di una zona di note che si protrae fino alla fine della riga;
Le indentazioni, non obbligatorie, sono comunque utili per rendere piu facilmente
comprensibile un programma. Nella sezione strumenti dellIDE esiste la funzione
formattazione automatica, utile appunto per ottenere lindentazione automatica del codice;
Le variabili e le costanti devono essere dichiarate prima (in termini di posizione fisica nel
programma) del loro utilizzo. Per questo motivo e buona norma concentrare la loro
definizione in testa al programma, prima del setup e delle eventuali routine.
Le parole chiave
Il compilatore riconosce alcune parole chiave alle quali assegna particolari significati:
HIGH e LOW sono parole chiave utilizzate nella gestione delle porte di Arduino e nella
gestione digitale di una varibile. LOW implica che alla variabile (o alla porta) sia associato
il valore 0 mentre HIGH implica che sia associato il valore 1.
INPUT e OUTPUT sono parole chiave utilizzate per definire se una specifica porta deve
essere considerata di entrata (una porta alla quale e collegato un sensore) o di uscita (una
porta alla quale e collegato un attuatore).
TRUE e FALSE sono parole chiave utilizzate per verificare lesito di una condizione.
Le istruzioni
Nella scrittura di un programma sono normalmente utilizzate:
funzioni di input/output
funzioni di comunicazione
funzioni di tempo
funzioni matematiche
Le variabili
Sono aree di memoria ove vengono memorizzati i dati necessari al funzionamento del programma.
Il programmatore assegna ad ogni variabile un nome ed un codice, che ne definisce la tipologia.
Come gia detto, in un programma le variabili devono essere definite prima delle istruzioni che le
utilizzano ed e pertanto opportuno definirle tutte nella zona iniziale, prima del void setup () e
prima delle routine.
Nota (un po ostica, da rileggere magari quando si conosce un po meglio il linguaggio di programmazione): le variabili
definite allinterno di una sezione (allinterno del setup, oppure allinterno del ciclo di loop oppure ancora allinterno di un
ciclo di for) mantengono il loro significato solo allinterno di detti cicli. A di fuori di questi cicli possono essere
nuovamente definite ed assumere nuovi e differenti significati.
Questa particolarita e utile quando si usa assemblare un programma copiando parti di codice e funzioni estratte da
altri programmi. In questo caso ogni funzione e corredata dalle variabili da lei utilizzate e puo quindi essere facilmente
inserita in un qualunque programma.
Non e pero particolarmente utile se si scrive un programma partendo dallinizio e, soprattutto nei programmi complessi,
e foriera di errori e confusione.
In linea di massima e come e stato detto, e opportuno dichiarare le variabili sempre allinizio del programma ed
utilizzarle ovunque, ma solo per lo scopo per le quali sono state dichiarate.
Se si dichiara che una variabile e, ad esempio utilizzata come indice di scorrimento di una tabella, e opportuno, ai fini
della comprensibilita del programma, utilizzarla esclusivamente in quella veste e non, ad esempio, come deposito
temporaneo di informazioni in routine che nulla hanno a che vedere con la suddetta tabella.
byte occupa un byte di memoria e puo contenere un numero tra 0 e 255 non segnato.
int usa 2 byte di memoria e puo contenere un numero compreso tra -32768 e 32767.
unsigned int Ha la stessa funzione di int, ma puo contenere solo numeri positivi tra 0 e 65535.
long usa 4 byte e puo contenere un numero compreso tra -2.147.483.648 a 2.147.483.647.
unsigned long Versione senza segno di long e puo contenere un numero che va da 0 a
4.294.967.295.
char occupa un byte di memoria. Se la si usa come un numero puo contenere un valore che va
da -128 a +127 se invece la si usa come testo puo contenere un qualunque carattere ASCII. Se si
aggiungono due parentesi quadre char[] diventa una variabile di tipo string nella quale e
possibile memorizzare un testo. Utilizza un byte per ogni carattere di testo pi un carattere NULL
che indica la fine del testo.
Esempio:
char saluto[] = "ciao"; // la variabile di tipo string denominata saluto contiene la parola ciao
// ed occupa 4 caratteri di testo + il carattere NULL e quindi 5 caratteri
Allinterno delle parentesi quadre di una variabile di tipo char[] puo essere inserito un numero per
definire in maniera preventiva la lunghezza della variabile. Questa opzione risulta utile quando si
vuole definire una variabile inizialmente vuota.
Esempio:
char area [10];
array Non si tratta di un tipologia di variabile, ma del nome utilizzato per indicare una tabella, e
cioe un elenco di variabili accessibili tramite un indice.
Un array e una variabile di tipo int o char seguita da una parentesi quadra aperta, un valore
numerico (il numero di elementi) ed una parentesi quadra chiusa. Si utilizza la parola chiave int
quando si vuole definire una tabella che conterra dei numeri interi di valore compreso tra -32768 e
32767, mentre si utilizza la parola chiave char se si vuole definire una tabella che conterra dei
caratteri.
E anche possibile definire preventivamente i valori di ogni elemento della tabella, facendo seguire
alle parole chiave int o char le parentesi quadre con il numero di elementi, il segno di uguale ed i
valori, separati da una virgola e racchiusi tra parentesi graffe.
Se, ad esempio vogliamo memorizzare quattro valori possiamo creare una array del tipo:
int tab1[4]={10,25,50,100};
// larray (la tabella) denominato tab1 e lungo 5 byte (4 numeri
// + il null finale) e contiene valori accessibili tramite un indice.
// in questo esempio lindice puo assumere un valore che va
// da 0 a 3; Con zero si accede al primo valore (10) mentre con 3
// si accede al quarto valore (100) .
Per accedere ai valori presenti in tabella e sufficiente utilizzare il nome della variabile associato
allindice. Esempio:
int val;
// definisce una variabile denominata val che conterra un numero intero
val = tab1 [2]; // inserisce in val il valore contenuto nel terzo elemento della tabella del
// precedente esempio, e quindi 50
// (ricordarsi che con lindice pari a zero si accede al primo elemento, con lindice
// pari ad 1 si accede al secondo elemento e con lindice pari a 2 si accede al
// terzo elemento.)
#define nome valore non e la definzione di una variabile, ma solo la definizione di un valore,
che sara poi utilizzato dal compilatore in sostituzione della parola nome
Esempio:
#define pinled 5 // in fase di compilazione il compilatore inserira il valore 5 ad ogni occorrenza
//
della parola pinled
Le istruzioni di struttura
Sono due istruzioni o meglio due dichiarazioni, che delimitano le parti che compongono un
programma.
setup () che associata alla definizione void indica linizio della zona di inizializzazione del
programma
loop () che associata alla definizione void indica linizio della zona dedicata al corpo del
programma
Tra le istruzioni di struttura dovrebbe anche essere annoverata la definizione void che, pur
essendo classificata come una tipologia di dati, contrassegna di fatto linizio di una routine.
In questultimo caso la sua struttura e:
}
Per chiamare (o meglio lanciare) una routine e sufficiente scriverne il nome seguito da una
parentesi aperta ed una chiusa. Esempio:
nome_della_routine ()
Nota: al momento del lancio, allinterno delle parentesi puo essere inserito il nome di una variabile che la routine utilizza
o modifica. Questopzione non sembra particolarmente utile in un programma che non nasce dallassemblaggio di
routine e funzioni estratte da altri programmi e pertanto viene di fatto ignorata in queste note.
Le istruzioni di controllo
Sono istruzioni che, al verificarsi di una condizione, lanciano lesecuzione di specifiche parti di
programma.
if.. else
Permette di prendere delle decisioni. Listruzione if deve essere seguita da una condizione
racchiusa parentesi e da una o piu istruzioni racchiuse tra parentesi graffe. Se la condizione
vera verranno eseguite le istruzioni contenute tra parentesi graffe mentre se la condizione e falsa
verranno eseguite le istruzioni (sempre tra parentesi graffe) contenute immediatamente dopo la
parola chiave else. In entrambi i casi verranno poi eseguite le istruzioni successive alla fine delle
istruzioni dipendenti dalla else. E possibile usare listruzione if anche senza la parola chiave
else. In questultimo caso se la condizione e vera verranno eseguite le istruzioni racchiuse tra le
parentesi graffe che seguono la if, se invece e falsa e si passera direttamente alle istruzioni
successive alla parentesi graffa di chiusura.
Struttura:
If (..condizione..)
{ ..codice da eseguire se la condizione e vera..; }
else
{ ..codice da eseguire se la condizione e falsa..; }
. codice che verra eseguito in ogni caso.
Esempio:
if (val==1)
{
digitalWrite(3, HIGH);
}
else
{
digitalWrite (3, LOW);
}
Nota: Come gia precedentemente accennato, la combinazione di segni == e necessaria per differenziare una
condizione da unassegnazione. Piu in dettaglio, lespressione val = 1 viene interpretata dal compilatore come un
assegnazione e quindi inserisci 1 nella variabile val mentre lespressione val == 1, preceduta da unistruzione di
condizione (come ad esempio una if) viene interpretata come una condizione e quindi se val e uguale ad 1
Listruzione if puo essere utilizzata anche senza le parentesi graffe; in questo caso, se la
condizione e vera, viene eseguita listruzione immediatamente successiva alla condizione mentre
se e falsa viene saltata la prima listruzione successiva ed eseguita la seconda successiva.
for
listruzione for ripete una serie di istruzioni fino a quando una condizione risulta vera.
Struttura:
{
case 38: digitalwrite(12, HIGH);break; // nel caso in cui la variabile sensore contenga il
// valore 38, attiva il componente collegato alla porta 12
// (digitalwrite(12, HIGH);) e poi interrompe lesecuzione dellistruzione
// (break;) saltando alle istruzioni successive alla parentesi graffa di
// chiusura
case 55: digitalwrite(13, HIGH);break; // nel caso in cui la variabile sensore contenga il
// valore 55, attiva il componente collegato alla porta 13
// (digitalwrite(13, HIGH);) e poi interrompe lesecuzione (break;) saltando
// alle istruzioni successive alla parentesi graffa di chiusura
default: digitalwrite(12, LOW); digitalwrite(13, LOW); // in ogni altro caso (e cioe se la
// variabile sensore non contiene ne 38 ne 55) disattiva (e cioe pone
// in stato LOW) i componenti collegati alle porte 12 e 13
}
while
Esegue una serie di istruzioni racchiuse tra parentesi graffe e le ripete fino a quando una
condizione vera.
Struttura:
While ( ..condizione.. )
{ .. codice da ripetere sino a quando la condizione risulta vera.. }
Esempio:
while(sensore<500)
{
digitalWrite(13, HIGH); //attiva il componente collegato alla porta 13 ed
delay(100);
// attende 100 millisecondi
digitalWrite(13, LOW); // disattiva il componente collegato alla porta 13 ed
delay(100);
// attende 100 millisecondi
sensore=analogRead(1); // inserisce nella variabile sensore il valore del componete collegato
// alla porta analogica 1 e ritorna allistruzione while
}
La codifica in esempio puo essere utilizzata per lanciare un allarme (facendo lampeggiare un led o
emettendo un suono intermittente tramite un buzzer collegati alla porta 13) se il componente
collegato alla porta analogica 1 (ad esempio un rilevatore di temperatura) restituisce un valore
inferiore a 500. Lallarme cessa (ed il programma continua il suo percorso) solo se il sensore
fornisce un valore pari o superiore a 500
dowhile
E unistruzione identica alla istruzione while, solo che il codice viene eseguito anche prima che la
condizione sia verificata. Si usa quando si vuole eseguire il codice almeno una volta prima che la
condizione sia valutata.
Struttura:
do
{ ..codice da ripetere fino a quando la condizione di while risulta vera.. }
while ( ..condizione.. );
Esempio:
do
{
digitalWrite(13,HIGH); delay(100);
digitalWrite(13,LOW); delay (100);
valoresensore=analogRead(1);
}
while (valoresensore < 500);
Nellesempio viene attivato e disattivato un dispositivo (ad esempio viene fatto lampeggiare un led
o prodotto un suono intermittente) sino a quando il valore fornito da un sensore analogico e
inferiore a 500. La differenza, rispetto al precedente esempio dellistruzione while e che il
lampeggio o il suono inizia prima della verifica del valore fornito dal sensore e quindi, nel nostro
esempio, lallarme lampeggia o suona almeno una volta, indipendentemente dal valore fornito dal
sensore
Break
Questa istruzione consente di bloccare un ciclo di for.., do.. oppure while e continuare ad
eseguire il codice fuori dal ciclo. Viene anche utilizzato nellistruzione switch per interrompere
lanalisi delle condizioni.
Continue
Usato in un ciclo do.., for.. o while consente di interrompere lesecuzione del codice interno al
ciclo e tornare alla verifica della condizione.
Esempio:
for(lum=0; lum<200; lum++)
{
if((lum>120) && (lum<180)) continue;
analogWrite(porta1, lum);
delay(20);
}
Nellesempio si suppone che alla porta di output denominata porta1 sia collegato un led la cui
luminosita varia progressivamente da 0 a 200. La progressione pero si interrompe quando il
valore della luminosita e compreso tra 120 e 180 (lum> 120 && lum< 180). && e la combinazione
utilizzata per rappresentare loperatore booleano and
Operatori matematici
Nella scrittura di un programma possono essere utilizzati i normali operatori matematici:
+ per le addizioni
-
per le sottrazioni
per le divisioni
per le moltiplicazioni
Nota: se il risultato di una divisione viene assegnato ad una variabile di tipo float, il numero di
decimali del risultato e pari al numero di decimali del divisore.
Esempio:
float risultato;
maggiore di
<
minore di
!= diverso da
<= minore o uguale di
>= maggiore o uguale di
Operatori booleani
Sono operatori usati per combinare pi condizioni, ad esempio se vogliamo verificare se il valore di
un sensore compreso tra 1 e 5 basta scrivere:
if(sensore>=1) && (sensore<=5)
{ . codice da eseguire se il valore di sensore e maggiore o uguale a 1 e minore o uguale a 5 .. }
else
{ codice da eseguire se il valore di sensore e minore di 1 oppure maggiore di 5 }
Esistono tre tipi di operatori booleani:
corrisponde al not.
Nota: gli operatori booleani e soprattutto la or ed il not sono delle strane bestie che si prestano ad utilizzazioni
improprie che possono portare a risultati imprevedibili. In linea di massima e sempre opportuno evitare di utilizzare
loperatore or in combinazione con loperatore not poiche il risultato e quasi sempre diverso da quello che utilizzatore
frettoloso o impreparato potrebbe aspettarsi.
Operatori computazionali
sono operatori utilizzati per semplificare alcune operazioni elementari, come ad esempio
incrementare o decrementare una variabile.
Librerie e funzioni
le funzioni sono istruzioni o meglio macroistruzioni mediante le quali e possibile interagire con i
sensori e gli attuatori oppure eseguire alcune attivita (tipicamente calcoli) che restituiscono un
valore.
Oltre a quelle standard, previste dal manuale di programmazione di Arduino, esistono anche molte
altre funzioni gestite da librerie, spesso scritte da utenti, che possono essere utilizzate per
svolgere particolari attivita, soprattutto in presenza di sensori o attuatori di utilizzo complesso
(come ad esempio un motore passo passo o un display lcd).
Per utilizzare una libreria e le funzioni da essa gestite bisogna dichiararla (includerla) nella parte
iniziale del programma (prima del setup e prima delle routine).
Per includere una libreria in un programma bisogna innanzi tutto inserirla (se non gia presente)
nellarchivio delle librerie di arduino e poi richiamarla nel programma attraverso la definizione
#include <nome_della_libreria.h>
da posizionare, come gia detto, in testa al programma.
Per inserire una nuova libreria nellarchivio delle librerie bisogna andare nellIDE, seguire il
percorso Sketch->importa libreria->add library, selezionare la cartella od il file compresso (zippato)
che contiene la libreria e quindi premere il pulsante apri.
Una volta caricata una nuova libreria in archivio e opportuno chiudere e riaprire lIDE per essere
certi che la libreria e le sue nuove funzioni siano visibili al programma.
Come gia detto esistono molte librerie, specifiche per quasi ogni tipo di device (per ogni tipo di
sensore o di attuatore). Dette librerie sono normalmente reperibili on line, e sono rintracciabili
semplicemente ricercando informazioni (datasheet o anche esempi e note di utilizzo) sul device
che si intende utilizzare.
pinMode(porta,utilizzo);
questa istruzione e utilizzata per configurare una delle 14 porte digitali; nella variabile porta deve
essere inserito il numero della porta digitale (da 0 a 13) che si intende definire mentre in utilizzo
deve essere indicato il tipo di utilizzo (INPUT oppure OUTPUT).
Esempio:
pinMode(13,INPUT);
// configura la porta digitale 13 come una porta di INPUT
pinMode(12,OUTPUT); // configura la porta digitale 12 come porta di OUTPUT
/* Nota: Al posto del valore 12 oppure13 puo ovviamente essere utilizzata una variabile
contenente il numero della porta */
digitalWrite(porta,valore);
attiva (HIGH) o disattiva (LOW) una porta digitale di OUTPUT. Lattivazione implica che la porta in
oggetto venga alimentata con una tensione di 5 volt mentre la disattivazione implica che attraverso
la porta non circoli alcuna tensione (in pratica attiva o disattiva lattuatore collegato alla porta)
Esempio:
digitalWrite(7,HIGH);
digitalWrite(led, LOW);
// rileva la tensione fornita dal sensore collegato alla porta 7. Se rileva una
// tensione maggiore di 3 volt inserisce 1 (HIGH) nella variabile val; se
// rileva una tensione inferiore a 1,5 inserisce 0 (LOW) mente se rileva una
// tensione compresa tra 1,5 e 3 volt lascia inalterato il valore di val
variabile = analogRead(porta);
rileva la tensione presente su di una porta analogica e inserisce in variabile un numero (tra 0
e 1023) proporzionale alla tensione rilevata. 0 corrisponde ad una tensione pari a 0 mentre 1023
corrisponde ad una tensione pari a 5 volt.
Esempio:
int val = 0;
.
.
val=analogRead(0);
analogWrite(porta,valore);
Con questa istruzione e possibile utilizzare una porta digitale in maniera PWM e cioe come una
porta analogica di OUTPUT. Listruzione e in grado di fornire in uscita sulla porta in questione una
tensione (tra 0 e 5 volt) proporzionale al numero (compreso tra 0 e 255) inserito nella variabile
valore.
Nota: su Arduino Uno le porte digitali utilizzabili come porte analogiche di OUTPUT sono solo le porte: 11, 10, 9, 6, 5, e
3.
Esempio di utilizzo delle istruzioni di input e di output (programma completo, per la gestione della
della luminosita di un led):
/* Materiale necessario: una resistenza variabile, un led ed una resistenza da 220 ohm. Schema:
collegare il positivo del led alla porta 9 ed il pin centrale di una resistenza variabile alla porta 3;
collegare il negativo del led ad una resistenza da 220 ohm a sua volta collegata a terra; collegare i
pin estremi della resistenza variabile a terra e allalimentazione da 5 volt.
Ruotando la manopola della resistenza variabile, variera lintensita luminosa del led /*
int ledPin
= 9; // definisce una variabile denominata ledPin, il cui valore e 9
int analogPin = 3; // definisce una variabile denominata analogPin, il cui valore e 3
int val
= 0; // definisce una variabile denominata val, il cui valore iniziale e 0
void setup()
{
pinMode(ledPin, OUTPUT); // definisce la porta digitale 9 (il led) come porta di OUTPUT
}
void loop()
{
val = analogRead(analogPin); // Arduino rileva la tensione fornita dalla resistenza variabile
// collegata alla porta analogica 3 (analogPin contiene il valore 3)
// ed inserisce in val un valore proporzionale alla tensione
// rilevata e compreso tra 0 e 1023
analogWrite(ledPin, val / 4);
// invia alla porta ledPin (la porta 9) una tensione che varia da 0
// a 5 volt in funzione del valore contenuto in val/4 (piu
// esattamente una tensione pari a (5/255)*(val/4) volt;
}
Serial.print(valore);
// legge (inserisce in val, una variabile normalmente di tipo chr) cio' che
// e' stato battuto sulla tastiera collegata serialmente ad arduino
Come abbiamo visto dalle istruzioni sopra riportate, la porta seriale opera sia in entrata che in
uscita e quindi attraverso questa porta e possibile non solo esportare dati e messaggi ma anche
ricevere dati utilizzabili dal programma operante su Arduino.
Funzioni di tempo
Wiring include alcune funzioni di gestione del tempo. Le piu interessanti sembrano essere
millis();
Fornisce i millisecondi trascorsi dallinizio del programma.
Esempio:
tempo=millis();
delay(pausa);
Mette in pausa il programma per un numero di millisecondi specificato in pausa.
Esempio:
delay(1000);
Funzioni matematiche
il linguaggio include funzioni matematiche alcune delle quali sono qui rappresentate. Lelenco
completo delle istruzioni e delle funzioni e reperibile nella sezione aiuto dellambiente di
sviluppo.
val = max(x,y);
val = abs(x);
val = pow(base,esponente); // calcola una potenza e cioe inserisce in val la base elevata
// allesponente. Attenzione: val deve essere una variabile di tipo
// double
val = sqrt(x);
Poiche i numeri generati sono in realta pseudo casuali (fanno cioe parte di una enorme sequenza
predefinita), per evitare di ripetere la medesima sequenza di numeri ad ogni avvio del programma
e opportuno inizializzare il generatore di numeri a caso utilizzando listruzione:
Conclusioni
Qui si conclude questa breve panoramica sul linguaggio di programmazione di Arduino.
E forse possibile trovare presso librerie specializzate (Feltrinelli o meglio Hoepli) alcuni manuali in
italiano sullargomento.
Poiche il linguaggio utilizzato per la scrittura degli sketch si chiama Wiring la ricerca dovrebbe
essere indirizzata verso un eventuale manuale di Wiring.
Wiring e un C++ contaminato da JAVA per cui e anche forse possibile ricorrere ad un manuale
C++ e/o Java (ipotesi pero sconsigliabile, viste le dimensioni di questi due tomi e visto che wiring
e solo un sottoinsieme di questi linguaggi).
Probabilmente il modo migliore per approfondire le caratteristiche di unistruzione o di una funzione
resta il semplice ricorso alla guida presente nellIDE (in inglese, ma assolutamente ben fatta ed
esaustiva) o una ricerca su internet.
Ultima, ma non ultima nota, occorre precisare che anche Wiring e dotato di un suo ambiente di
sviluppo (una sua IDE) che e possibile trovare e scaricare qui:
http://wiring.org.co/download/index.html
LIDE di wiring puo essere utilizzata altrettanto bene quanto lIDE di Arduino per scrivere,
compilare e caricare i programmi.