Leggi la tesina

Transcript

Leggi la tesina
Istituto Tecnino Industriale "Don Luigi Orione
a.s. 2014-2015
ESAME DI STATO
Classe 5°
Candidato
Tomassoni Geremia
Argomento scelto dal candidato
Prototipo di un'autovettura autonoma (CL4P-TP)
1
2
ABSTRACT
Una vera e propria rivoluzione sta per avvenire nel mondo dei trasporti.
L’avanguardia tecnologica dei tempi in cui viviamo sta modificando e modificherà sempre
più il modo di viaggiare spingendoci in un futuro vicino dove le macchine non
necessiteranno più di piloti umani. Partendo dal modello di automobile autonoma realizzato
da Google, il volere finale di questa tesina sperimentale è dimostrare che tutti possono
costruire la propria, piccola ‘Google car’, anche se usata per altri fini.
A real revolution is going to take place in the transport sector, the technological vanguard of
the times we live in is changing and will change more and more the way to travel pushing us
in a near future where cars will not need more than human pilots. Based on the model of
autonomous car designed by Google, the will of this final thesis is experimental to show that
everyone can build their own small ‘Google car’, even if used for other purposes.
3
Indice
1. Introduzione .......................................................................................................PAG. 6
1.1 Evoluzione degli autoveicoli .................................................................PAG. 6
1.2 Evoluzione dei sistemi di posizionamento ............................................PAG. 8
1.3 Cosa sta accadendo ................................................................................PAG. 9
2. Realizzazione di un sistema automatico .............................................................PAG. 11
2.1 Componenti utilizzati..............................................................................PAG. 11
2.2 Arduino...................................................................................................PAG. 12
2.2.1 Presentazione ...........................................................................PAG. 12
2.2.2 Hardware...................................................................................PAG. 13
2.2.3 Versioni ....................................................................................PAG. 14
2.2.4 Programmazione del microcontrollore......................................PAG. 16
2.2.5 Input e output.............................................................................PAG. 16
2.2.6 Ambiente di sviluppo.................................................................PAG. 18
2.3 HC-SR04..................................................................................................PAG. 19
2.3.1 Specifiche...................................................................................PAG. 20
2.3.2 Grafico onde...............................................................................PAG. 21
2.3.3 Collegamenti...............................................................................PAG. 24
4
2.4 GPS...........................................................................................................PAG. 25
2.4.1 Dati NMEA.................................................................................PAG. 26
2.4.2 Codice di funzionamento............................................................PAG. 27
2.5 Motori DC.................................................................................................PAG. 38
2.5.1 Codice.........................................................................................PAG. 39
2.6 Modulo SD................................................................................................PAG. 41
2.6.1 Codice..........................................................................................PAG. 42
3. Realizzazione telaio...............................................................................................PAG. 46
3.1 Stati della realizzazione.............................................................................PAG. 46
4. Conclusione............................................................................................................PAG. 53
4.1 Problematiche incontrate...........................................................................PAG. 53
5
Capitolo 1
Introduzione
1.1 Evoluzione degli autoveicoli
L'automobile nacque come mezzo di locomozione per sostituire l'animale e si affermò come
mezzo di trasporto solo nel XIX secolo. Già dal Rinascimento si progettarono modelli tali,
ma restarono solo su carta, prototipi come il Carro di Cugnot, carro con motore a vapore,
furono costruiti solo verso la fine del XVII secolo. I sistemi di alimentazione dei motori
cambiarono molto ed il motore endotermico e la benzina furono introdotti solo dopo la
prima guerra mondiale, nonostante ciò si cercavano e si cercano ancora alimentazioni
alternative alla benzina ed eco sostenibili.
Il Carro di Cugnot è la prima dimostrazione pratica della possibilità di trasporto senza
trazione animale, anche se, quando fu azionata procedette lentamente solo per una dozzina
di minuti con una punta di velocità massima stimata inferiore ai 10km/h. Il primo prototipo
costruito possedeva molte problematiche che si aggiungevano alla lentezza del mezzo, come
per esempio la lentezza di sterzata e la difficoltà nel fermarlo e infatti si distrusse contro un
muro. Invece il secondo prototipo raggiunse gli obiettivi sperati e attualmente è conservato
al “Conservatoire National des Arts et Métiers” a Parigi. Il carro di Cugnot fu un prototipo
fondamentale per il progresso in questo campo, ma ancora non era una valida alternativa
alla trazione animale. La svolta si ebbe grazie a modelli introdotti da imprenditori come per
esempio Carl Benz.
Un altro passo molto importante si ebbe nel 1876 grazie a Nikolaus August Otto, inventore
del primo motore a combustione interna a quattro tempi. Nel 1886 fu Carl Benz a costruire
il primo veicolo con motore endotermico.
Al giorno d'oggi sono in commercio svariati tipi di carburanti, alcuni fossili, derivati dal
petrolio come la benzina e il diesel, altri allo stato gassoso come il metano e il GPL; da
qualche anno sono state sviluppate automobili con motore elettrico che utilizzano come
6
"carburante" energia elettrica racchiusa dentro delle batterie ricaricabili o all'interno di
"serbatoi". La maggioranza dei veicoli con motore elettrico sono ibridi perchè possiedono
anche un motore a combustione interna combinato con quello elettrico, ultimamente sono
state progettate e costruite auto con solo il motore elettrico.
Nella seconda metà del XX secolo, un ingegnere statunitense, Stanley Meyer, progetto un
sistema di combustione ad acqua, che secondo i suoi studi richiedeva una minore quantità di
requisiti previsti dalla scienza tradizionale per compiere l'elettrolisi. Meyer esibì questo
motore montandolo su di una dune buggy e stimò un consumo di circa 83 litri per una
distanza di 4500 km. Nel 1996 Meyer fu citato in tribunale, il suo veicolo sarebbe dovuto
essere esaminato da Micheal Laughton in qualità di perito, tuttavia quel test non si svolse.
La sua "pila a combustione ad acqua" fu in seguito esaminata da altri tre periti nominati dal
tribunale che giudicarono il progetto di Meyer dicendo che non c'era niente di rivoluzionario,
che sfruttava l'elettrolisi convenzionale. Il tribunale lo ritenne colpevole di "una grossolana
frode", e dovette rimborsare tutti i suoi investitori per la somma di $25000. Stanley Meyer
morì improvvisamente il 20 marzo del 1998 dopo una cena al ristorante. Durante la cena
incontrò due investitori di nazionalità belga e Meyer corse improvvisamente fuori urlando:
"mi hanno avvelenato!". Dall'autopsia, i medici riscontrarono che soffriva di ipertensione e
morì di aneurisma cerebrale. I suoi sostenitori affermano che fu assassinato per sopprimere
le sue scoperte.
7
1.2 Evoluzione dei sistemi di posizionamento
I sistemi di posizionamento nascono con l'esigenza di sapere la propria posizione nel globo.
Questa è una problematica che l'uomo ha da molto tempo, prima della nascita dei sistemi
moderni, ovvero sin da quando l'uomo inizio ad esplorare e viaggiare. In passato venivano
usati vari metodi, per esempio nell'antichità, l'uomo si spostava lungo le rive di fiumi che
oltre ad una posizione approssimata offriva anche la possibilità di aver acqua corrente.
Quando l'uomo iniziò a navigare, inizialmente navigò attorno le coste per evitare di perdersi,
ma quando iniziò ad inoltrarsi in mare aperto, una delle problematiche maggiori era stabilire
(anche se in linea di massima) la propria posizione, sia per ritrovare luoghi già visitati, sia
per evitare ostacoli già segnalati in precedenza. Storicamente, uno dei primi metodi con cui
l'uomo iniziò a navigare in mare aperto, fu attraverso gli astri, come la stella Polare, fu
Talete di Mileto (634-548 a.C. circa), a lasciare la prima traccia storica dell'utilizzo di
questa stella, anche se non si esclude che non sia stato il primo a farne uso. Il popolo arabo
fu uno dei primi ad utilizzare uno strumento che faceva riferimento alla stella Polare, il
Kalam. Questo strumento era costituito da una tavoletta legata a una sagola a nodi, a ogni
nodo corrispondeva la latitudine di un porto conosciuto. Si usava prendendo fra i denti il
nodo corrispondente al punto di arrivo e, stendendo il braccio, si portava la tavoletta in linea
con l’orizzonte, se la stella Polare era più alta o più bassa del bordo superiore della tavoletta
voleva dire che ci si trovava a una latitudine più a sud o più a nord di quella del porto di
arrivo. Ci si trovava invece alla latitudine voluta quando la stella si adagiava sul bordo
superiore della tavoletta. Questo sistema non permetteva una precisione superiore alle 25
miglia. Prima che il navigatore europeo utilizzi sistemi di posizionamento bisognerà
aspettare gli anni sessanta del 1400, gli storici stimano che il primo strumento utilizzato fu
la balestriglia, che ha un funzionamento molto simile al Kalam, ma è composta da un’asta
graduata munita di due o tre tavolette scorrevoli. Invece alcuni storici credono che il primo
strumento utlizzato dagli europei fu il quadrante, il quale era formato da un quarto di
cerchio graduato, con a lato un mirino per inquadrare la stella Polare e per determinare
l'angolo era munito di un piccolo peso in piombo. Questo strumento fu largamente utilizzato
8
durante le scoperte della seconda metà del '400 e inizio '500, anche da personaggi come
Cristoforo Colombo, che lo adoperò durante il suo viaggio per le indie.
In seguito fu utilizzato l'astrolabio, di gran lunga molto più preciso, ma dalla sua forma
doveva essere per forza attaccato ad un'asta, ad in mare non restituiva dati molto precisi, per
cui i marinai più diligenti, quando si fermavano in porto lo utilizzavano di nuovo per poi
confrontare i dati ed avere una misura senz'altro giusta. Un altro strumento impiegato per il
calcolo della latitudine è il sestante, che venne ampiamente utilizzato fino all'introduzione di
sistemi moderni quali, Transit, o il più moderno GPS.
Per poter avere la propria posizione con precisione, si necessita di due coordinate: latitudine
e longitudine. Rispetto alla latitudine (che fu molto più semplice trovarla grazie ai metodi
elencati sopra), la longitudine fu più difficoltoso calcolarla, basti pensare che il parlamento
inglese nel 1714 offrì una ricompensa di 26.000 sterline (attuali 10 Milioni di Euro) a chi
avesse risolto il problema.
Spinti dalla ricompensa molti scienziati studiarono nuovi e precisi metodi per la
determinazione di essa, questo portò un grande sviluppo in molte materie, la più privilegiata
fu l'astronomia. Fu un orologiaio inglese, John Harrison, ha trovare il metodo opportuno
per il calcolo della longitudine. Egli utilizzò un orologio fisso sull'orario inglese,
precisamente di Greenwich, preso come punto fisso. Per perfezionare la sua scoperta ci mise
più di quaranta anni e i suoi seguaci la continuarono, fino ad arrivare ai moderni sistemi di
geolocalizzazione.
1.3 Cosa sta accadendo
Al giorno d'oggi, ci sono sempre più tecnologie rivolte al miglioramento del trasporto sia
pubblico che privato. La tecnologia detta "driverless" (ovvero senza conducente), è una di
queste. Attualmente è utilizzata nelle metropolitane di varie città e capitali mondiali come
Copenaghen, Hong Kong, Lille, Parigi, Torino, è stata testata anche a Roma, nella metro C
(il treno si è fermato quattro stazioni prima del capolinea). La tecnologia driverless è stata
attuata per concedere servizi efficenti e puntuali per incentivare la popolazione ad utilizzare
i mezzi pubblici anzi che quelli privati su gomma. Al tempo stesso permette un sostanzioso
9
risparmio delle risorse da parte delle aziende. Oltre alla riduzione dei costi di gestione,
escludendo la cabina del conducente, la tecnologia driverless consente di aumentare il carico
gli spazi disponibili per gli utilizzatori del servizio. Ma la vera innovazione è proposta da
Google, con la sua "Google car", auto con movimento autonomo dotate di speciali
componenti che permettono al veicolo di spostarsi su strada. Google car è equipaggiata con
un apparato del valore di 150000 dollari, di cui solo 70000 solo il LIDAR (Light Detection
and Ranging), strumento essenziale per lo spostamento su strada, perchè è grazie al LIDAR
che il sistema riesce a creare una mappatura tridimensionale dell'ambiente circostante, il
resto dell'apparato è formato da sensori ultrasuono, fotocamere stereo grazie al quale si
riesce ad acquisire immagini molto più vicine alla visione ottica di un umano piuttosto che
ad una comune fotocamera, una multitudine di laser, GPS, radar, per avere un'immagine di
essa a 360°. Grazie a questo vasto equipaggiamento hardware, il software riesce ad eviare
ostacoli, come persone, oggetti, altre macchine e anche i ciclisti, rispetta le leggi della strada
come semafori o stop, e grazie al GPS con mappe sempre aggiornate riesce ad individuare
lavori stradali per una guida migliore e più sicura.
Questo veicolo presenta ancora delle limitazioni, è stata testata maggiormente in California,
e risulta poco adatta alla vita frenetica delle strade di grandi città e la sua velocità massima è
di 45 km/h (28 mph). Google però, ha investito molto sulla parte della sicurezza, non solo
per le persone dentro l'abitacolo ma anche per l'esterno, in caso di collisioni per esempio
con pedoni o ciclisti; sono stati installati degli air bag speciali anche all'esterno che in caso
di scoppio non scaraventa il malcapitato a 10 m di distanza ma ne assorbe la forma, ed è
anche dotata di un parabrezza leggermente flessibile che ha la funzione, insieme all'air bag
esterno, di attutire lo schianto.
10
Capitolo 2
Realizzazione di un sistema automatico
2.1 Componenti utilizzati
Per lo sviluppo di questo progetto sono stati utilizzati svariati componenti, per un valore
totale che si aggira su un paio di centinaia di euro.
Componenti:
 Arduino Uno: verrà utilizzato per il funzionamento dei motori e del modulo
