Indice
Progetto finale: veicolo radiocomandato Bluetooth
Vogliamo comandare un veicolo con uno smartphone utilizzando la tecnologia Bluetooth. Il veicolo è quasi lo stesso utilizzato nel progetto finale 2014/2015 ma lo shield wireless che utilizzeremo usa il protocollo Bluetooth invece che quello ZigBee per la comunicazione via radio.
La struttura del veicolo è costituita da un telaio in plastica che supporta:
- la parte elettronica, cioè la scheda Arduino, il motor shield e lo shield Bluetooth
- la parte meccanica, cioè due motori in continua collegati alle ruote in gomma e una ruota a sfera posteriore
Il motor shield, montato sopra la scheda Arduino, permette di comandare i due motori elettrici; lo shield Bluetooth, montato sopra il motor shield, permette di stabilire una connessione seriale tra la scheda Arduino e lo smartphone. I comandi (marcia avanti, indietro, a sinistra e destra) sono inviati dal telefono con un'applicazione Android che permette di realizzare una tastiera di comando personalizzabile.
Per alimentare la scheda Arduino, i due shield e i due motori useremo quattro batterie stilo per un totale di 6 Volt.
Il risultato finale è quello mostrato nel video:
Progetto: veicolo radiocomandato Bluetooth
Scopo | realizzare un veicolo Bluetooth da comandare con uno smartphone |
---|---|
Componenti | telaio con ruote e motoriduttori, Arduino Motor Shield, Shield Bluetooth, 4 batterie stilo da 1,5 Volt |
Software | applicazione Android Bluetooth Serial Controller |
Approfondimento sull'hardware : il motor shield Arduino
Il Motor Shield Arduino si monta sopra la scheda Arduino e permette di collegare un motore elettrico alla scheda 1). Il componente principale dello shield, l'integrato L298, è in grado di comandare due motori in continua o un motore passo-passo grazie a due ponti H2). Allo shield possono essre collegati motori da 5 a 12 Volt con correnti fino a 2 Ampère.
Lo shield utilizza 8 pin della scheda Arduino; noi ne useremo solo quattro, in particolare:
funzione | pin (motore A) | pin (motore B) |
---|---|---|
direzione (avanti/indietro) | 12 | 13 |
velocità (tensione al motore) | 3 | 11 |
NB lo shield usa anche i pin A0 e A1 per misurare le correnti e i pin 8 e 9 per l'arresto rapido dei motori; se si vuole utilizzare ad altro scopo questi pin occorre tagliare i rispettivi collegamenti sul retro dello shield3).
Comandare due motori in continua è molto semplice:
- stabiliamo la direzione di marcia dei motori impostando il valore
HIGH
oLOW
sui pin 12 e 13 - regoliamo la velocità dei motori impostando un valore di tensione sui pin 3 e 11 (i due pin digitali vengono utilizzati come uscite analogiche grazie alla modulazione PWM)
Approfondimento sull'hardware : il motore in continua
In questo progetto utilizzeremo due motori in continua per muovere il veicolo perché le due ruote devono potersi muoversi in maniera indipendente - avanti e indietro e con velocità diverse - per cambiare direzione.
Le caratteristiche principali dei motori in continua sono:
- alimentazione in corrente continua (batterie o alimentatori) tramite due morsetti
- buone prestazioni a tutte le velocità
- facilità di controllo
Il motore si aziona applicando tensione e ruota a una velocità proporzionale al valore di tensione applicato. Per cambiare direzione bisogna invertire il verso la tensione.
Il movimento del motore viene trasmesso al carico - in questo caso le ruote - attraverso un albero motore. Più precisamente viene trasmessa una potenza meccanica che corrisponde al prodotto tra la velocità di rotazione e la coppia (la “spinta” ovvero qualcosa che ha un effetto simile a quello della forza nei moti rettilinei):
`P=C cdot omega`
dove P è la potenza in Watt (W), C la coppia in Newton per metro (Nm) e ω la velocità in radianti al secondo (rad/s)4).
Nel nostro caso non è possibile collegare direttamente le ruote all'albero perché i motori sono costruiti per girare molto velocemente - ad esempio a 1000 giri al minuto (rpm) - e le ruote girerebbero troppo velocemente. Per questo tra i motori montati sul telaio e le ruote è posto un riduttore, un sistema ad ingranaggi che trasmette potenza meccanica riducendo la velocità, più o meno come il cambio di un'automobile o di una bicicletta.
I due motoriduttori (motore più riduttore) montati sul telaio hanno queste caratteristiche:
tensione massima | 4,5 Volt in continua |
velocità massima senza carico | 10 rpm (giri al minuto) |
corrente senza carico | 190 mA |
corrente massima | 250 mA |
Approfondimento sull'hardware: lo shield Bluetooth
Lo shield bluetooth montato sulla scheda Arduino permette di stabilire una connessione via radio con altri dispositivi Bluetooth. Sullo shield è montato il modulo wireless RN-42 di Roving Networks, che gestisce la comunicazione Bluetooth e si interfaccia alla scheda Arduino tramite seriale. Le caratteristiche principali del modulo sono:
- versione Bluetooth 2.1 con auto-discovery e auto-pairing
- antenna on-chip, cioè realizzata direttamente sul circuito stampato del modulo5)
- range di 20 metri
- alimentazione a 3,3 Volt (già presente sulla scheda Arduino)
- basso consumo
- interfaccia seriale UART per comunicare con la scheda Arduino
Il modulo può essere configurato da PC usando il monitor seriale del software Arduino ma per il nostro utilizzo è sufficiente utilizzare il DIP_switch montato sulla scheda, impostando i quattro interruttori così:
interruttore | posizione | effetto |
---|---|---|
AUTO | ON | abilita auto-accoppiamento e auto-pairing |
DEFAULT | OFF | non resetta mai le impostazioni |
MASTER | OFF | il modulo si comporta da slave nelle connessioni Bluetooth6) |
BAUDRATE | ON | velocità della connessione impostata a 9600 baud |
Il modulo è impostato di default con un profilo Bluetooth SPP, cioè si comporta come un dispositivo in grado di realizzare una semplice connessione seriale - come quella tra scheda Arduino e PC quando si usa il monitor seriale e il cavo USB - con il dispositivo Bluetooth a cui viene accoppiato.
Approfondimento sulla trasmissione dati: lo standard Bluetooth
Il Bluetooth è uno standard wireless che sfrutta la stessa banda a 2,4 GHz del WiFi ma a differenza di quest'ultimo non serve ad accedere a reti di computer ma a collegare senza fili due o più dispositivi vicini tra loro. Il Bluetooth, nato nel 19947) e giunto oggi alla versione 4, viene usato in applicazioni audio (trasmissione suono, vivavoce, ecc.), periferiche (tastiere, mouse, controller per console), e in generale per realizzare connessioni a corto raggio dove è richiesto un basso consumo.
Le caratteristiche principali dello standard Bluetooth sono:
- basso o bassissimo consumo8)
- corto-raggio (20 metri)
- architettura di rete molto semplice: un solo dispositivo master che controlla e coordina al massimo sette dispositivi slave9)
- per ogni dispositivo un indirizzo a 48 bit e un nome associato
- connessione in tre fasi:
- discover: un dispositivo richiede nome e indirizzo di altri dispositivi nelle vicinanze
- paging: viene stabilita una connessione
- pairing: configurazione dei dispositivi per fare in modo che si connettano automaticamente quando sono vicini (si imposta un PIN, una password o altro)
- profili dei dispositivi: ai dispositivi Bluetooth è associato un profilo che specifica il tipo di dispositivo e il suo utilizzo, ad esempio SPP (Serial Port Profile) per rimpiazzare una connessione seriale via cavo, HID (Human Interface Device) per mouse, tastiere e controller, ecc.
sketch
/* Progetto finale: veicolo bluetooth radiocomandato * I due motori vengono comandati in base ai dati ricevuti via seriale: * 'a' -> avanti (i due motori vanno alla stessa velocità) * 'i' -> indietro (i due motori vanno indietro alla stessa velocità) * 'd' -> destra (motore destro più lento del sinistro) * 's' -> sinistra (motore sinistro più lento del destro) * * Nome: * Creato il: */ // pin che controllano la direzione del motore destro e sinistro // valori: HIGH = avanti, LOW = indietro int dirD = 12; int dirS = 13; // pin PWM che controllano la velocità del motore destro e sinistro // valori: da 0 (motore fermo) a 255 (massima velocità) int velD = 3; int velS = 11; // numero di byte da leggere ricevuti via seriale int numByte; // dato ricevuto dalla seriale (un byte) int byteRicevuto; void setup(){ // imposto i pin dei motori come uscite pinMode(dirD, OUTPUT); pinMode(dirS, OUTPUT); pinMode(velD, OUTPUT); pinMode(velS, OUTPUT); // imposto la comunicazione seriale Serial.begin(9600); } void loop(){ // controllo quanti byte di dati sono stati ricevuti via seriale numByte = Serial.available(); // se il numero è zero non sono stati ricevuti dati, se è uno o più // posso leggere i dati un byte per volta dal primo all'ultimo ricevuto if(numByte > 0){ // leggo un byte byteRicevuto = Serial.read(); // comando i due motori in base al carattere ricevuto da seriale: // a = avanti, i = indetro, d = destra, s = sinistra if(byteRicevuto == 'a'){ // marcia avanti digitalWrite(dirD, HIGH); digitalWrite(dirS, HIGH); analogWrite(velD, 255); analogWrite(velS, 255); } else if(byteRicevuto == 'i'){ // marcia indietro digitalWrite(dirD, LOW); digitalWrite(dirS, LOW); analogWrite(velD, 255); analogWrite(velS, 255); } else if(byteRicevuto == 'd'){ // gira a destra digitalWrite(dirD, HIGH); digitalWrite(dirS, HIGH); analogWrite(velD, 100); analogWrite(velS, 255); } else if(byteRicevuto == 's'){ // gira a sinistra digitalWrite(dirD, HIGH); digitalWrite(dirS, HIGH); analogWrite(velD, 255); analogWrite(velS, 100); } else{ // arresta i motori (dato ricevuto non valido) analogWrite(velD, 0); analogWrite(velS, 0); } } // arresta i motori se non sono stati ricevuti dati else{ analogWrite(velD, 0); analogWrite(velS, 0); } // piccolo ritardo delay(10); }
Applicazione Android
L'applicazione Bluetooth Serial Controller, scaricabile gratuitamente da Play Store, permette di realizzare un interfaccia di comando a tastiera per dispositivi Bluetooth. L'interfaccia è personalizzabile e configurabile a piacere; nel nostro caso si è scelto:
- tastierino: quattro pulsanti stile joypad
- nomi dei pulsanti: avanti, indietro, sinistra e destra
- comandi associati ai pulsanti: i caratteri “a”, “i, “s”, “d”
- intervallo di ripetizione: 10 ms (se si tiene premuto un tasto il comando viene ripetuto ogni 10 millisecondi)
Le figure seguenti mostrano il controller e la configurazione scelta:
Per utilizzare l'applicazione bisogna prima fare uno scan (pulsante a forma di lente) per individuare i dispositivi Bluetooth nelle vicinanze quindi associare il veicolo Bluetooth allo smartphone facendo il pairing con lo shield Bluetooth (il nome che compare è RNBT-266C). Quando il dispositivo è connesso (“connected to RNBT-266C”) è possibile comandare il veicolo utilizzando i quattro pulsanti. Quando si preme un pulsante:
- lo smartphone invia un comando - il testo associato al pulsante - allo shield Bluetooth
- il comando, trasmesso con una comunicazione seriale via Bluetooth, viene ricevuto dallo shield
- il comando viene inoltrato alla scheda Arduino che in base al carattere ricevuto pilota opportunamente i due motori (ad esempio: se si riceve il carattere “a” si azionano i motori destro e sinistro alla stessa velocità e nello stesso verso per produrre una marcia in avanti)
Osservazioni
- lo shield non funziona correttamente se non si collega a massa il pin analogico 2
- il ritardo di 10 millisecondi nel ciclo loop del motore serve a far funzionare correttamente il driver del motor shield
Navigazione
Torna all'indice.