CORSO PRATICO DI
ARDUINO
M ODULO INTERMEDIO
© 2016 Area 51 s.r.l., San Lazzaro di Savena (Bologna)
Se intendi condividere questo ebook con un’altra persona, ti chiediamo cortesemente di scaricare una copia a pagamento per ciascuna delle persone a cui lo vuoi destinare. Se stai leggendo questo ebook e non lo hai acquistato,
ti chiediamo, se ti piace, di acquistarne anche una copia a pagamento, al fine di poterci permettere di far crescere il nostro lavoro e di offrirti sempre più titoli e una qualità sempre maggiore. Grazie per il tuo aiuto e per aver
rispettato il lavoro dell’autore e dell’editore di questo libro.
YouTube
Spreaker
www.area51editore.com
www.area51editore.com/blog
Ringrazio Andrea Coppola, mio mentore in Blender, per avermi
spinto a realizzare questo manuale.
Un ringraziamento anche alla mia ragazza Barbara Damiani per
la sua grande pazienza e per essere una grande fonte di
ispirazione. Un ringraziamento anche alla mia famiglia che mi ha
sempre aiutato in tutto.
Dedico questo ebook a mio padre, ringraziandolo per quello che
fa tutt’oggi per me.
INTRODUZIONE
Dopo i progetti sviluppati nel modulo base, continuando a sfruttare la notevole versatilità
di Arduino, in questo manuale modificheremo un vecchio modellino di automobile
radiocomandata, ottenendo un valido punto di inizio per creare un drone terrestre
riciclando quello che avete in casa.
Nella prossima uscita approfondiremo diverse tematiche quali la programmazione di
Arduino e l’interfacciamento a esso di una app creata per smartphone.
A oggi esistono molte tipologie di droni. Secondo Wikipedia “un drone è un veicolo
controllato da remoto senza la presenza umana”. L’obiettivo di questo ebook è la
realizzazione di un drone casalingo con una spesa minima, riutilizzando vecchi giocattoli
o apparecchiature che si hanno in casa, così da diminuire i rifiuti elettronici in discarica. È
bello essere un po’ ecologici, inoltre il nostro drone sarà elettrico quindi a emissioni zero.
Sicuramente molti tra voi avranno un vecchio modellino di auto radiocomandata con il
telecomando che non funziona più o magari perso in qualche angolo di casa. Se invece che
lasciarla abbandonata cercassimo un modo per risolvere questo inconveniente, creando un
piccolo drone che la renda radiocomandata via bluetooth con il cellulare? Fantascienza?
Assolutamente no.
Negli ultimi anni abbiamo assistito a un’escalation tecnologica mai vista prima, possiamo
fare cose che prima potevano permettersi solo pochi eletti. Un nuovo movimento, una
nuova filosofia ha smosso questo mondo creando un sistema semplice, intelligente, ma
soprattutto divertente. Sto parlando di Arduino, una scheda che nella sua semplicità ha
cambiato la vita dell’hobbista consentendogli un salto di qualità inimmaginabile prima.
Sfruttiamo allora questa scheda per creare qualcosa di utile e divertente.
Spiegheremo nei prossimi capitoli come interfacciare Arduino UNO (che prenderemo a
riferimento) o qualsiasi altro Arduino abbiate in casa a un’automobile giocattolo
controllandone i movimenti da smartphone tramite bluetooth.
Ovviamente Arduino da solo non è in grado di controllare un motore elettrico direttamente
quindi ci avvarremo di altre schede collegabili ad Arduino per raggiungere il nostro
obiettivo. Nel progetto abbiamo usato delle schede già rodate con Arduino, dal costo
decisamente basso e su cui potrete trovare online un’ampia documentazione.
Per il controllo dei motori abbiamo usato un L298N, noto per controllare grossi carichi
come i motori elettrici, operazione che Arduino non riuscirebbe singolarmente a garantire
senza danneggiarsi. L298N è un ponte H che ha come interessante caratteristica quella di
poter invertire la polarità di tensione in modo da invertire la rotazione di un motore
elettrico e di modularne la potenza grazie al pwm di Arduino; ne parleremo in modo
approfondito nei prossimi capitoli, spiegando nel dettaglio la scheda che abbiamo usato.
Un altro componente è il modulo bluetooth HC-06. Perchè abbiamo scelto questo
modulo? Prima di tutto per il costo molto basso, poi perché facile da interfacciare: usa un
protocollo standard usato da molti device commerciali. È necessario specificare che in
Italia esiste un piano di frequenze radio ben preciso che indica chi può usare certe
frequenze e chi invece altre. Il bluetooth lavora su una frequenza libera di 2.45Ghz quindi
non abbiamo vincoli di alcun tipo, in particolare che riguardino tasse o contributi,
ricordando comunque che la potenza dovrà essere quella standard del modulo.
Effettuati i collegamenti e la programmazione, spiegheremo come radiocomandare il
drone dandovi anche ulteriori spunti per aumentargli le prestazioni in fatto di intelligenza.
Con questo drone potremo avere una base di partenza per altre nostre attività o potremo
migliorarlo per nuovi progetti.
2. HARDWARE
Iniziamo analizzando ogni singolo componente di questo progetto.
Utilizzeremo come board Arduino UNO, ne riportiamo il pinout nell’immagine
sottostante. È la piattaforma più famosa al mondo, con molteplici varianti per numerose
applicazioni. Ha semplificato la vita a noi elettronici per quanto riguarda
l’interfacciamento di componenti che un tempo sarebbero stati complessi da gestire
prevalentemente per ragioni di programmazione. La sua semplicità è disarmante, tuttavia
nessuno vieta di addentrarci anche nelle parti più nascoste come la gestione dei timer e
altre funzioni un po’ più tecniche ma, non essendo oggetto della trattazione di questo
ebook, rimandiamo alla dettagliata descrizione nel datasheet dei vari microcontrollori usati
dal team di Arduino. Vediamo adesso come è facile progettare un piccolo drone
telecomandato con poca spesa e tanta resa, ma soprattutto divertendosi e imparando
qualcosa di nuovo. Questa sarà la base di altri progetti che potrete realizzare liberamente
riciclando quello che avete in casa. Le possibilità sono infinite, il limite sarà solo la nostra
immaginazione.
L ND H B
298 UAL - M C
RIDGE OTOR ONTROLLER
È un componente molto interessante. Si tratta di un ponte H per il controllo di grossi
carichi come motori elettrici. Arduino non può controllare da solo un motore elettrico
perché rischierebbe di esser danneggiato dalle tensioni in gioco. Un motore elettrico
normalmente è costituito da un avvolgimento e da alcune calamite. Quando si alimenta
l’avvolgimento esso si comporta come una elettrocalamita: la carica elettromagnetica
viene influenzata dalle calamite quindi il motore entra in funzione. Il problema di
collegare Arduino direttamente al motore non è solo dovuto alle tensioni che spesso
possono non essere compatibili, ma anche al fatto che quando smettiamo di alimentare la
bobina interna di un motore si potrebbe verificare un dannoso ritorno di tensione verso
Arduino. Dobbiamo allora usare un qualcosa per interfacciarlo, la soluzione più semplice
sarebbe quella di utilizzare un transistore di potenza.
Nella figura soprastante possiamo vedere una semplice configurazione di un transistore in
modalità interruttore controllato dal pin 9 che genera un segnale pwm per il controllo di
tensione. O meglio genera una serie di impulsi di durata programmabile tramite
l’istruzione di Arduino “analogWrite(pin,valore);”. Il pin non è difficile da comprendere,
per il valore è necessaria una spiegazione. Abbiamo a disposizione un pwm con
risoluzione 8 bit, quindi 256 diversi valori che possiamo impostare. Da questo si deduce
che se dividiamo la tensione applicata ai valori che possiamo utilizzare, è possibile variare
la velocità del motore stesso. Sappiate che impostando 0 il motore si ferma, se impostate
255 il motore funzionerà a pieno regime. Basterà dividere il valore di tensione per i valori
usabili con Arduino per impostare la velocità.
Le immagini che seguono in sequenza vi fanno capire, grazie all’aiuto di un oscilloscopio,
come si comporta il segnale pwm in base ai valori:
Impostato a 25
Impostato a 125
Impostato a 240
Il “case” è una istruzione, un’etichetta dove di seguito possono esser elencate varie
funzioni. Il tutto viene controllato da “switch (inByte)” che legge la variabile di “int
inByte = Serial.read();”. Letto il dato, o il tasto premuto, come nel nostro caso, provvede a
salvarlo nella variabile che poi viene letta dall’istruzione switch che controllerà la
presenza del dato tra le etichette che abbiamo definito. Se il dato è presente viene eseguita
la porzione di codice al suo interno. Un case deve sempre finire con un break.
analogWrite(speedPinA, 255);
Questa istruzione definisce il valore di PWM da applicare al pin enable del L298N,
avremo 256 (compreso lo zero) valori, più sarà alto il valore e più velocemente girerà il
nostro motore. Quindi possiamo impostare vari valori di velocità: se viene definito 0 il
motore rimarrà fermo a 255, ovvero andrà a piena potenza. Possiamo quindi dedurre che
c’è una relazione tra quel valore e il valore di tensione applicata al motore. Per spiegarci
meglio ipotizziamo di configurare un valore di 125, L298N applicherà al motore solo la
metà della tensione nominale. Un ulteriore esempio: ipotizziamo di alimentare il tutto a 9
volt, con una comunissima batteria di quelle che trovate al supermercato. Se settiamo il
valore 125, L298 applicherà circa 4.5 volt. Come possiamo capire se un valore è ben
definito? Dividendo i valori che abbiamo a disposizione per i volt nominali, quindi nel
nostro esempio sarà 9/256 (256 perché contiamo anche il valore zero). In questo modo
sapremo quanti volt vale ogni valore. Non siamo obbligati a utilizzare una batteria dello
stesso voltaggio di quelle che alimentano i motori, ma possiamo settarlo da software in
modo tale che possa rispettare i valori di tensione di lavoro dei motori per non rischiare di
danneggiare. Con il PWM si ha il pieno controllo senza dover aggiungere altri componenti
al nostro progetto, ne consegue un risparmio monetario e anche un risparmio energetico.
digitalWrite(dir1PinA, LOW);
digitalWrite(dir2PinA, HIGH);
Anche queste due istruzioni sono molto importati. Settano i pin di direzione del nostro
motore. Il loro funzionamento è semplice, configurati in questo modo il motore gira in un
senso, ma se li configurassimo come segue:
digitalWrite(dir1PinA, HIGH);
digitalWrite(dir2PinA, LOW);
il nostro motore girerebbe nel verso contrario. I valori sono sempre l’opposto dell’altro
tranne per la fase di spegnimento dove saranno posti entrambi in LOW.
default:
for (int thisPin = 2; thisPin < 11; thisPin++) {
digitalWrite(thisPin, LOW);
In questo caso, una volta che un’etichetta viene eseguita o che comunque non viene
rilevata nessuna azione, lo switch passa il controllo all’etichetta default che con un ciclo
for mette a livello basso (LOW) fermando tutti i motori. A meno che non compaiano
anomalie, quindi, se non digitate nessun comando sul serial monitor di Arduino i motori si
fermeranno comunque senza arrecare danni.
HC B -06 LUETOOTH
Prima accensione
Come detto in precedenza, a secondo del modulo acquistato viene fornita una
configurazione di base. Il nostro modulo è configurato in modalità Slave con velocità di
9600 bps, passkey 1234, nominativo di identificazione BT UART. Il vostro modulo non
dovrebbe discostarsi molto da questo.
Iniziamo con un primo test per capire come utilizzare il nostro modulo Bluetooth. Di
seguito riportiamo lo Sketch da caricare su Arduino per la nostra prova:
#include <SoftwareSerial.h>
SoftwareSerial BT(7, 8);
// crea una porta seriale virtuale UART
// crea una porta seriale virtuale UART
// collega BT modulo TX al pin D7
// collega BT module RX al pin D8
// collega BT Vcc al pin 5V, GND al pin GND
void setup()
{
// Configura il PIN13 come uscita
pinMode(13, OUTPUT);
// Configura la velocità del SoftwareSerial port
BT.begin(9600);
// Inviamo un messaggio appena si connette
BT.println(“Hello from Arduino”);
BT.println(“Send ‘1’ to turn LED on”);
BT.println(“Send ‘2’ to turn LED on”);
BT.println(“Send ‘?’ to Help”);
}
char a; // dichiariamo una variabile di tipo carattere
void loop()
{
if (BT.available())
// Se arriva del testo dal Bluetooth…
{
a=(BT.read()); // …leggilo e memorizza in “a”
if (a==‘1’)
{
digitalWrite(13, HIGH);
BT.println(“LED on”);
// se il carattere è “1” accendi il led
}
if (a==‘2’)
{
digitalWrite(13, LOW);
BT.println(“LED off”);
// Se il carattere è “2” spegni il led
}
if (a==’?’)
{
BT.println(“Send ‘1’ to turn LED on”);
BT.println(“Send ‘2’ to turn LED on”);
//Se mi invii un ? Invia al device queste stringhe
}
// Da qui potete inserire tanti “if” per quanti comandi volete far eseguire
ad Arduino tramite Bluetooth
}
}
Una volta caricato lo Sketch su Arduino, basterà collegarsi con il proprio smartphone al
modulo utilizzando una qualsiasi app che faccia da terminale Bluetooth. Nel nostro caso
abbiamo scelto Bluetooth Terminal che trovate su Play Store.
Dopo aver effettuato ogni collegamento testiamo per scrupolo i vari componenti
singolarmente, in modo tale da capire se non ci siano stati errori di cablaggio o di altra
natura.
Prima di tutto cercate di non impilare le schede una sopra l’altra, se possibile, e prestate
attenzione ai collegamenti per evitare cortocircuiti. Regolate il PWM in base
all’elettronica della vostro modellino in modo tale che non ci siano strani movimenti di
sterzata e accelerazioni. Trovate una superficie rialzata per lasciare le ruote libere di
muoversi, nel nostro caso abbiamo usato un contenitore di cd rom (molto rudimentale ma
efficace), in modo tale che l’automobilina non vi sfugga. Questo è un test a vuoto: non
mettiamo sotto sforzo i motori ma possiamo capire se abbiamo compiuto le giuste scelte.
Siate pazienti e preparatevi a dover rimetter mano al codice se necessario. Se avete un
tester controllate la tensione che eroga ogni uscita del ponte H così che possiate avere le
massime prestazioni senza danneggiare i motori con tensioni non adeguate. In ogni caso,
seguendo le indicazioni che vi abbiamo dato non si presenteranno problemi particolari, al
massimo l’automobilina potrebbe procedere a bassa velocità (nel caso stiate facendo un
test in casa eviterete così danni al mobilio!). Non temete errori e continuate a effettuare
prove per comprendere meglio il funzionamento.
Consigliamo di fare un test di “stress” del codice proposto per individuare eventuali bug.
Il codice indicato costituisce un riferimento generale. Potrebbero tuttavia esserci delle
differenze sulla vostra automobilina e facendo questi test riuscirete a individuare eventuali
anomalie. Nel nostro caso abbiamo notato che non azzerando il PWM prima di passare
alla retromarcia, di tanto in tanto si presentava un fenomeno strano: il motore smetteva di
funzionare. Effettuato lo stesso test con un altro motore elettrico da banco il problema non
si è presentato. Probabilmente si tratta quindi di un difetto del motore montato sul
modellino. Altri piccoli problemi potrebbero presentarsi perché è impossibile inserire tutte
le variabili, tenete conto che stiamo hackerando un prodotto nato per fare altro. Se tutto è
andato a buon fine, possiamo togliere il piedistallo e vedere se i motori riescono a far
muovere il modellino senza incertezze, ovviamente resteremo vincolati alla lunghezza del
cavo.
Un ulteriore test importante è quello di collocare l’auto su un piano inclinato in modo da
controllare la reazione dei motori in salita. Controllate che non si surriscaldi troppo il
motore, nel caso regolate a dovere la variabile del codice che controlla il PWM. Si
potrebbe già impostare una funzione nel codice per frenare l’auto in salita senza che torni
indietro. Basterà creare una funzione che attivi la frenata sia in salita che in discesa.
Aggiungeremo anche altre funzioni interessanti, ne parleremo nella prossima
pubblicazione dove affronteremo anche ciò che concerne l’aggiunta di sensori per
monitorare l’ambiente.
S KETCH CONCLUSIVO
Siamo arrivati alla parte conclusiva, uniremo il codice ai test fatti in precedenza per far
funzionare l’automobilina con il bluetooth.
Come potete vedere nell’immagine abbiamo creato un menu di aiuto richiamabile tramite
“?”, utile per ricordarvi i comandi che potete usare.
Spiegheremo il codice nelle sue parti per rendevi poi dopo autonomi nel modificarlo,
aggiungendo altre funzioni e rendendolo più ricco.
Arrivati a questo punto dobbiamo staccare il modellino dal cavo usb. Vi consigliamo
anche di creare un pacco di batterie stilo per alimentare il tutto.
Vi proponiamo adesso il codice realizzato per radiocomandare il modellino tramite
bluetooth:
#include <SoftwareSerial.h>
SoftwareSerial BT(7, 8);
// crea una porta seriale virtuale UART
// collega BT modulo TX al pin D7
// collega BT module RX al pin D8
// collega BT Vcc al pin 5V, GND al pin GND
//Menù di controllo:
//
// 1 - Motore 1 Avanti
// 2 - Motore 1 Stop
// 3 - Motore 1 Indietro
//
// 4 - Motore 2 Avanti
// 5 - Motore 2 Stop
// 6 - Motore 2 Indietro
// Definisco le variabile per il Motore 1
int dir1PinA = 2;
int dir2PinA = 3;
int speedPinA = 9; // Definisco il pin per il controllo di velocità con un
segnale PWM
// Definisco le variabile per il Motore 1
int dir1PinB = 4;
int dir2PinB = 5;
int speedPinB = 10; // Definisco il pin per il controllo di velocità con un
segnale PWM
void setup()
{
BT.begin(9600);
// Inviamo un messaggio appena si connette
BT.println(“Hello from Automobilina”);
BT.println(“’7’ Comandi di aiuto”);
//Configuro i pin di Arduino in uscita per pilotare L298N
pinMode(dir1PinA,OUTPUT);
pinMode(dir2PinA,OUTPUT);
pinMode(speedPinA,OUTPUT);
pinMode(dir1PinB,OUTPUT);
pinMode(dir2PinB,OUTPUT);
pinMode(speedPinB,OUTPUT);
}
void loop()
{
if (BT.available())
// Se arriva del testo dal Bluetooth…
{
int inByte=(BT.read()); // …leggilo e memorizza in “a”
switch (inByte) {
//______________Motore 1______________
case ‘1’: // Motore 1 Avanti
analogWrite(speedPinA, 255); //Configurazione velocità del motore tramite
PWM
digitalWrite(dir1PinA, LOW);
digitalWrite(dir2PinA, HIGH);
BT.println(“’Motore 1 Avanti’”); // Scrive su la seriale
break;
case ‘2’: // Motore 1 Stop
analogWrite(speedPinA, 0);
digitalWrite(dir1PinA, LOW);
digitalWrite(dir2PinA, HIGH);
BT.println(“’Motore 1 Stop’”);
break;
case ‘3’: // Motore 1 Indietro
analogWrite(speedPinA, 255);
digitalWrite(dir1PinA, HIGH);
digitalWrite(dir2PinA, LOW);
BT.println(“’Motore 1 Indietro’”);
break;
//______________Motore 2______________
case ‘4’: // Motore 2 Avanti
analogWrite(speedPinB, 255);
digitalWrite(dir1PinB, LOW);
digitalWrite(dir2PinB, HIGH);
BT.println(“’Motore 2 Avanti’”);
break;
case ‘5’: // Motore 1 Stop
analogWrite(speedPinB, 0);
digitalWrite(dir1PinB, LOW);
digitalWrite(dir2PinB, HIGH);
BT.println(“‘Motore 2 Stop’”);
break;
case ‘6’: // Motor 2 Indietro
analogWrite(speedPinB, 255);
digitalWrite(dir1PinB, HIGH);
digitalWrite(dir2PinB, LOW);
BT.println(“‘Motore 2 Indietro’”);
break;
case ‘7’: // Motor 2 Indietro
BT.println(” ‘1’ Motore 1 Avanti”);
BT.println(” ‘2’ Motore 1 Stop”);
BT.println(” ‘3’ Motore 1 Indietro”);
BT.println(” ‘4’ Motore 2 Avanti”);
BT.println(” ‘5’ Motore 2 Stop”);
BT.println(” ‘6’ Motore 2 Indietro”);
BT.println(” ‘7’ Menu di aiuto”);
break;
default:
// Resetta tutti i pin dopo che è stato effettuato il ciclo
for (int thisPin = 2; thisPin < 11; thisPin++) {
digitalWrite(thisPin, LOW);
}
}
}
}
Analizziamo nel dettaglio alcune istruzioni. Si tratta di un firmware davvero semplice che
comunque vi darà spunti per avanzare con altri progetti. Cercheremo di farvi una base
solida non solo per modificare l’attuale codice ma anche di riscrivere uno nuovo da soli. È
importate capire che Arduino o meglio atmega sono microcontrollori ed eseguono il
codice in sequenza anche se potete creare, come nel nostro casto, piccoli sotto programmi
richiamabili a una certa azione o quando di presenta una determinata condizione. Se tali
condizioni non si presentassero Arduino andrà avanti fino alla fine.
Non possiamo avvalerci della memoria di storage di Arduino: quando fate una stesura di
un firmware dovrete fare molta attenzione a non usare tutta la memoria e le sue risorse.
Prestate quindi attenzione a quali variabili usate e che tipo di istruzioni.
Iniziamo adesso ad approfondire le varie istruzioni.
#include <SoftwareSerial.h>
SoftwareSerial BT(7, 8);
Come abbiamo già detto, questa istruzione crea una porta seriale virtuale su i pin 7,8 di
Arduino. È giusto precisare che la board è predisposta per avere una seriale fisica sui pin
0,1 che comunicano direttamente con un convertitore seriale (nel nostro caso è un altro
atmega programmato per fare un convertitore seriale usb). Il vantaggio di usare quei due
pin dedicati è che non si dovrà caricare questa libreria e che potremo quindi risparmiare
pin nel caso volessimo usare altri componenti da collegare. Abbiamo deciso di usarla per
farvene comprendere il funzionamento, in modo da non precludere nessuna strada durante
la progettazione.
È possibile programmare altri micro proprio dai quei pin usando Arduino come
programmatore, si deve però precisare che si dovrà creare nel file board.txt una board
virtuale in modo che IDE di Arduino sappia come programmarlo. Il vantaggio è che si
potrà caricare in nostro software su una scheda creata ad hoc, evitando di caricare il
firmware bootloader di Arduino, risparmiando spazio per il nostro programma e lasciando
la possibilità di configurare il micro anche con frequenze di lavoro differenti.
Tornando alle istruzione sopracitata notate che viene caricata la libreria SoftwareSerial.h
che si occupa di gestire una vera e propria porta seriale. Vi rimandiamo sul sito di Arduino
dove sono riportate tutte le istruzioni che si possono utilizzare.
Di seguito ne riportiamo alcune:
SoftwareSerial()
available()
begin()
isListening()
overflow()
peek()
read()
print()
println()
listen()
write()
SoftwareSerial BT(7, 8) configura la porta seriale sui pin 7,8 di Arduino. BT è una
etichetta che stabiliamo per ricordarci quando andremo a usare il resto dei comandi.
BT.begin(9600); configura la velocità della porta seriale che potrà essere impostata su
questi valori:
300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 234000, 460800,
921600, 1382400
Selezionerete quella che vi serve in base alle vostre esigenze o al dispositivo che dovrete
interfacciare.
int inByte=(BT.read()); che legge un valore in arrivo dalla porta seriale e lo memorizza
come valore intero nella variabile inByte che useremo più avanti per fare delle azioni ben
precise.
È giusto precisare che i comandi usati per la libreria SoftwareSerial.h sono identici al
protocollo seriale hardware con qualche istruzione in più, che nel nostro progetto non
impiegheremo, per la gestione di dati, eventi e flussi.
if (BT.available()) questa istruzione mette in attesa la porta seriale che aspetterà i dati in
arrivo per poi memorizzarli nella variabile inByte, consentendoci di gestire gli eventi che
vogliamo Arduino esegua.
switch (inByte) variabile che viene usata da “switch” che passa in rassegna i “case” che
abbiamo in elenco.
Si potrebbe fare la stessa cosa con l’istruzione “if”, di seguito riportiamo un esempio di
utilizzo:
if (variabile > 50)
{
// qui scrivete l’evento che si deve verificare
}
else
{
// in caso che il primo evento non vada a buon fine gli diamo
un’alternativa
}
Nel nostro caso abbiamo creato un ciclo FOR che resetta tutti i pin in modo da non avere
nessuno stato attivo su di essi. È utile quando dobbiamo fare cicli ripetitivi che
normalmente richiederebbero un set di istruzioni infinito ma, come abbiamo detto in
precedenza, la memoria in un micro è limitata e quindi dobbiamo trovare ogni tipo di
stratagemma per non sprecarla. Il ciclo FOR ripete per un certo numero di volte una
determinata azione che abbiamo deciso. Riportiamo un esempio per capire meglio:
for(int x = 0; x < 100; x++) {
println(x); //scriverà i numeri da 0 a 99
}
Nel linguaggio C il “++” serve per incrementare una determinata variabile. Si può usare
anche “+=”. Per decrementare si usa “—” oppure “-=”, sono tutti operatori utili per la
manipolazioni delle variabili.
Crea un pwm di circa 490 Hz, è una tecnica per controllare nel nostro caso i motori e
genera un segnale variabile. Andiamo a controllare il Duty cycle cioè il tempo dallo stato
attivo in proporzione al tempo complessivo, sostanzialmente togliamo la tensione in una
certa frequenza di tempo. In questo modo riusciamo a creare una tensione diversa da
quella di base. Il motore reagirà con l’aumento e la diminuzione di velocità.
digitalWrite(dir1PinA, HIGH);
digitalWrite(dir2PinA, LOW)
A differenza dall’istruzione precedente, questa pone i pin a livello basso o livello alto
quindi 1 o 0. È molto semplice da usare, noterete che viene indicato “HIGH” come valore
alto, quindi 1, e al contrario “LOW” come valore basso cioè 0. Le applicazioni sono
infinite, in questo caso selezioniamo il senso di marcia del nostro motore. Potremmo
anche azionare altri dispositivi come un relè per l’accensione delle luci o altre cose dove
siano necessari solo due stati, acceso o spento.
Affrontiamo adesso la dichiarazione di un pin uscita o ingresso.
pinMode(dir1PinA,OUTPUT);
pinMode(dir2PinA,OUTPUT);
pinMode(speedPinA,OUTPUT);
pinMode(dir1PinB,OUTPUT);
pinMode(dir2PinB,OUTPUT);
pinMode(speedPinB,OUTPUT);
In questo caso il nostro codice segnala ad Arduino i pin indicati dalle variabili che
abbiamo dichiarato all’inizio:
int dir1PinA = 2;
int dir2PinA = 3;
int speedPinA = 9;
int dir1PinB = 4;
int dir2PinB = 5;
int speedPinB = 10;
Il codice indica ad Arduino che i pin saranno uscite che poi gestiranno diversi eventi. Lo
stesso comando può definire pin di entrata pinMode(pin, INPUT); in questo modo
Arduino potrà ricevere dei comandi dall’esterno per interagire.
Abbiamo dichiarato delle variabili intere ma possiamo anche dichiarare char, byte, int,
word, long e flot. Ricordatevi che ogni variabile ha un peso nella ram quindi non siate
generosi nell’uso, si potrebbero presentare problemi nell’esecuzione del programma.