ultrasuoni;
 arduino Nano: verrà utilizzato per il funzionamento del GPS e scheda SD;
 seeed studio Motor Shield V2: verrà utilizzato per il funzionamento dei motori ;
 sensore ultrasuoni HC SR04: verrà utilizzato per visualizzare possibili ostacoli di
fonte al veicolo;
 DC motor + ruote: verranno utilizzate per lo spostamento;
 adafruit Ultimate GPS: è il modulo GPS che stampa i dati NMEA;
 SD card data logger: è il modulo che servirà per permettere all'arduino di scrivere i
dati NMEA del GPS su una scheda SD;
 breadboard: verrà utilizzata per fare piccoli collegamenti all'interno del veicolo;
 una ruota sferica: verrà utilizzata come appoggio anteriore, per permettere al veicolo
di sterzare liberamente;
 scatola in pvc per collegamenti elettrici: sarà il telaio, il corpo del progetto;
11
 adattatore uFL to SMA e antenna: per permettere che il segnale GPS sia registrabile
anche dall'interno di un edifico;
 saldatore a stagno, sega circolare, smerigliatrice angolare: strumenti necessari.
2.2 Arduino UNO
2.2.1 Presentazione
Arduino è una scheda elettronica di piccole dimensioni, con un microcontrollore e
circuiteria di contorno, utile per creare rapidamente prototipi oppure usarlo per scopi
hobbistici e didattici.
Con Arduino si possono realizzare in maniera relativamente rapida e semplice piccoli
dispositivi come controllori di luci, di velocità per motori, sensori di luce, temperatura e
umidità e molti altri progetti che utilizzano sensori,e comunicazione con altri dispositivi. È
fornito di un semplice ambiente di sviluppo integrato per la programmazione. Tutto
il software a corredo è libero, e gli schemi circuitali sono distribuiti come hardware libero.
2.2.2 Hardware
Arduino comprende una piattaforma hardware per il phycal computing sviluppata presso
l'Interaction Design Institute, un istituto di formazione post-dottorale con sede a Ivrea,
fondato da Olivetti e Telecom Italia.
Questa si basa su un circuito stampato che integra un microcontrollore con pin connessi alle
porte I/O, un regolatore di tensione e quando necessario un'interfaccia USB che permette la
comunicazione con il computer. A questo hardware viene affiancato un ambiente di
sviluppo
integrato (IDE) multipiattaforma (per Linux, Apple
Macintosh e Windows).
12
Questo software permette anche ai novizi di scrivere programmi con un linguaggio semplice
e intuitivo derivato da C e C++ chiamato Wiring, liberamente scaricabile e modificabile. I
programmi in Arduino vengono chiamati sketch.
Arduino può essere utilizzato per lo sviluppo di oggetti interattivi stand-alone e può anche
interagire, tramite collegamento, con software residenti su computer, come Adobe
Flash, Processing, Max/MSP, Pure Data, Supercollider, Vvvv.
La piattaforma hardware Arduino è spesso distribuita agli hobbisti in versione preassemblata, acquistabile in internet o in negozi specializzati. La particolarità del progetto è
che le informazioni sull'hardware, e soprattutto i progetti, sono disponibili per chiunque: si
tratta quindi di un hardware open source, distribuito nei termini della licenza Creative
Commons Attribution-ShareAlike 2.5. In questo modo, chi lo desidera può legalmente autocostruirsi un clone di Arduino o derivarne una versione modificata, scaricando
gratuitamente lo schema elettrico e l'elenco dei componenti elettronici necessari. Questa
possibilità ha consentito lo sviluppo di prodotti Arduino compatibili da parte di piccole e
medie aziende in tutto il mondo: è quindi divenuto possibile scegliere tra un'enorme quantità
di schede Arduino-compatibili. Ciò che accomuna questi prodotti inerenti elettronica
sperimentale e sviluppo è il codice sorgente per l'ambiente di sviluppo integrato e
la libreria residente che sono resi disponibili, e concessi in uso, secondo i termini legali di
una licenza libera, GPLv2.
Grazie alla base software comune ideata dai creatori del progetto, per la comunità Arduino è
stato possibile sviluppare programmi per connettere, a questo hardware, più o meno
qualsiasi
oggetto
elettronico,
computer, sensori, display o attuatori.
Dopo
anni
di
sperimentazione, è oggi possibile fruire di un database di informazioni vastissimo.
Il team di Arduino è composto da Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca
Martino, e David Mellis. Il progetto prese avvio in Italia a Ivrea nel 2005, con lo scopo di
rendere disponibile, a progetti di Interaction design realizzati da studenti, un dispositivo per
il controllo che fosse più economico rispetto ai sistemi di prototipazione allora disponibili. I
progettisti riuscirono a creare una piattaforma di semplice utilizzo ma che, al tempo stesso,
permetteva una significativa riduzione dei costi rispetto ad altri prodotti disponibili sul
13
mercato. A ottobre 2008, in tutto il mondo erano già stati venduti più di 50.000 esemplari di
Arduino.
Dopo la nomina ad amministratore delegato di Intel, Brian Krzanich farà produrre schede
Arduino dotate di processore Intel.
2.2.3 Versioni
L'hardware originale Arduino è interamente realizzato in Italia dalla Smart Projects, mentre
i cloni della scheda possono essere realizzati da chiunque in qualsiasi parte del mondo.
Una scheda Arduino tipica consiste in un microcontrollore a 8-bit AVR prodotto dalla
Atmel, con l'aggiunta di componenti complementari per facilitarne l'incorporazione in altri
circuiti. In queste schede sono usati chip della seriemegaAVR - nello specifico i modelli
ATmega8, ATmega168, ATmega328, ATmega1280 e ATmega2560.
Molte schede includono un regolatore lineare di tensione a 5 volt e un oscillatore a
cristallo a 16 MHz, sebbene alcune implementazioni, come ad esempio la piccola LilyPad,
abbiano un clock di 8 MHz e facciano a meno dello stabilizzatore di tensione.
Fino a oggi, sono state commercializzate 14 versioni dell'hardware Arduino:
1. Serial Arduino, programmata con una porta seriale DB9. Fa uso del microcontroller
ATmega8;
2. Arduino Extreme, con interfaccia di programmazione USB, facente uso del chip
ATmega8;
3. Arduino Mini, una versione in miniatura facente uso di un ATmega168 a montaggio
superficiale;
14
4. Arduino Nano, una versione ancor più piccola della Mini, utilizzante lo stesso
controller ATmega168 SMD e alimentata tramite USB;
5. LilyPad Arduino, un progetto minimalista (scheda circolare dal diametro di 50mm,
per circa 8mm di spessore), per applicazione su indumenti, con lo stesso ATmega168
in versione SMD;
6. Arduino NG, con un'interfaccia USB per programmare e usare un ATmega8;
7. Arduino NG plus, con interfaccia di programmazione USB, con un ATmega168;
8. Arduino BT, con interfaccia di programmazione Bluetooth e con un ATmega168;
9. Arduino Diecimila, con interfaccia di programmazione USB e con un ATmega168 in
un package DIL28;
10. Arduino Duemilanove, facente uso del chip Atmega168 (o Atmega328 nelle versioni
più recenti) e alimentata in corrente continua tramite USB, con commutazione
automatica tra le sorgenti di alimentazione;
11. Arduino Mega, che fa uso di un ATmega1280 a montaggio superficiale per I/O e
memoria addizionale;
12. Arduino Uno, evoluzione della Duemilanove con un differente chip, programmabile
e più economico, dedicato alla conversione USB-seriale;
13. Arduino Mega2560, che fa uso di un ATmega2560 ed è un'evoluzione dell'Arduino
Mega;
14. Arduino Due, che fa uso di un Atmel SAM3X8E ARM Cortex-M3 CPU;
15. Arduino Zero Pro, dotata di un microcontrollore Atmel SAMD21 basato su core
ARM Cortex M0+ a 32 bit.
2.2.4 Programmazione del microcontrollore
15
In alcuni casi il microcontrollore della scheda è pre-programmato con un bootloader che
semplifica il caricamento dei programmi sulla memoria flash incorporata nel chip.
A livello concettuale, tutte le schede sono programmate attraverso una porta seriale RS-232,
ma il modo in cui questa funzionalità è implementata nell'hardware, varia da versione a
versione. Le schede seriali Arduino contengono un semplice circuito inverter che permette
la conversione tra il livello della RS-232 e il livello dei segnali TTL.
Le versioni attuali di Arduino sono gestite via USB: la versione Uno utilizza
un microcontrollore Atmega8U2 programmato come convertitore USB-seriale, mentre le
precedenti versioni Diecimila e Duemilanove usavano chip adattatori USB-seriale, come gli
FT232 di FTDI. Alcune varianti, come la Arduino Mini e la versione non
ufficiale Boarduino, usano una scheda o un cavo adattatore USB-seriale staccabile.
2.2.5 Input e output
Per implementare il comportamento interattivo, Arduino è fornita di funzionalità
di input/output (I/O), grazie alle quali essa riceve i segnali raccolti da sensori esterni. Il
comportamento della scheda è gestito dal microcontroller in base ai valori provenienti dai
sensori e alle decisioni determinate dal particolare programma in esecuzione in quel
momento sulla scheda. L'interazione con l'esterno avviene attraverso attuatori pilotati dal
programma per mezzo dei canali di output in dotazione. A tale scopo, Arduino è dotata di
molti dei connettori di input/output per microcontroller in uso su altri circuiti. Tutti i pin di
I/O sono collocati sulla parte superiore della scheda mediante connettori femmina da 0,1".
Inoltre sono disponibili commercialmente molte schede applicative plug-in, note come
"shields".
Le schede Barebones e Boarduino, due cloni compatibili con la Arduino, sono dotate di
connettori maschio sul lato inferiore del circuito in modo da poter essere connesse a
una breadboard senza necessità di effettuare saldature.
16
La Arduino Uno, ad esempio, che ha soppiantato la Duemilanove, offre 14 connettori per
l'I/O digitale (numerati da 0 a 13). La direzione di funzionamento, input o output, è decisa
dallo sketch programmato sull'IDE.
Sei dei canali I/O possono produrre segnale Pulse-width modulation (PWM). Attraverso i
segnali PWM è possibile, ad esempio, regolare l'intensità di luminosità di un LED o la
velocità di rotazione di un motorino elettrico. L'hardware di tre dei pin di I/O (9, 10 e 11)
implementa la possibilità di gestirli direttamente attraverso la funzione analogWrite(), che
permette di controllare la PWM del segnale in uscita in maniera efficiente, senza dover
eseguire linee di codice appositamente predisposte. La funzione accetta due parametri, il
primo dei quali è il pin pilotato mentre il secondo rappresenta l'intensità della modulazione
(espressa su una scala da 0 a 255): così, ad esempio, analogWrite(9, 128) attiverà un led
collegato al pin 9 al 50% della sua luminosità.
Sempre sulla Uno, sono presenti altri 6 connettori specificamente dedicati a ingressi
di segnali analogici (collegati quindi ad una ADC), cioè valori di tensione letti
da sensori esterni i cui valori, fino a un massimo di 5 Volt, sono convertiti in 1024 livelli
discreti (da 0 a 1023). Questi 6 connettori possono essere riprogrammati (sempre
dal codice dello sketch sull'IDE) per funzionare come normali entrate/uscite digitali.
L'alimentazione della scheda può avvenire attraverso la porta USB del computer, o
attraverso la maggior parte degli alimentatori USB, oppure attraverso un adattatore in
corrente continua a 9 volt, con connettore cilindrico (diametro 2,1 mm e positivo centrale).
In quest'ultimo caso, la scheda commuta automaticamente sull'alimentazione esterna quando
il connettore dell'alimentatore esterno è inserito, mentre commuta autonomamente
sull'alimentazione USB in caso di disconnessione del connettore. La Arduino-NG e la
Arduino Diecimila, versioni meno recenti, necessitano di essere commutate a mano,
azionando uno switch ubicato tra la porta USB e l'ingresso dell'alimentazione esterna.
2.2.6 Ambiente di sviluppo
17
L'ambiente di sviluppo integrato (IDE) di Arduino è un'applicazione multipiattaforma scritta
in Java, ed è derivata dall'IDE creato per il linguaggio di programmazione Processing e per
il progetto Wiring. È concepita per iniziare alla programmazione artisti e altri neofiti, che
siano a digiuno di pratica nello sviluppo di software. Per permettere la stesura del codice
sorgente, l'IDE include un editore di testo dotato inoltre di alcune particolarità, come il
sintax highlighting, il controllo delle parentesi, e l'indentazione automatica. L'editor è
inoltre in grado di compilare e lanciare il programma eseguibile in una sola passata e con un
solo click. In genere non vi è bisogno di creare dei Makefile o far girare programmi
dalla riga di comando.
Insieme con l'IDE vengono scaricati vari sketch di esempio, per introdurre l'utente alla
programmazione della macchina; le tematiche sono molto basiche, come ad esempio gestire
gli ingressi analogici e digitali, far accendere un led in modo pulsante e variabile; si possono
però anche affrontare problemi più complessi come la gestione di un display LCD o di una
scheda telefonica GSM. Oltre alle varie librerie già incorporate (più di una decina), l'utente
può aggiungerne di nuove con uno strumento di importazione compreso nell'IDE. Per
vedere i risultati di uno sketch è attivabile dall'IDE una finestra seriale di monitoring, sulla
quale far comparire l'output di istruzioni Serial.print(parametro) incorporate nello sketch
stesso.
18
Figura 1: Arduino Rev 3.
2.3 HC-SR04
19
L'HC-SR04 è un sensore ultrasuoni con performance stabili, accurate ed è molto popolare
tra gli hobbisti e progettisti. Rapportandolo con lo Shap IR ranging module, è molto meno
costoso ed è anche più preciso.
2.3.1 Specifiche
 E' alimentato con corrente continua a 5V e 2mA di corrente;
 ha un lobo di sensibilità minore di 15°;
 misura da I due centimetri fino ai cinque metri;
 gli impulsi sono inviati ad una frequenza di 40k Hz;
 ha una risoluzione di 1 cm.
Figura 2: dimensioni e raggio di
propagazione ultrasuoni sensore HC-SR04.
20
Figura 3: sensore HC-SR04.
2.3.2 Grafico onde
All'attimo zero viene trasmesso un breve impulso che riflette contro l'oggetto, quando il
sensore riceve l'eco del segnale lo converte in segnale elettrico, l'impulo dopo viene
trasmesso quando il primo eco si spegne. Questo periodo di tempo è chiamato ”periodo di
ciclo”. Il periodo di ciclo è raccomandabile di mantenerlo a non meno di 50 ms. Se un
impulso del trigger con una larghezza di10μs viene inviato al pin del segnale, il modulo
ultrasuoni emette otto segnali ultrasonici a 40kHz e rileva l'eco di ritorno. La distanza
misurata è proporzionale alla larghezza di impulso di eco e può essere calcolata con la
formula di cui sopra. Se non viene rilevato nessun ostacolo, il pin di uscita darà un segnale
di 38ms di alto livello.
21
Figuta 4: grafico onde HC-SR04.
Sotto è riportato un semplice esempio di sketch Arduino per il funzionamento del sensore
HC-SR04.
Prima del Void Setup, vengono settati gli ingressi alla board, in questo caso il Trigger è
connesso al pin 9 dell'Arduino, mentre l'Echo al pin 8.
Nel Void Setup viene dichiarato se le componenti inserite hanno un valore in INPUT o in
OUTPUT.
Figura 5: semplice sketch per l'esecuzione funzionale del sensore HC-SR04.
22
Con queste poche righe di codice, questo sensore è in grado di dirci a quanti centimetri di
distanza si trova l'ostacolo. E' il pin Trigger che manda l'impulso che poi rimbalza
sul'ostacolo e viene recepito dal pin Echo.
23
2.3.3 Collegamenti
Figura 6 e 7: Collegamento tra l'Arduino UNO Rev 3 ed il sensore ultrasuoni HC-SR04,
come dichiarato nel codice.
24
2.4 GPS
Il modulo GPS che viene utilizzato in questo progetto è prodotto dall'Adafruit e nonostante
le piccole dimensioni possiede specifiche che nel suo genere pochi hanno:

-165 dBm sensitivity, 10 Hz updates, 66 channels

5V friendly design and only 20mA current draw

Breadboard friendly + two mounting holes

RTC battery-compatible

Built-in datalogging

PPS output on fix

Internal patch antenna + u.FL connector for external active antenna

Fix status LED
Questo modulo è costruito con a base un MTK3339 chipset, e come già detto qui sopra, è un
GPS di alta qualità in quanto può tracciare 22 satelliti su 66 canali differenti, un’alta
sensibilità e un’antenna incorporata, ma volendo lo si può equipaggiare con un’antenna
aggiuntiva tramite un adattatore uFL/SMA.
Il modulo GPS verrà così collegato all'Arduino Nano:
 TX: pin 3 Arduino Nano;
 RX: pin 2 Arduino Nano;
 GND: pin GND (massa) Arduino Nano;
 VIN: pin 5V Arduino Nano;
25
2.4.1 Dati NMEA
In Output il GPS restituisce sempre dati NMEA, che si differenziano in vari tipi di dati.
I dati NMEA sono caratterizzati dal prefisso “$GP”, seguito dal nome del dato che è diverso
in base alle informazioni che restituisce, per esempio "$GPRMC" (Recommended minimum
specific GPS/Transit data), indica informazioni come l'ora, la data, la latitudine, la
longitudine e i nodi (velocità). Ora è presentata la scomposizione delle varie stringhe
NMEA:
Stringa $GPRMC:
$GPRMC,194509.000,A,4042.6142,N,07400.4168,W,2.03,221.11,160412,,,A*77
 194509.000: la prima parte della stringa restituisce l'orario UTC (al meridiano di
Greenwich), perciò al momento dell'acquisizione del dato erano le 19:45':09" e i
restanti decimali caratterizzano i millesimi di secondo che in questo caso sono 0;
 A: questo dato è molto importante perché caratterizza lo stato del GPS, A sta per
