Un motore DC, o motore a corrente continua, è un dispositivo che converte l'energia elettrica meccanica. Funziona applicando una corrente continua attraverso un avvolgimento o bobina all'interno del motore. Noi ne utilizzeremo 1 per ogni ruota della macchinina, per un totale di 4 motori.
Un transistor è una specie di interruttore per la corrente, noi nello specifico usiamo i transistor di tipo NPN, e ne useremo 2, dove ognuno controllare i 2 motori di un lato della macchinina, le basi dei transistor verranno alimentate o meno dai pin logici dell'Arduino Uno, cosi da poter gestire l'andamento della macchinina a seconda dei comandi.
Un diodo è un componente che rende possibile il passaggio della corrente in un solo verso, noi ne useremo 2, 1 per ognuno dei 2 circuiti, cosi da vitare il ritorno di corrente dei Motori DC, che provocherebbe il danneggiamento del transistor.
In questo circuito impiegheremo 2 resistenza da 330Ω l'una, ognuna delle 2 alla base di un transistor, cosi da evitarne il danneggiamento e poter permetterne il corretto impiego.
L'Arduino che andremo ad utilizzare non sarà originale, ma emula il funzionamento di un Arduino Nano; lo utilizzeremo per controllare i 2 pin digitali, che a loro volta controlleranno i motori della macchinina secondo le esigenze; in più sarà colui che riceverà ed elaborerà i dati ricevuti attraverso il modulo bluetooth.
L'HC-05 è il modulo bluetooth che utilizzeremo per ricevere i dati in maniera wireless, servendoci per l'appunto della comunicazione bluetooth seriale.
Avendo a disposizione 4 motori comandabili singolarmente, abbiamo deciso di dividerli in sezioni per lato (destra e sinistra), cosi che potessimo alimentare entrambi i lati insieme, oppure uno per volta; facendo ciò possiamo controllare il movimento della macchinina, attraverso i 3 principali movimenti:
Per il controllo della macchinina da remoto, abbiamo pensato ad un controller molto semplice, sia con GUI, che con acquisizione di tasti; il tutto doveva semplicemente fare da tramite tra User e macchinina.
Per quanta riguarda il linguaggio di programmazione, la nostra prima scelta era java, in quanto argomento del nostro anno scolastico; però dopo esserci resi conto della complessità di tale linguaggio per gestire la comunicazione bluetooth abbiamo deciso di provare altri linguaggi; siamo arrivati ad una soluzione, ovvero Python, e all'utilizzo della sua libreria “PySerial”, che permette di comunicare in maniera seriale attraverso una porta “COM” del pc da noi specificata; tutto ciò ha reso la realizzazione (lato software) del progetto molto più semplice.
Abbiamo cercato di rendere la comunicazione di dati tra controller ed Arduino la più comprensibile possibile, per far ciò abbiamo creato una specie di protocollo tra Master e Slave, dove:
| DATO INVIATO | ISTRUZIONE |
|---|---|
| 1 | Fermo |
| 2 | Avanti |
| 3 | Destra |
| 4 | Sinistra |
Per il codice sono state proposte più versioni, dove le prime presentavano un'interfaccia grafica abbozzata, mentre la definita utilizza una funzione per eseguire determinate istruzioni dipendentemente dal tasto che viene premuto (sulla tastiera), e logicamente noi abbiamo collegato i già canonici “wasd”, con anche i caratteri “q” ed “e” per altre opzioni, le istruzioni poi utilizzavano dei metodi di “PySerial”, che avviavano il trasferimento seriale di dati via bluetooth.
Prototipi e codice definitivo:
Prima prova di controller:
Prima sperimentazione comunicazione seriale:
Codice definitivo:
Come detto prima, per le varie istruzioni abbiamo adottato un “protocollo” molto semplice, quindi logicamente nel nostro arduino, all'arrivo del dato di valore “2”, che stava ad indicare l'istruzione “avanti”, venivano rilasciati valore di tensione “HIGH” nei digitalPin predestinati alla gestione dei motori, la stessa regola è stata applicati per le altre istruzioni, cosi mescolando la logica dei movimenti base e la logica delle istruzioni, siamo riusciti a ricavare il programma “Slave” dall'arduino.
Servendoci dell'IDE Arduino, abbiamo sviluppato il codice per la gestione dei pin digitali:
#include <avr/wdt.h>
#include <SoftwareSerial.h>
#define VCCBLU 12 //pin per hc05
#define GNDBLU 11
SoftwareSerial mySerial(10, 9);
//pin dei motori
//dietro sinista
#define DX 10
#define SX 11
void setup() {
Serial.begin(9600); // inizializza la comunicazione seriale a 9600 bps
mySerial.begin(9600); //creo la mia seriale digitale
pinMode(VCCBLU, OUTPUT);
pinMode(GNDBLU, OUTPUT);
digitalWrite(VCCBLU, HIGH); //accendo hc05
digitalWrite(GNDBLU, LOW);
while (!Serial) { ; } //attendo che si stabilisca la connessione
wdt_enable(WDTO_1S);
//setto i pin dei motiri come output
pinMode(DX, OUTPUT);
pinMode(SX, OUTPUT);
}
void loop() {
wdt_reset();
if (mySerial.available() > 0) { // se ci sono dati disponibili sulla seriale
char incomingByte = mySerial.read(); // leggi un carattere dalla seriale
if (incomingByte == '2') { // se il carattere ricevuto è '2'
avanti(); //tutti accesi
delay(200);
wdt_reset();
spenti(); //tutti i motori spenti
} else if (incomingByte == '1') {
spenti(); //motori spenti
wdt_reset();
} else if (incomingByte == '3') {
destra(); //motori destra
delay(200);
wdt_reset();
spenti(); //motori spenti
} else if (incomingByte == '4') {
sinistra(); //motori sinistra
delay(200);
wdt_reset();
spenti(); //motori spenti
} else {
spenti(); //motori spenti
wdt_reset();
}
}
while (mySerial.available() > 0) { //pulisco la seriale
wdt_reset();
char incomingByte = mySerial.read();
}
}
void avanti() {
digitalWrite(SX, HIGH);
digitalWrite(DX, HIGH);
return;
}
void sinistra() {
digitalWrite(SX, LOW);
digitalWrite(DX, HIGH);
return;
}
void destra() {
digitalWrite(SX, HIGH);
digitalWrite(DX, LOW);
return;
}
void spenti() {
digitalWrite(SX, LOW);
digitalWrite(DX, LOW);
return;
}
All'inizio abbiamo trovato molti problemi nella corretta interpretazione dei dati ricevuti dal programma Python, e ciò causava un loop infinito all'interno del nostro software arduino, perciò come prima cosa abbiamo implementato la libreria “avr/wdt.h”, che ci permette di resettare l'arduino e farlo ripartire ogni qualvolta il timer (impostato da noi) si azzerasse, cosi da impossibilitare l'evento di loop infiniti; infine, dopo svariati test abbiamo capito che il vero problema risedeva nei troppi dati ricevuti, e ciò portava ad un rallentamento considerevole del programma nel passare da un' istruzione ad un'altra, perciò dopo qualsiasi istruzione eseguita, abbiamo messo un loop di while che ritornasse alla fine dei dati seriali, cosi da rendere il programma pronto all' ultima istruzione ricevuta
while (mySerial.available() > 0) { //pulisco la seriale
wdt_reset();
char incomingByte = mySerial.read();
}
Prima di creare il nostro circuito nell'effettivo, lo abbiamo realizzato su Tinkercad per testarlo, e verificarne il funzionamento.
Dopo aver creato i progetto in formato digitale, lo abbiamo realizzato su millefori, creando i corretti collegamenti tra i vari componenti; grazie alle ore di laboratorio siamo riusciti a usare il saldatore per lo stagno, cosi da rendere più sicuro il tutto.
Insieme al prof, dopo aver realizzato il circuito, lo abbiamo testato, con risultati positivi in laboratorio, grazie ad un generatore di tensione in continua a 5V, come ci aspettavamo infatti, al collegamento della base del transistor al collegamento positivo i 2 motori si azionavano.
Come detto prima nella sezione del “Diodo”, abbiamo accennato ad un ritorno di corrente, una criticità del circuito che ci ha dato molti problemi; infatti quando andavamo a spegnere il Motore DC questo causava un ritorno di corrente, che finiva per bruciare il transistor, danneggiando irreparabilmente il circuito.
Dopo esserci resi conto di questo problema abbiamo installato un diodo tra il collegamento positivo e negativo del motore DC, cosi da rendere impossibile questo ritorno di corrente.
Un problema di cui tener conto è il peso della macchinina relativamente alla potenza sprigionata dai motori.
Per questo abbiamo deciso di avere una batteria dedicata per ogni coppia di motori, cosi da acquisire peso con la batteria supplementare, ma da poterlo sostenere grazie alla maggiore potenza sprigionabile.
Ovviamente anche la scocca della macchinina giocava un ruolo fondamentale per la realizzazione del progetto.
Abbiamo confrontato più materiali diversi tra di loro, ma le due opzioni più gettonate sono state alluminio (semplici lattine) e semplice cartone, inizialmente eravamo più orientati verso l'alluminio che alla fine si rivelo proprio la nostra scelta, utilizzando una lattina come scocca per la macchinina.
Il gruppo è stato molto produttivo durante la realizzazione del progetto, rispondendo in maniera positiva ai vari tentativi falliti, e non perdendo mai la motivazione; il risultato ottenuto non è all'altezza delle aspettative iniziali ma siamo comunque fieri di un lavoro completo, che abbia soddisfatto i requisiti fondamentali che ci siamo posti. Il saper lavorare in gruppo è stato fondamentale per il completamento del progetto, un nostro grande punto di forza è certamente stato la divisione dei lavori, in maniera che ognuno fosse partecipe al progetto, e la comunicazione tra i membri del gruppo.
Fai pratica con il nostro simulatore online. Con una grafica ultra realistica e i comandi accurati, è utilizzato anche dai nostri piloti per esercitarsi e ha permesso di migliorare le capacità fisiche e mentali in modo da vincere ogni gara.