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.