Simulatore di guda - Istituto di Istruzione Superiore "Aldo Moro"

Transcript

Simulatore di guda - Istituto di Istruzione Superiore "Aldo Moro"
SIMULATORE DI GUIDA
E’ stato mio desiderio, costruire al meglio un simulatore di guida che si avvicinasse
maggiormente a come i veri piloti affrontano la guida di una vettura monoposto
sportiva.
Dopo varie prove e modifiche della carenatura, realizzata con materiale di recupero,
mi consentono di risolvere alcune problematiche e di rendere l’esperienza al volante
più godibile e completa.
Ho cercato di realizzare una vettura (simulata) funzionale, spendendo il meno
possibile.
Per realizzare il progetto ho utilizzato un joipa per x box 360, trasformandolo
successivamente in un simulatore di guida. Nella figura 1 possiamo notare il joipad
originale.
Il simulatore per funzionare necessita di una scheda madre.
Ho utilizzato quella del joipad adattandola meccanicamente ed elettricamente alla
struttura del simulatore.
Figura 2
Spiegazione caratteristiche del simulatore
Il volante: deve avere una inclinazione non troppo bassa e non troppo alta,
viene fissato in modo da essere confortevole e maneggevole, per una giusta
impugnatura. La scelta del volante e stata caratterizzata dalla grandezza totale del
simulatore. Il volante per funzionare con la scheda elettronica e stato collegato
tramite un albero rotante, in asse, con un potenziometro angolare, avendo un angolo
di rotazione totale di 180°, però per funzionare ed adattarsi al volante, il
potenziometro e stato posizionato a metà della sua corsa; 0° a -90° per sinistra, da
0° a 90° per la detra. .
la scheda originariamente funzionava con un potenziometro angolare di 60° di 10 hom
Il potenziometro viene registrato con il volante a metà corsa, per indicare alla scheda
che il veicolo andrà in direzione diritta.
Nell'immagine di sinistra in figura 1, viene illustrato il joystick quello originale dell'
controller. Come si possono notare nella figura, la struttura metallica è munita da 2
potenziometri angolari di 60°.
Soltanto uno potenziometro è stato sostituito, ciò è quello che permette il movimento
di destra e sinistra.
Mentre nella figura 2 si può vedere il potenziometro angolare di 180° che sono andato
a sostituire, aggiungendo alla piastra di base 3 fili che mi permettono di posizionarlo
nella zona desiderata.
Pedaliera: E stata recuperata da un simulatore di una vecchia consolle,
successivamente è stata modificata e adattata alla piastra del controller tramite dei fil
elettrici.
La scheda originariamente funzionava con un potenziometro angolare di 60°, il
pulsante per azionarlo era a forma di grilletto. Ora e stato sostituito con potenziometri
di rotazione da 180°.
A differenza del volante i potenziometri della pedaliera sono registrati, a inizio corsa
con l'angolo di 0° gradi, a fine corsa quando e tutto accelerato o tutto frenato di
180°.
Nella figura 1 viene illustrato il joypad originale, mentre la figura 2 rappresenta il
potenziometro di 90°, che possiamo trovare all interno dei due grilletti.
Nella figura 3 viene illustrata la pedaliera, mentre nella figura 4 rappresenta i 2
potenziometri da 180°. Ogni pedale ne possiede 1.
Tra i problemi più frequenti c’è senza dubbio quello relativo al fissaggio della
pedaliera: gommini, tappetini in gomma e altre soluzioni comunemente adottate sono
utili a non far scivolare del tutto i pedali.
In futuro ho intenzione di sostituire completamente la pedaliera costruendone una in
acciaio.
Cambio sequenziale: Funziona tramite un tubo curvo raccordato con un angolo di 90°.
Il suo funzionamento e quello di inserire o disinserire le marce del veicolo virtuale,
oppure cambiando i sui comandi tramite le impostazioni del gioco utilizzato, può
essere usato da freno a mano.
Esso funziona tramite due pulsanti, che da un segnale quando si tira la leva oppure si
spinge. I pulsanti sono anche utilizzati per segnare la rivelazione delle marche alla
scheda Arduino, che scrive il numero della marcia corrispondente sul display lad.
L’altezza del monitor: se posto sullo stesso piano al quale è agganciato il volante,
generalmente richiede di abbassare lievemente lo sguardo, a meno che la stessa base
del monitor non sia di dimensioni generose. Nella realtà, alla guida di una vettura, lo
sguardo del conducente punta diritto di fronte a sé: anche in questo caso, una
postazione di guida può consentire di ottimizzare l’altezza del monitor svincolandola
da quella a cui è posto il volante.
Altezza da terra: non riferite, in questo caso, ad esigenze di abbassamento del
baricentro ovviamente, bensì al rapporto tra altezza della sedia e della struttura, che
determina posizione e inclinazione di braccia, gambe, polsi e caviglie. La postura del
pilota cambia sensibilmente, in particolare intervenendo sull'inclinazione di polsi e
caviglie.
La pulsantiera:
Come tutti i veicoli da corsa sono muniti di pulsantiera per le varie verifiche del
corretto funzionamento del motore e della strumentazione elettrica, come l'accensione
del veicolo.
ho usato l'immaginazione sostituendo i pulsanti del joipado rimanenti, in una semplice
e elegante pulsantiera di comando.
Grazie ad essa riesco a comandare tutto senza alcuna difficoltà; ad esempio durante
la schermata principale, per le impostazione generali, nei menù e per l' impostazione
della visuale ecc...
I pulsanti originariamente nella scheda madre, funzionavano tramite il contatto di un
gommino a molla (pulsante monostabile), ricoperto da polvere di graffite, utilizzato
per il contatto di chiusura del circuito. Grazie ad una lima ho rimosso la polvere di
graffite sulla scheda e ho saldato alle due estremità due fili, utilizzando un saldatore a
stagno, dopo di che, ai capi dei fili, ho saldato dei pulsanti mono stabili, come si
possono vedere in figura i 4 pulsanti rossi.
Ho deciso di aggiungere una chiave stacca batteria, per il semplice fatto che rendesse
la pulsantiera più appetibile e che si avvicinasse il più possibile alla realtà. Potrà
essere utilizzata in futuro anche per dei nuovi comandi.
La scelta dei materiali
Questa scelta è influenzata dal genere di postazione che si intende realizzare: deve
essere scomponibile, pieghevole, personalizzabile e poco costosi.
Possono richiedere lavorazioni complesse quali perforazioni o saldature. Il
costo di giunti e tubolari necessario si attesta intorno ai 80 euro.
Il fenomeno osservato fa emergere che la realizzazione del simulatore comporta varie
prove e modifiche nel corso dell’assemblaggio dei vari materiali. Prima della
realizzazione della struttura è stato necessario una verifica del funzionamento dei vari
componenti seguita successivamente dall’assemblaggio
Elenco materiali meccanici:
2 tubolari 128 cm diametro 6.5 cm
1 scatolato 2x2 cm
4 tappi in plastica
1 tubolare diametro 12 lunghezza 27 cm
1 boccola di alluminio diametro 10, lunghezza 3 cm
1 boccola di plastica diametro 10, lunghezza 4
1 cuscinetto volvente
1 alberino con estremità millerighe diametro 6, lunghezza 43 cm
2 supporti in plastica ( per sostenere l’albero e il pignone del volante)
2 lamierini lunghezza 0,5 mm, spessore 2 mm
1 staffa da palestra, che successivamente verrà modificato per adattarsi
adeguatamente alla struttura, successivamente avremo i dettagli illustrati.
1 Sedile racing: quelli la cui omologazione è scaduta possono essere acquistati
(ancora in ottime condizioni) a circa 150 euro. In alternativa si può utilizzare altro
sedile la cui seduta non superi i 25 cm in altezza.
Viti e bulloni di vario diametro
2 molle
Pellicola di rivestimento.
Vernice nera.
Elenco materiali elettronici:
6 pulsanti monoposizione
4 led rossi;
1 led giallo,
1 display numerico a led;
1 interruttore stacca batterie;
1 scheda Arduino fornita di programma per il funzionamento dei vari componenti
elettronici (i programmi verranno illustrati successivamente);
1 contagiri motore;
4 potenziometri angolari di cui 2 sono in serie;
1 controller per xbox 360 (utilizzato come scheda principale per dirigere tutto il
simulatore e modificato per adattarsi alla struttura);
15 resistenze;
fili elettrici di varie lunghezze recuperati da vecchi strumenti elettronici;
contenitore in alluminio recuperato da un trasformatore pc;
Attrezzi utilizzati:
sega da metallo
punte da foratura
trapano
cacciavite a croce/ taglio
martello
pinze
set di chiavi inglese
saldatore a elettrodi
saldatore a stagno
piegatrice
bilanciere
tornio
morsa
varie lime di diversa rugosità
Arduino
Il programma che viene usato per Arduino si chiama arduino.exe, ed e il sito ufficiale della
piattaforma.
Ho deciso di utilizzare la scheda Arduino per il semplice motivo che la trovo molto
semplice da utilizzare e programmare , adatta per i miei progetti.
Per il simulatore ho deciso di creare un rivelatore di posizione delle marce tramite un
display lad.
Nella figura e raffigurato un esperimento per controllare il display tramite Arduino.
Accenno di come è strutturato il programma
La struttura base del linguaggio di programmazione di Arduino si sviluppa sulla definizione
di due funzioni:
void setup() e void loop().
Queste due funzioni racchiuderanno le necessarie impostazioni per il funzionamento dei
dispositivi collegati con Arduino e i blocchi di istruzioni per svolgere quanto richiesto.
void setup( )
La funzione setup( ) è la prima ad essere chiamata quando parte uno sketch.
Viene utilizzata per inizializzare variabili, per impostare lo stato dei pin, per far partire le
librerie da usare, per l'impostazione delle comunicazioni seriali.
La funzione di setup() sarà la prima ad essere eseguita dopo ogni accensione o reset di
Arduino.
Sintassi
void setup( ){
// istruzioni varie;
}
Esempio
int pulsante=3;
void setup( ){
Serial.begin(9600);
pinMode(pulsante,OUTPUT);
}
in questo esempio si impostata la velocità di comunicazione seriale con il computer a 9600
bit per secondo (baud) che serve per poter visualizzare sul PC tramite il Serial Monitor
(funzionante solo quando Arduino è collegato al computer) l'esito di operazioni volute e il
pin 3 impostato come OUTPUT.
void loop( )
Dopo la creazione della funzione setup(), che inizializza e imposta i valori iniziali, la
funzione loop() fa proprio quanto suggerisce il proprio nome eseguendo ciclicamente il
programma definito al suo interno.
Permette l'esecuzione del programma, interagisce con la scheda Arduino.
Sintassi
void loop( ){
// istruzioni da ripetere in modo ricorsivo;
}
Esempio
void loop( ){
digitalWrite(3, HIGH); // metti il pin 3 allo stato alto
delay(1000); // mantieni questo stato per 1 secondo
digitalWrite(3, LOW); // metti il pin 3 allo stato basso
delay(1000); // mantieni questo stato per un secondo
}
Sintassi
; punto e virgola
Il punto e virgola ( ; ) deve essere inserito alla fine di un'istruzione e per separare gli
elementi del programma.
Il ; è anche utilizzato per separare gli elementi di un ciclo for.
Dimenticare ; al termine di un'istruzione darà errore di compilazione. L'errore nella
digitazione del testo è normale, trovare un errore è complicato. Quando si rileva un errore
nella compilazione prima tra tutte le cose conviene verificare se c'è stata l'omissione del ;
Le parentesi graffe { }
Un blocco di istruzioni è un gruppo di istruzioni racchiuso entro parentesi graffe { }.
La differenza tra blocco di istruzioni e gruppo di istruzioni è che il blocco crea un ambito
locale per le istruzioni che contiene per cui in un blocco si posso dichiarare e impiegare
variabili locali che cessano di esistere al termine dell'esecuzione del blocco stesso.
Ogni istruzione interna al blocco stesso viene eseguita in sequenza.
Le parentesi graffe { } quindi definiscono l'inizio e la fine di un blocco di istruzioni e
funzioni.
Ad una parentesi che si apre deve corrisponderne la chiusura. Lo sbilanciamento delle
parentesi è spesso motivo di criticità del codice di un programma grande e quindi errore di
compilazione del codice scritto.
L'ambiente di sviluppo della programmazione di Arduino include caratteristiche specifiche
di ricerca di bilanciamento delle parentesi. Se si seleziona una parentesi o si clicca su un
punto immediatamente successivo alla parentesi, l'ambiente di sviluppo individua la
parentesi abbinata.
Quando il cursore si ferma subito una parentesi viene evidenziata la parentesi
corrispondente.
Come
Commenti
I commenti rappresentano del testo che viene ignorato dal programma e vengono utilizzati
per descrivere il codice o per aiutare a comprendere parti di programma.
Blocco di commenti /* …. */
Un blocco di commenti inizia con /* e termina con i simboli */
Tra questi simboli posso commentare il codice che sviluppo senza che in fase di
compilazione venga occupata memoria. Questi commenti vengono ignorati.
Linea di commento //
Quando si vuole commentare solo una linea si utilizzano le doppie //
// linea di commento
Le linee singole di commento vengono spesso usate dopo un'istruzione per fornire più
informazioni relativamente a quanto serva l'istruzione per poterlo ricordare anche in
seguito
Programmazione per i display e conta giri
Programma con Arduino
// accensione led
int r1=2;
int r2=3;
int r3=4;
int r4=5;
int ra=6;
int rb=7;
int rc=8;
int rd=9;
int marcia=0;
int pc=0;
void setup() {
Serial.begin(9600);
pinMode(r1, OUTPUT); //INIZZIALIZZO IL PIN rosso COME OUTPUT.
pinMode(r2, OUTPUT);
pinMode(r3, OUTPUT);
pinMode(r4, OUTPUT);
pinMode(ra, OUTPUT); //INIZZIALIZZO IL PIN rosso COME OUTPUT.
pinMode(rb, OUTPUT);
pinMode(rc, OUTPUT);
pinMode(rd, OUTPUT);
pinMode(A0, INPUT); // inizializzo il pin A1 come input.
digitalWrite(A0, HIGH); //pullup del pin A1, stato HIGH
pinMode(A1, INPUT); // inizializzo il pin A2 come input.
digitalWrite(A1, HIGH); //pullup del pin A1, stato HIGH
}
//----------------------------------------------------------------------------------------------------------------// la rutine loop gira all'infinito:
void loop() {
if (digitalRead(A0) == HIGH && digitalRead(A1) == HIGH ) {//ferma il ciclo se non viene
rilasciato il pulsante
pc=1;
}
if (digitalRead(A0) == LOW && pc==1) {// legge lo stato di A0
marcia = marcia +1;
pc=0;
}
if (digitalRead(A1) == LOW && pc==1) {// legge lo stato di A1
marcia = marcia -1;
pc=0;
}
if (marcia > 6) {
marcia = 6;
}
if (marcia < -1) {
marcia = -1;
}
// SCRITTURA N°R
if (marcia == -1) {
digitalWrite(r1, HIGH);
digitalWrite(r2, HIGH);
digitalWrite(r3, HIGH);
digitalWrite(r4, LOW);
digitalWrite(ra, HIGH);
digitalWrite(rb, HIGH);
digitalWrite(rc, HIGH);
digitalWrite(rd, LOW);
}
// SCRITTURA N°F
if (marcia == 0) {
digitalWrite(r1, HIGH);
digitalWrite(r2, LOW);
digitalWrite(r3, LOW);
digitalWrite(r4, LOW);
digitalWrite(ra, HIGH);
digitalWrite(rb, HIGH);
digitalWrite(rc, HIGH);
digitalWrite(rd, LOW);
}
// SCRITTURA N°1
if (marcia == 1) {
digitalWrite(r1, LOW);
digitalWrite(r2, HIGH);
digitalWrite(r3, HIGH);
digitalWrite(r4, LOW);
digitalWrite(ra, LOW);
digitalWrite(rb, LOW);
digitalWrite(rc, LOW);
digitalWrite(rd, LOW);
}
// SCRITTURA N°2
if (marcia == 2) {
digitalWrite(r1, HIGH);
digitalWrite(r2, HIGH);
digitalWrite(r3, LOW);
digitalWrite(r4, LOW);
digitalWrite(ra, LOW);
digitalWrite(rb, HIGH);
digitalWrite(rc, HIGH);
digitalWrite(rd, HIGH);
}
// SCRITTURA N°3
if (marcia == 3) {
digitalWrite(r1, HIGH);
digitalWrite(r2, HIGH);
digitalWrite(r3, HIGH);
digitalWrite(r4, LOW);
digitalWrite(ra, LOW);
digitalWrite(rb, HIGH);
digitalWrite(rc, LOW);
digitalWrite(rd, HIGH);
}
// SCRITTURA N°4
if (marcia == 4) {
digitalWrite(r1, LOW);
digitalWrite(r2, HIGH);
digitalWrite(r3, HIGH);
digitalWrite(r4, LOW);
digitalWrite(ra, HIGH);
digitalWrite(rb, HIGH);
digitalWrite(rc, LOW);
digitalWrite(rd, LOW);
}
// SCRITTURA N°5
if (marcia == 5) {
digitalWrite(r1, HIGH);
digitalWrite(r2, LOW);
digitalWrite(r3, HIGH);
digitalWrite(r4, LOW);
digitalWrite(ra, HIGH);
digitalWrite(rb, HIGH);
digitalWrite(rc, LOW);
digitalWrite(rd, HIGH);
}
// SCRITTURA N°6
if (marcia == 6) {
digitalWrite(r1, HIGH);
digitalWrite(r2, LOW);
digitalWrite(r3, HIGH);
digitalWrite(r4, LOW);
digitalWrite(ra, HIGH);
digitalWrite(rb, HIGH);
digitalWrite(rc, HIGH);
digitalWrite(rd, HIGH);
}
}
Ho trovato questa esperienza di progettazione molto utile e divertente.
Spero molto che in futuro, se me lo permetteranno, cercherò di inventare e costruire
nuovi progetti, specialmente nel settore automobilistico.