Strumenti Utente

Strumenti Sito


arduino_7

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:

  • 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

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:

  • stabiliamo la direzione di marcia dei motori impostando il valore HIGH o LOW 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.

motore in continua, fonte sparkfun.com

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

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:

  • 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:

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:

  • 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

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
This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information
arduino_7.txt · Ultima modifica: 2017/03/26 23:43 da admin