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.

vista inferiore del telaio: motori, riduttori, ruote e cavi di alimentazione

La struttura del veicolo è costituita da un telaio in plastica che supporta:

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

Arduino Motor Shield R3

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) 311

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:

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.

motore in continua, fonte sparkfun.com

Le caratteristiche principali dei motori in continua sono:

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

Shield Bluetooth con modulo RN-42

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:

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:

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:

Le figure seguenti mostrano il controller e la configurazione scelta:

applicazione Android: tastiera di comando impostazioni applicazione Android: caratteri da inviare impostazioni applicazione Android: ripetizione comandi

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:

Osservazioni

Torna all'indice.

1)
la scheda Arduino non è in grado di fornire correnti sufficientemente elevate per pilotare un motore
2)
il ponte H è una configurazione circuitale dove quattro transisor, usati come interruttori, vengono aperti e chiusi a coppie alternando tensione nulla e piena tensione per regolare direzione e velocità di un motore
3)
nel nostro caso i pin per la frenatura non sono utilizzati nel programma e risultano scollegati (di default i pin sono impostati come ingressi ad alta impedenza); nello shield invece una resistenza di pull-down disabilita l'arresto rapido
4)
spesso la velocità è espressa in giri al minuto (rpm) anche se non è l'unità di misura prevista dal Sistema Internazionale
5)
è la serpentina che si vede a sinistra nel modulo
6)
il cellulare che comanda il veicolo sarà il master
7)
inizialmente presentato da Ericsson per collegare auricolari senza fili
8)
nel caso dei dispositivi BLE (Bluetooth Low Energy) anche mesi di autonomia con una carica della batteria
9)
il master controlla gli slave e stabilisce e coordina le connessioni; gli slave “parlano” solo col master