"Active" cioè il segnale è presente e la qualità è maggiore a 3 (se la qualità del
segnale è minore di 3, il dato è segnato invalido). In caso di malfunzionamento al
posto della lettera a ci troveremo la lettera "V" Void (Figura 8);
 4042.6142,N: rappresenta il dato latitudinale corrispondente a 40 gradi e 42.6142
minuti decimali posizione Nord;
 07400.4168,W: rappresenta il dato longitudinale corrispondente a 74 gradi e 0.4168
minuti decimali posizione Ovest;
 2.03: corrisponde ai nodi ovvero alla velocità registrata in quel momento;
 221.11: corrisponde all'angolo di rilevamento che stabilisce approssimativamente la
direzione in base ai dati precedentemente raccolti;
 160412: corrisponde alla data in cui è stato registrato il dato ovvero il 16 Aprile 2012;
26
 A*77: quest'ultima parte è chiamata "Checksum" e caratterizza la fine della stringa
dati;
Stringa $PGTOP:
$PGTOP,11,x
 x: indica lo stato dell'antenna, se la x corrisponde a 3 si sta usando un'antenna esterna;
se è 2 si sta utilizzando l'antenna interna; se è 1 c'è un problema all'antenna.
2.4.2 Codice funzionamento
Per il funzionamento del modulo GPS è stato utilizzato un codice d'esempio compilato dalla
casa produttrice del modulo che ha creato anche la libreria, l'Adafruit. Il codice è qui di
seguito presentato:
// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver
//
// This code shows how to listen to the GPS module in an interrupt
// which allows the program to have more 'freedom' - just parse
// when a new NMEA sentence is available! Then access data when
// desired.
//
// Tested and works great with the Adafruit Ultimate GPS module
// using MTK33x9 chipset
// ------> http://www.adafruit.com/products/746
// Pick one up today at the Adafruit electronics shop
27
// and help support open source hardware & software! -ada
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
// If you're using a GPS module:
// Connect the GPS Power pin to 5V
// Connect the GPS Ground pin to ground
// If using software serial (sketch example default):
// Connect the GPS TX (transmit) pin to Digital 3
// Connect the GPS RX (receive) pin to Digital 2
// If using hardware serial (e.g. Arduino Mega):
// Connect the GPS TX (transmit) pin to Arduino RX1, RX2 or RX3
// Connect the GPS RX (receive) pin to matching TX1, TX2 or TX3
// If you're using the Adafruit GPS shield, change
// SoftwareSerial mySerial(3, 2); -> SoftwareSerial mySerial(8, 7);
// and make sure the switch is set to SoftSerial
// If using software serial, keep this line enabled
// (you can change the pin numbers to match your wiring):
SoftwareSerial mySerial(3, 2);
28
// If using hardware serial (e.g. Arduino Mega), comment out the
// above SoftwareSerial line, and enable this line instead
// (you can change the Serial number to match your wiring):
//HardwareSerial mySerial = Serial1;
Adafruit_GPS GPS(&mySerial);
// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console
// Set to 'true' if you want to debug and listen to the raw GPS sentences.
#define GPSECHO true
// this keeps track of whether we're using the interrupt
// off by default!
boolean usingInterrupt = false;
void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy
void setup()
{
29
// connect at 115200 so we can read the GPS fast enough and echo without dropping chars
// also spit it out
Serial.begin(115200);
Serial.println("Adafruit GPS library basic test!");
// 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800
GPS.begin(9600);
// uncomment this line to turn on RMC (recommended minimum) and GGA (fix data)
including altitude
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
// uncomment this line to turn on only the "minimum recommended" data
//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
// For parsing data, we don't suggest using anything but either RMC only or RMC+GGA
since
// the parser doesn't care about other sentences at this time
// Set the update rate
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
// For the parsing code to work nicely and have time to sort thru the data, and
// print it out we don't suggest using anything higher than 1 Hz
30
// Request updates on antenna status, comment out to keep quiet
GPS.sendCommand(PGCMD_ANTENNA);
// the nice thing about this code is you can have a timer0 interrupt go off
// every 1 millisecond, and read data from the GPS for you. that makes the
// loop code a heck of a lot easier!
useInterrupt(true);
delay(1000);
// Ask for firmware version
mySerial.println(PMTK_Q_RELEASE);
}
// Interrupt is called once a millisecond, looks for any new GPS data, and stores it
SIGNAL(TIMER0_COMPA_vect) {
char c = GPS.read();
// if you want to debug, this is a good time to do it!
#ifdef UDR0
if (GPSECHO)
if (c) UDR0 = c;
31
// writing direct to UDR0 is much much faster than Serial.print
// but only one character can be written at a time.
#endif
}
void useInterrupt(boolean v) {
if (v) {
// Timer0 is already used for millis() - we'll just interrupt somewhere
// in the middle and call the "Compare A" function above
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
usingInterrupt = true;
} else {
// do not call the interrupt function COMPA anymore
TIMSK0 &= ~_BV(OCIE0A);
usingInterrupt = false;
}
}
uint32_t timer = millis();
void loop()
// run over and over again
{
32
// in case you are not using the interrupt above, you'll
// need to 'hand query' the GPS, not suggested :(
if (! usingInterrupt) {
// read data from the GPS in the 'main loop'
char c = GPS.read();
// if you want to debug, this is a good time to do it!
if (GPSECHO)
if (c) Serial.print(c);
}
// if a sentence is received, we can check the checksum, parse it...
if (GPS.newNMEAreceived()) {
// a tricky thing here is if we print the NMEA sentence, or data
// we end up not listening and catching other sentences!
// so be very wary if using OUTPUT_ALLDATA and trytng to print out data
//Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
// if millis() or timer wraps around, we'll just reset it
33
if (timer > millis()) timer = millis();
// approximately every 2 seconds or so, print out the current stats
if (millis() - timer > 2000) {
timer = millis(); // reset the timer
Serial.print("\nTime: ");
Serial.print(GPS.hour, DEC); Serial.print(':');
Serial.print(GPS.minute, DEC); Serial.print(':');
Serial.print(GPS.seconds, DEC); Serial.print('.');
Serial.println(GPS.milliseconds);
Serial.print("Date: ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.println(GPS.year, DEC);
Serial.print("Fix: "); Serial.print((int)GPS.fix);
Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
if (GPS.fix) {
Serial.print("Location: ");
Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
Serial.print(", ");
Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
34
Serial.print("Location (in degrees, works with Google Maps): ");
Serial.print(GPS.latitudeDegrees, 4);
Serial.print(", ");
Serial.println(GPS.longitudeDegrees, 4);
Serial.print("Speed (knots): "); Serial.println(GPS.speed);
Serial.print("Angle: "); Serial.println(GPS.angle);
Serial.print("Altitude: "); Serial.println(GPS.altitude);
Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
}
}
}
35
Figura 8: output NMEA con "fix" e "quality" minori di 3, in campo navale, vengono
considerati non veritieri.
36
Figura 9: output corretto in base al codice caricato nel micro processore.
37
2.5 Motori DC
Il motore a corrente continua (o DC, Direct Current in inglese), è stato il primo motore
elettrico realizzato, è tutt'ora largamente utilizzato per grandi o piccole potenze. Molto
ricorrente è l'uso domestico di questa tecnologia per piccole potenze.
Il primo motore DC è stato realizzato nel 1821 da Michael Faraday e consisteva in un filo
conduttore tenuto fermo verticalmente alla sua estremità superiore in modo che l'estremità
inferiore fosse immersa in un piatto contenente mercurio. Un magnete permanente circolare
era sistemato al centro del piatto. Quando una corrente elettrica veniva fatta scorrere nel filo,
questo ruotava attorno al magnete mostrando che la corrente generava un campo
magnetico attorno al filo.
In questo progetto sono stati utilizzati due motori a corrente continua applicati a dei riduttori
per "ruotare il movimento" di 90°. I motori scelti sono frequentemente utilizzati per questo
genere di progetti e sono facilmente reperibili sul web.
In questo progetto, i motori verranno collegati negli appositi morsetti del motor shield, il
destro MOTOR A e il sinistro MOTOR B.
38
Figura 10: Motore utilizzato nel progetto.
2.5.1 Codice
#include "MotorDriver.h"
void setup()
{
/*Configure the motor A to control the wheel at the left side.*/
/*Configure the motor B to control the wheel at the right side.*/
motordriver.init();
motordriver.setSpeed(200,MOTORB);
motordriver.setSpeed(200,MOTORA);
}
39
void loop()
{
motordriver.goForward();
delay(2000);
motordriver.stop();
delay(1000);
motordriver.goBackward();
delay(2000);
motordriver.stop();
delay(1000);
motordriver.goLeft();
delay(2000);
motordriver.stop();
delay(1000);
motordriver.goRight();
delay(2000);
motordriver.stop();
delay(1000);
}
40
2.6 Modulo SD
Per salvare i log dei dati NMEA del GPS, è stato utilizzato un modulo SD. Per il
funzionamento si è dovuto formattare la scheda SD in FAT16.
Il modulo utilizzato è quello rappresentato in figura:
Figura 11: Modulo SD Arduino.
Il modulo verrà così collegato:
 MISO: pin 12 Arduino Nano;
 SCK: pin 13 Arduino Nano;
 MOSI: pin 11 Arduino Nano;
 SDCS: pin 4 Arduino Nano;
 3.3V: pin 3.3V Arduino Nano;
 GND: pin GND (massa) Arduino Nano.
41
2.6.1 Codice
Il codice che si andrà ad utilizzare permette di scrivere e leggere sulla scheda SD, per questo
progetto verrà utilizzata solo la parte di scrittura:
#include <SPI.h>
#include <SD.h>
File myFile;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
42
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
43
Serial.println("error opening test.txt");
}
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop()
{
44
// nothing happens after setup
}
45
Capitolo 3
Realizzazione del telaio
3.1 Stati della realizzazione
Come già detto, la realizzazione del telaio è stata la parte del progetto che ha portato
maggiori problematiche a causa di problemi per esempio come la convergenza delle ruote.
Sostanzialmente il telaio ha avuto quattro versioni, la seconda e la terza molto simili tra di
loro, ma la seconda porta alcune minimali migliorie.
La prima versione del telaio è stata realizzata con l'ausilio di una confezione di CD, il telaio
è stato realizzato in classe, tramite delle fascette sono stati fissati i motori e anche la "ruota"
anteriore (Figura 12).
Figura 12: primo telaio
46
A differenza della prima versione, la seconda è molto meno rudimentale ed è stata creata
tramite un asse di legno 120x170x7, tagliata a sega circolare e poi rinifinita a mano con
della carta vetrata P120. Per fissare i motori è stato forato l'asse e immesse viti a testa piatta
sia per estetica, sia per comodità. Inizialmente alle viti sono state unite due alette in
alluminio e fermate con dei dadi. Questo primo progetto è stato scartato subito perché
stretto il bullone, il motore “scivolava” fuori visto la forza di esso sulle alette. Le alette sono
state realizzate, come già detto, da una staffa di alluminio tagliata a mano con l'ausilio di
una smerigliatrice angolare (Figura 13).
Figura 13: realizzazione alette
Subito scartato questo stratagemma di bloccaggio ruote, è stato realizzato un altro sistema. I
motori sono stati fissati al telaio tramite una staffa di alluminio tagliata alle estremità per
permettere che entrassero "dentro" le ruote evitando di toccarle (Figura 14).
47
Figura 14: realizzazione secondo sistema di blocco.
Qui sotto è rappresentato la seconda versione del telaio (figura 15):
Figura 15: secondo telaio.
48
La seconda staffa avvitata sulla prima, serve per rendere piatta la superficie ove verrà
sistemata la breadboard.
Come già detto, tra questa versione e la successiva non ci sono molti cambiamenti, per
tentare di tenere il linea le ruote con il telaio sono stati applicati dei piccoli angolari e delle
barre di ferro forate, è stato aggiunto un interruttore per l'accensione dell'arduino,
un'ulteriore staffa di alluminio posta nella parte posteriore per bloccare le ruote.
Sfortunatamente non sono state realizzate foto complete del terzo telaio, ma è stata scattata
una foto rappresentante la sua carcassa(Figura 16):
Figura 16: carcassa terzo modello del telaio.
L'ultimo telaio invece, quello definitivo, è stato realizzato sfruttando una scatola per
collegamenti elettrici, che poi è stata forata per poterci fissare al suo interno i motori e
all'esterno le ruote, all'esterno sul coperchio è stato fissato Arduino uno con il motor shield,
mentre all'interno del coperchio è stato fissato Arduino nano e la breadboard con inseriti
GPS e modulo SD (figura 17).
49
Figura 17: collegamenti sul coperchio.
Nella parte frontale sono stati effettuati dei fori da 16mm ed inserito il modulo HC-SR04,
come raffigurato nell'immagine sucessiva(Figura 18):
50
Figura 18:realizzazione fori sensore ultrasuoni.
Mentre nella parte posteriore della scatola sono stati apllicati due fori per l'iserimento
dell'antenna GPS e dell'interruttore START & STOP, come in figura sottostante(Figura 19):
Figura 19: lato posteriore.
Per le ruote anteriori per ora sono state sostituiti da dei ritagli circolari in legno, fissate alla
scatola de due viti, la circonferenza esterna è stata ricoperta de un taglio di camera d'aria per
biciclette per simulare il copertone. Con questo metodo il veicolo non riesce a sterzare, si
sta cercando un altro stratagemma (figura 20).
51
Figura 20: ruote.
52
Capitolo 4
Conclusioni
Alla fine dei questo progetto si è appurato che effettivamente il futuro dei mezzi di trasporto
autonomi è sempre più vicino.
4.1 Problematiche incontrate
Durante lo svolgimento di questo progetto si è dovuto, molto spesso, cambiare strategia e
metodi d'approccio a causa di tutte le problematiche riscontrate. Una delle più grandi
problematiche è stata la reperibilità del materiale e i lunghi tempi di consegna, le ruote sono
arrivate a circa un mese dell'ordine e questo ha bloccato in modo significativo l'andamento
del progetto. Un grave problema s'è riscontrato a causa del modulo SD e GPS, perché
avendo applicato uno shield per il funzionamento dei motori all'Arduino UNO, i pin restanti
non bastavano per l'utilizzo del restante, così si è dovuto acquistare un ulteriore Arduino,
l'Arduino Nano. Quest'ultimo Arduino è adibito esclusivamente al funzionamento del GPS e
della scheda SD. Ulteriori problematiche sono state incontrate durante la realizzazione del
telaio.
53