3 Programmazione ARDUINO/GENUINO v.1 Torino, 02/04/2016 ROBOTICS@MIDDLESCHOOL
In queste slide verranno trattati: Sensori Controllori Attuatori Obiettivo + - Controllore Attuatori Processo Sensori ROBOTICS@MIDDLESCHOOL 3A.2
In queste diapositive vedremo: Sistemi embedded Arduino/Genuino Programmazione (Arduino/Genuino) Struttura del codice Evitare le collisioni Misurare distanze con sensori a ultrasuoni Timer di reset automatico (watchdog) ROBOTICS@MIDDLESCHOOL 3A.3
Oggi i computer sono presenti, anche se non si notano, in una enorme quantità di dispositivi, come ad esempio lavatrici, forni elettrici, automobili, ecc Questi computer speciali inseriti all interno di altri dispositivi, di cui permettono il funzionamento, prendono il nome di sistemi embedded (che tradotto dall inglese significa integrati ). ROBOTICS@MIDDLESCHOOL 3A.4
Abbiamo già visto nelle precedenti slide come inserire dei computer all interno di sistemi automatici. Ora vedremo come realizzare in pratica un sistema embedded, impiegando come dispositivo la scheda Arduino/Genuino. ROBOTICS@MIDDLESCHOOL 3A.5
La scheda Arduino/Genuino è un vero e proprio computer embedded, che può essere impiegato per rendere intelligenti (smart) i nostri oggetti. Il progetto Arduino nasce in Italia, a Ivrea (TO) nel 2005, e da allora si è imposta come standard de facto nel mondo dei makers e nel mercato dei microcontrollori per appassionati. ROBOTICS@MIDDLESCHOOL 3A.6
Nel maggio 2015, a causa di problemi legali fra i fondatori della rete di distribuzione Arduino, viene decisa la creazione di due organizzazioni distinte e di un nuovo marchio: Arduino, negli Stati Uniti d America Genuino, nel resto del mondo. ROBOTICS@MIDDLESCHOOL 3A.7
Fra i punti forti dell Arduino/Genuino abbiamo una struttura fisica ormai standard de facto, con un enorme numero di estensioni hardware. Il linguaggio di programmazione, chiamato Processing, è semplice da imparare e sono disponibili un grandissimo numero di librerie già pronte all uso, per una vasta gamma di sensori o estensioni software. ROBOTICS@MIDDLESCHOOL 3A.8
Una scheda Arduino UNO ROBOTICS@MIDDLESCHOOL 3A.9
Il microcontrollore e il componente attorno a cui e costruita l intera scheda: e come il microprocessore di un computer e si occupa di gestire tutto cio che e presente sulla scheda. microcontrollore ROBOTICS@MIDDLESCHOOL 3A.10
Sono le porte di comunicazione del microcontrollore con il mondo esterno. Sono DIGITALI, cioèe possono assumere due soli stati (0 o 1) corrispondenti a due soli livelli di tensione elettrica. Porte ingresso/uscita digitali ROBOTICS@MIDDLESCHOOL 3A.11
Gli ingressi analogici possono essere impiegati per leggere delle tensioni che possono variare con continuita. ad esempio, possono essere usate per leggere la posizione di una manopola. Ingressi analogici ROBOTICS@MIDDLESCHOOL 3A.12
Sono essenziali in quanto permettono di ALIMENTARE la scheda, ossia di fornire l elettricita necessaria al suo funzionamento (un po come la presa di corrente di un qualsiasi elettrodomestico) Collegamenti di alimentazione ROBOTICS@MIDDLESCHOOL 3A.13
Porta USB Permette di collegare la scheda ad un computer sia per poterla programmare, che per poterla controllare in maniera interattiva (ossia far dialogare la scheda con un computer anche durante il funzionamento) ROBOTICS@MIDDLESCHOOL 3A.14
Tasto RESET Pin RESET, per collegare un ulteriore pulsante/circuito di reset Il RESET Permette di riavviare la scheda a seguito di un blocco del nostro software. Successivamente vedremo come fare reset in modo automatico dopo un tempo predefinito. ROBOTICS@MIDDLESCHOOL 3A.15
Vediamo ora come programmare l Arduino/Genuino. Per prima cosa, vediamo l interfaccia grafica del toolbox di programmazione della scheda, vedendone i principali comandi ROBOTICS@MIDDLESCHOOL 3A.16
ROBOTICS@MIDDLESCHOOL 3A.17
EDITOR Permette di scrivere il codice del programma ROBOTICS@MIDDLESCHOOL 3A.18
VERIFICA Controlla il codice e rileva eventuali errori ROBOTICS@MIDDLESCHOOL 3A.19
CARICA Verifica il codice, lo traduce e ne effettua l upload sulla scheda ARDUINO ROBOTICS@MIDDLESCHOOL 3A.20
Menu STRUMENTI Contiene altri strumenti fondamentali per la configurazione per il TARGET (ossia modello della scheda e porta di collegamento) ROBOTICS@MIDDLESCHOOL 3A.21
SCHEDA Permette di scegliere il modello di scheda per la quale si vuole programmare il nostro programma (chiamato sketch nel gergo di Arduino) ROBOTICS@MIDDLESCHOOL 3A.22
PROCESSORE Permette di scegliere il processore per cui tradurre il programma, per quelle schede disponibili con diversi modelli di microprocessore (nell Arduino uno, disponibile con un unico modello di processore, questa opzione non e disponibile) ROBOTICS@MIDDLESCHOOL 3A.23
PORTA Permette di selezionare la porta alla quale l arduino e collegato ROBOTICS@MIDDLESCHOOL 3A.24
Vediamo un attimo cosa siano queste porte. Sino a circa una decina di anni fa, per quei dispositivi che avessero necessità di trasferire informazioni testuali con i computer, veniva impiegata una porta particolare chiamata seriale, fisicamente presente sul retro dei computer e mostrata in figura: ROBOTICS@MIDDLESCHOOL 3A.25
Oggi, solitamente, queste porte non sono più presenti ma questo standard di comunicazione (RS232) viene simulato per i dispositivi collegati alla porta USB (non in grado di scambiare facilmente dati testuali). Esistono anche adattatori fisici da porta USB a seriale. In Windows queste porte vengono chiamate COM1, COM2, COM3 e così via a seconda del numero di porte fisiche e virtuali presenti nel nostro sistema. ROBOTICS@MIDDLESCHOOL 3A.26
MONITOR SERIALE Permette di leggere e scrivere su una porta seriale. ROBOTICS@MIDDLESCHOOL 3A.27
Ricordiamo ora alcuni aspetti teorici riguardanti la programmazione di un sistema automatico. Per prima cosa riprendiamo lo schema generale dei programmi per sistemi embedded. ROBOTICS@MIDDLESCHOOL 3A.28
Inizializzazione Codice del controllore ROBOTICS@MIDDLESCHOOL 3A.29
In entrambi i blocchi scriveremo delle chiamate a funzione, ossia dei comandi del tipo funzione(argomento1, argomento2, ) ROBOTICS@MIDDLESCHOOL 3A.30
funzione(argomento1, argomento2, ) Nome della funzione chiamata ROBOTICS@MIDDLESCHOOL 3A.31
Il nome della funzione solitamente indica il tipo di operazione che verra svolta dalla chiamata. Ad esempio, si pensi alla Nome della funzione funzione somma(2, 5) che chiamata esegue l operazione 2+5 funzione(argomento1, argomento2, ) ROBOTICS@MIDDLESCHOOL 3A.32
funzione(argomento1, argomento2, ) Gli argomenti sono gli OPERANDI. ad esempio, in 2+5 gli argomenti sono 2 e 5 ROBOTICS@MIDDLESCHOOL 3A.33
Gli argomenti sono i dati di cui la funzione necessita per poter svolgere l operazione richiesta. Noi ipotizzeremo sempre che una funzione CONOSCA SOLO GLI ARGOMENTI CHE GLI ANDREMO A PASSARE. Ad esempio, per poter fare una somma e Gli argomenti necessario sono gli conoscere solo e soltanto i OPERANDI, due ad esempio numeri in di cui si vuole calcolare la 2+5 gli argomenti somma. sono 2 e 5 funzione(argomento1, argomento2, ) ROBOTICS@MIDDLESCHOOL 3A.34
Inizializzazione Deve essere presente un blocco di codice da eseguire solo una volta all accensione della scheda o al reset, chiamato di inizializzazione. Nell Arduino questo blocco (funzione) viene chiamato setup() (dall inglese to setup, preparare). ROBOTICS@MIDDLESCHOOL 3A.35
Inizializzazione Le operazioni principali del blocco di inizializzazione sono: Configurazione delle porte di I/O Esecuzione di controlli preliminari (ad esempio fare una verifica del corretto funzionamento della scheda stessa e dei sensori/attuatori collegati) ROBOTICS@MIDDLESCHOOL 3A.36
Vediamo ora come configurare le porte di I/O (o input/output, ingresso/uscita): pinmode(numero_porta, modalità) Il numero della porta stampato sulla scheda ROBOTICS@MIDDLESCHOOL 3A.37
Vediamo ora come configurare le porte di I/O (o input/output, ingresso/uscita): pinmode(numero_porta, modalità) Scegliere INPUT o OUTPUT per rendere la porta rispettivamente di ingresso o di uscita ROBOTICS@MIDDLESCHOOL 3A.38
ATTENZIONE Configurando erroneamente una porta come ingresso invece che come uscita non danneggia l Arduino. Viceversa, configurando una porta di ingresso come uscita si potrebbe danneggiare irreparabilmente la scheda Arduino, che non dispone di protezioni da sovracorrenti. E quindi necessario prestare grande attenzione durante la configurazione delle porte. ROBOTICS@MIDDLESCHOOL 3A.39
Il controllore viene invece eseguito all interno del blocco (funzione) loop(). Codice del controllore ROBOTICS@MIDDLESCHOOL 3A.40
Questo codice viene eseguito ciclicamente dal momento in cui terminano le operazioni di setup fino allo spegnimento della scheda stessa. ROBOTICS@MIDDLESCHOOL 3A.41
Nel codice del controllore invece vengono eseguite ciclicamente le operazioni di lettura e scrittura del codice dalle porte del controllore. Ad esempio, può essere una lettura di un valore da un ingresso analogico, oppure una scrittura (set) di un valore (alto o basso, 0 o 1) su una porta di uscita digitale. ROBOTICS@MIDDLESCHOOL 3A.42
Notare che l Arduino dispone di uscite cosiddette rail-to-rail (letteralmente da binario a binario), cioè, intuitivamente, il livello LOW (basso, 0) corrisponde alla tensione del polo dell alimentatore/batteria, mentre il livello HIGH (alto, 1) corrisponde alla tensione del polo + dell alimentatore/batteria. ROBOTICS@MIDDLESCHOOL 3A.43
Partiamo dalla lettura: l Arduino dispone di porte di ingresso digitali (restituiscono o LOW o HIGH) o analogici (restituisce un valore tra 0 e 1023). Le due istruzioni di lettura sono: digitalread(numero_pin); per le porte digitali e analogread(numero_pin); per le porte analogiche. ROBOTICS@MIDDLESCHOOL 3A.44
Partiamo dalla lettura: l Arduino dispone di porte di ingresso digitali (restituiscono o LOW o HIGH) o analogici (restituisce un valore tra 0 e 1023). Le due istruzioni di lettura sono: digitalread(numero_pin); per le porte digitali e analogread(numero_porta); Il numero della porta stampato sulla scheda per le porte analogiche. ROBOTICS@MIDDLESCHOOL 3A.45
Partiamo dalla lettura: l Arduino dispone di porte di ingresso digitali (restituiscono o LOW o HIGH) o analogici (restituisce un valore tra 0 e 1023). Le due istruzioni di lettura sono: per le porte digitali e Il numero del pin stampato sulla scheda digitalread(numero_porta); analogread(numero_pin); per le porte analogiche. ROBOTICS@MIDDLESCHOOL 3A.46
Pin con relativi numeri per la lettura digitale ROBOTICS@MIDDLESCHOOL 3A.47
Pin con relativi numeri per la lettura analogica ROBOTICS@MIDDLESCHOOL 3A.48
Notiamo che è possibile leggere anche dalle uscite digitali: in questo caso viene riportato il valore attualmente riportato sulla porta. Dalle porte analogiche invece è solo possibile leggere, in quanto l Arduino non dispone di uscite analogiche. Vedremo poi il significato dell istruzione analogwrite(), che ha un funzionamento particolare. ROBOTICS@MIDDLESCHOOL 3A.49
Solo le porte digitali possono essere usate come uscite. I due comandi di scrittura su questi pin sono: digitalwrite(numero_pin, valore); impone un livello di tensione alto o basso sulla porta analogwrite(numero_pin, duty-cycle); usa una particolare tecnica di modulazione chiamata PWM. ROBOTICS@MIDDLESCHOOL 3A.50
Solo le porte digitali possono essere usate LOW (0V) come uscite. HIGH (5V) I due comandi di scrittura su questi pin sono: digitalwrite(numero_pin, valore); impone un livello di tensione alto o basso sulla porta analogwrite(numero_pin, duty-cycle); usa una particolare tecnica di modulazione chiamata PWM. ROBOTICS@MIDDLESCHOOL 3A.51
Solo le porte digitali possono essere usate come uscite. I due comandi di scrittura su questi pin sono: digitalwrite(numero_pin, valore); Valore da 0 impone un livello di tensione a 255 alto o basso sulla porta analogwrite(numero_pin, duty-cycle); usa una particolare tecnica di modulazione chiamata PWM. ROBOTICS@MIDDLESCHOOL 3A.52
Tensione [V] Uso di analogwrite(numero_pin, duty_cycle). Applica un onda quadra a 20 khz, come quella mostrata nel grafico tempo-tensione sotto. 5 0 25 50 75 100 Tempo [μs] ROBOTICS@MIDDLESCHOOL 3A.53
Variando il rapporto fra la durata della fase a 5V e quella a 0V, chiamata in gergo duty-cycle, possiamo modificare la luminosità di un LED o la potenza (e quindi la velocità) erogata da un motore elettrico. Nella slide successiva tre esempi di diverse scelte di duty-cycle, completamente OFF (sempre LOW), 50% della potenza e completamente ON (sempre HIGH). ROBOTICS@MIDDLESCHOOL 3A.54
Tensione [V] Tensione [V] Tensione [V] analogwrite(numero_pin, 0) 5 0 25 50 75 100 analogwrite(numero_pin, 127) Tempo [μs] 5 5 0 25 50 75 100 analogwrite(numero_pin, 255) Tempo [μs] 0 25 50 75 100 Tempo [μs] ROBOTICS@MIDDLESCHOOL 3A.55
Alle volte, la sequenza di istruzioni da eseguire non è fissa ma potrebbe dipendere dai risultati ottenuti nelle misure precedenti. Ad esempio, si pensi al forno elettrico: se la temperatura è minore di quella impostata è necessario accendere la resistenza, se maggiore spegnerla. ROBOTICS@MIDDLESCHOOL 3A.56
In questi casi è possibile impiegare il costrutto if:... if (var>=100) { //Istruzioni da esegure se vero } else { //Istruzioni da eseguire se falso }... ROBOTICS@MIDDLESCHOOL 3A.57
In questi casi è possibile impiegare il costrutto if:... if (var>=100) { } else { }... //Istruzioni da esegure E possibile se usare: vero == uguale a >= Maggiore uguale <= Minore uguale //Istruzioni da > eseguire Maggiore se falso < minore ROBOTICS@MIDDLESCHOOL 3A.58
In questi casi è possibile impiegare il costrutto if:... if (var>=100) { } else { }... //Istruzioni da esegure se vero Ricordare di mettere sempre la condizione fra parentesi. //Istruzioni da eseguire se falso ROBOTICS@MIDDLESCHOOL 3A.59
Vediamo ora una applicazione pratica: progettare un sistema in grado di evitare la collisione frontale di una macchinetta radiocomandata in presenza di ostacoli. ROBOTICS@MIDDLESCHOOL 3A.60
Per prima cosa riprendiamo il solito schema generale dei sistemi automatici: Obiettivo + - Controllore Attuatori Processo Sensori ROBOTICS@MIDDLESCHOOL 3A.61
Evitare collisioni frontali della macchinetta Obiettivo + - Controllore Attuatori Processo Sensori ROBOTICS@MIDDLESCHOOL 3A.62
Software per scheda ARDUINO Obiettivo + - Controllore Attuatori Processo Sensori ROBOTICS@MIDDLESCHOOL 3A.63
Motore acceso(abilitato) o spento(disabilitato) Obiettivo + - Controllore Attuatori Processo Sensori ROBOTICS@MIDDLESCHOOL 3A.64
Misurare la distanza dagli ostacoli frontali e all occorrenza disattivare il motore Obiettivo + - Controllore Attuatori Processo Sensori ROBOTICS@MIDDLESCHOOL 3A.65
Obiettivo + - Controllore Attuatori Processo Sensori ROBOTICS@MIDDLESCHOOL 3A.66
Sensore HC-SR04: Altoparlante: genera l impulso sonoro (nel campo degli ultrasuoni, quindi non udibile) necessario alla misura. ROBOTICS@MIDDLESCHOOL 3A.67
Sensore HC-SR04: Microfono: ascolta l eco generato dal suono prodotto dall altoparlante. ROBOTICS@MIDDLESCHOOL 3A.68
Sensore HC-SR04: Piedini di alimentazione (VCC = +, GND = -) ROBOTICS@MIDDLESCHOOL 3A.69
Sensore HC-SR04: Piedino di innesco (trigger)ù: se collegato verso + e poi verso richiede al sensore di effettuare una lettura ROBOTICS@MIDDLESCHOOL 3A.70
Sensore HC-SR04: Piedino di echo (eco): una volta effettuata la lettura viene generato un segnale di lunghezza proporzionale alla distanza misurata ROBOTICS@MIDDLESCHOOL 3A.71
La velocità del suono nell aria è nota, quindi misurando tramite un cronometro (abbastanza preciso) il tempo trascorso fra la generazione del suono e il suo eco, possiamo calcolare la distanza fra il sensore stesso e l oggetto. ROBOTICS@MIDDLESCHOOL 3A.72
1) Generazione impulso ultrasonoro: inizio tempo di volo ROBOTICS@MIDDLESCHOOL 3A.73
2) Propagazione del suono sino all oggetto ROBOTICS@MIDDLESCHOOL 3A.74
2) Propagazione del suono sino all oggetto ROBOTICS@MIDDLESCHOOL 3A.75
2) Propagazione del suono sino all oggetto ROBOTICS@MIDDLESCHOOL 3A.76
3) Il suono viene riflesso dall oggetto ROBOTICS@MIDDLESCHOOL 3A.77
3) L eco torna verso il sensore ROBOTICS@MIDDLESCHOOL 3A.78
3) L eco torna verso il sensore ROBOTICS@MIDDLESCHOOL 3A.79
3) L eco torna verso il sensore ROBOTICS@MIDDLESCHOOL 3A.80
3) L eco torna verso il sensore ROBOTICS@MIDDLESCHOOL 3A.81
3) L eco torna verso il sensore ROBOTICS@MIDDLESCHOOL 3A.82
4) Termina l eco: fine del tempo di volo ROBOTICS@MIDDLESCHOOL 3A.83
4) Registrazione del tempo di volo ROBOTICS@MIDDLESCHOOL 3A.84
Dal punto di vista del sensore possiamo quindi riconoscere questi tempi: Tempo di volo del segnale (andata e ritorno) t1 t2 t3 t4 t1 è l istante di tempo in cui viene generato l impulso t2 è l istante di tempo in cui termina l impulso t3 è l istante di tempo in cui il sensore inizia a segnalare l eco dall oggetto t4 è l istante di tempo in cui il sensore smette di segnalare l eco dall oggetto t ROBOTICS@MIDDLESCHOOL 3A.85
Vediamo ora il codice necessario per effettuare una lettura del sensore. In informatica, queste parti di codice usate per gestire un particolare dispositivo (hardware), vengono comunemente chiamate device driver. ROBOTICS@MIDDLESCHOOL 3A.86
Imposto il pin collegato all ECHO come ingresso, quello collegato al TRIGGER come uscita Effettuo la lettura dal sensore: Innesco il dispositivo (segnale a livello HIGH alto sul pin TRIG, quindi riporto poco dopo a livello LOW) Avvio il cronomentro Attendo che il livello sul pin ECHO vada a HIGH, quindi aspetto che torni a LOW Fermo il cronometro e registro il tempo trascorso ROBOTICS@MIDDLESCHOOL 3A.87
void setup() { pinmode(trigpin, OUTPUT); pinmode(echopin, INPUT); } Configurazione porte I/O ROBOTICS@MIDDLESCHOOL 3A.88
void loop() { digitalwrite(trigpin, LOW); 0 t [μs] ROBOTICS@MIDDLESCHOOL 3A.89
void loop() { digitalwrite(trigpin, LOW); delaymicroseconds(5); 0 5 t [μs] ROBOTICS@MIDDLESCHOOL 3A.90
void loop() { digitalwrite(trigpin, LOW); delaymicroseconds(5); digitalwrite(trigpin, HIGH); delaymicroseconds(10); 0 5 t [μs] ROBOTICS@MIDDLESCHOOL 3A.91
void loop() { digitalwrite(trigpin, LOW); delaymicroseconds(5); digitalwrite(trigpin, HIGH); delaymicroseconds(10); digitalwrite(trigpin, LOW); 0 5 15 t [μs] ROBOTICS@MIDDLESCHOOL 3A.92
void loop() { digitalwrite(trigpin, LOW); delaymicroseconds(5); digitalwrite(trigpin, HIGH); delaymicroseconds(10); digitalwrite(trigpin, LOW); duration = pulsein(echopin, HIGH, 22400); mm=(duration-31.995)/57.617*10; Duration d 0 5 15 15+d 15+d+10 t [μs] ROBOTICS@MIDDLESCHOOL 3A.93
void loop() { digitalwrite(trigpin, LOW); delaymicroseconds(5); digitalwrite(trigpin, HIGH); delaymicroseconds(10); digitalwrite(trigpin, LOW); duration = pulsein(echopin, HIGH, 22400); mm=(duration-31.995)/57.617*10; Lettura della distanza ROBOTICS@MIDDLESCHOOL 3A.94
A questo punto, sapendo leggere la distanza, dovremo essere in grado di costruire il controllore da installare sull Arduino!!! Obiettivo + - Controllore Attuatori Compito Sensori ROBOTICS@MIDDLESCHOOL 3A.95
Inizializzo le uscite per i led, l abilitazione del motore e il trigger Leggo la distanza Confronto la distanza con la soglia di sicurezza al di sotto della quale spegnere il motore: Se la distanza è minore della distanza di sicurezza porto a LOW l uscita di abilitazione del motore. Se la distanza è maggiore della distanza di sicurezza porto a HIGH l uscita di abilitazione del motore. ROBOTICS@MIDDLESCHOOL 3A.96
La distanza letta è maggiore di quella minima di sicurezza (dist. minima dist. letta > 0): ABILITO il motore Dist. minima + - Lettura distanza La distanza letta è minore di quella minima di sicurezza (dist. minima dist. letta < 0): DISABILITO il motore Abilita/disabilita il motore Alimentazione motore Dist. Frontale oggetti Distanza letta ROBOTICS@MIDDLESCHOOL 3A.97
Vediamo ora un altra possibile applicazione: la realizzazione di un termometro digitale. ROBOTICS@MIDDLESCHOOL 3A.98
+5 V VOUT GND Sensore LM35 (package LP) ROBOTICS@MIDDLESCHOOL 3A.99
Alimentazione: Polo positivo + della batteria Alimentazione: Polo negativo - della batteria +5 V VOUT GND Sensore LM35 (package LP) ROBOTICS@MIDDLESCHOOL 3A.100
Lettura di temperatura +5 V VOUT GND Sensore LM35 (package LP) ROBOTICS@MIDDLESCHOOL 3A.101
Esistono tre diverse versioni di questo sensore: LM-35D misura da 0 C a 100 C LM-35/LM-35A misura da -55 C a 150 C LM-35C/LM-35CA misura da -40 C a 110 C In queste slide tratterò la versione LM-35D ROBOTICS@MIDDLESCHOOL 3A.102
Il sensore LM35 è un sensore di tipo analogico: fornisce una tensione direttamente proporzionale alla temperatura misurata. L Arduino è un sistema digitale (numerico): è necessario trasformare le lettura analogica in un valore numerico, quindi trasformare questo valore in una misura espressa in gradi centigradi C. ROBOTICS@MIDDLESCHOOL 3A.103
Vediamo ora passo-passo come realizzare la cosiddetta catena di acquisizione per questo sensore di temperatura. La catena di acquisizione si compone di: Sensore LM-35 Convertitore analogico/digitale (ADC) Arduino ROBOTICS@MIDDLESCHOOL 3A.104
+5 V VOUT GND ADC Processore ROBOTICS@MIDDLESCHOOL 3A.105
La scheda Arduino integra al suo interno sei convertitori analogico/digitale +5 V VOUT GND ADC Processore Arduino ROBOTICS@MIDDLESCHOOL 3A.106
Lettura analogica +5 V VOUT GND ADC Processore ROBOTICS@MIDDLESCHOOL 3A.107
Lettura digitale dal convertitore +5 V VOUT GND ADC Processore ROBOTICS@MIDDLESCHOOL 3A.108
Lettura digitale dal convertitore Il convertitore analogico / digitale integrato nella scheda arduino fornisce valori in uscita da 0 a 1023, nell intervallo da 0 V a 5 V. +5 V VOUT GND ADC Processore ROBOTICS@MIDDLESCHOOL 3A.109
I convertitori ADC sono per definizione ingressi, quindi non è necessaria alcuna impostazione dei pin analogici Effettuo la lettura dal sensore: Leggo il valore di tensione presente sull ingresso dell ADC Converto la lettura ottenuta dall ADC in modo opportuno per ottenere un valore espresso in C ROBOTICS@MIDDLESCHOOL 3A.110
void loop() { raw=analogread(temp_ch); Acquisisco la lettura della temperatura tramite ADC Lettura della temperatura ROBOTICS@MIDDLESCHOOL 3A.111
void loop() { raw=analogread(temp_ch); temperatura=(float)raw/2.048+tmin; Lettura della temperatura Converto la lettura dall ADC in gradi celsius ROBOTICS@MIDDLESCHOOL 3A.112
Costante del termometro LM-35 k T = 10 mv C = 0,01 V C Costante dell'adc k ADC = 210 5 = 204, 8 1 V T = l RAW 1 k ADC 1 k T + T MIN = l RAW 2,048 + T MIN[ C] ROBOTICS@MIDDLESCHOOL 3A.113
Costante del termometro LM-35 k T = 10 mv C = 0,01 V C Costante dell'adc k ADC = 210 5 = 204, 8 1 V T = l RAW 1 k ADC 1 k T + T MIN = l RAW 2,048 + T MIN[ C] Lettura della tensione in uscita dal sensore di temperatura ROBOTICS@MIDDLESCHOOL 3A.114
T [ C] VOUT [V] TMIN ROBOTICS@MIDDLESCHOOL 3A.115
T [ C] VOUT [V] TMIN Lettura ottenuta dal convertitore analogico digitale ROBOTICS@MIDDLESCHOOL 3A.116
T [ C] VOUT [V] TMIN ROBOTICS@MIDDLESCHOOL 3A.117
T [ C] VOUT [V] TMIN ROBOTICS@MIDDLESCHOOL 3A.118
T [ C] VOUT [V] TMIN ROBOTICS@MIDDLESCHOOL 3A.119
T [ C] Valore di temperatura espresso in gradi celsius VOUT [V] TMIN ROBOTICS@MIDDLESCHOOL 3A.120
Alle volte, il software installato sulla nostra scheda Arduino potrebbe bloccarsi. Se la necessità di un reset manuale da parte dell utente è inaccettabile (ad esempio, nella macchinetta con sensore di distanza, la macchinetta potrebbe bloccarsi o non fermarsi in presenza di ostacoli) è necessario fare in modo che il sistema sia in grado di effettuare autonomamente il proprio reset. ROBOTICS@MIDDLESCHOOL 3A.121
Il watchdog (letteramente cane da guardia) è un timer configurabile (per tempi di 15, 30, 60, 120, 250, 500 millisecondi, 1, 2, 4 e 8 secondi nell Arduino/Genuino UNO) che permette il riavvio automatico della scheda. Ovviamente, nel caso la scheda funzioni correttamente, è possibile inviare un segnale al timer per far riiniziare il conteggio da capo e non causare così riavvii non desiderati. ROBOTICS@MIDDLESCHOOL 3A.122
Il watchdog, essendo un componente hardware presente all interno del processore, è indipendente da quanto eseguito dal programma (tranne la relativa istruzione di reset, chiamata gergalmente kick the dog). E anche molto facile da usare: è sufficiente: Abilitarlo (nell Arduino normalmente è disattivato) Resettarlo dopo ogni sezione temporalmente critica del codice ROBOTICS@MIDDLESCHOOL 3A.123
#include <avr/wdt.h> void setup() { wdt_enable(wdto_1s); } void loop() { //Sezione temporalmente critica } wdt_reset(); ROBOTICS@MIDDLESCHOOL 3A.124
#include <avr/wdt.h> void setup() { wdt_enable(wdto_1s); } void loop() Macro di intervallo (in pratica una { etichetta necessaria alla configurazione, //Sezione in quanto non temporalmente consentito esprimere critica il tempo di attesa come numero intero). wdt_reset(); Le MACRO per tutti i tempi disponibili sono } riportate alla slide successiva.. ROBOTICS@MIDDLESCHOOL 3A.125
Macro WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S Durata attesa timer 15 ms 30 ms 60 ms 120 ms 250 ms 500 ms 1 s 2 s 4 s 8 s Pagina di riferimento per il watchdog presente nell Arduino/Genuino UNO: http://www.atmel.com/webdoc/avrlibcreferencemanual/group avr watchdog.html ROBOTICS@MIDDLESCHOOL 3A.126
BONA B. Modellistica dei robot industriali, Celid, Torino, 2002 CORKE P. Robotics, Vision and Control, star, Springer, 2011 NICOLELIS M. Beyond boundaries. The new neurosciences of connecting brains and how it will change our lives, Bollati Boringhieri, Torino, 2014 WIENER R. Introduzione alla Cibernetica, Bollati Boringhieri, Torino, 1950 (ed. originale in lingua inglese) ROBOTICS@MIDDLESCHOOL 3A.127
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 4.0 Internazionale. http://creativecommons.org/licenses/by-nc-sa/4.0/ Per ottenere in versione digitale questo file e gli altri della serie polito.academia.edu/jacoposini http://www.roboticsms.altervista.org/ ROBOTICS@MIDDLESCHOOL 3A.128