«

»

Mar 19

Stampa Articolo

Rover 5 BT: sketch e test

Rover 5 bluetooth

Nei post precedenti vi ho presentato il primo assemblaggio e il programma di controllo C# del Rover 5 Bluetooth e oggi finalmente vedremo lo sketch Arduino e il test all’aperto.

Il codice per Arduino in realtà è molto semplice in quanto non ho montato sensori o servi quindi il programma non deve fare altro che leggere la porta seriale del socket bluetooth e comandare i motori.

I comandi del Rover 5 bluetooth

Per semplificare la comunicazione ho previsto 8 comandi per il movimento e 2 per un eventuale servo.
Ogni carattere ricevuto sulla seriale corrisponde ad un comando dove veloce corrisponde alla massima velocità dei motori, normale (circa meta del massimo) e lento (il minimo per garantire mobilità al rover):

  • G – Avanti veloce
  • F – Avanti normale
  • f – Avanti lento
  • N – Indietro veloce
  • B – Avanti normale
  • b – Avanti lento
  • K – Sinistra veloce
  • L – Sinistra normale
  • l – Sinistra lento
  • E – Destra veloce
  • R – Destra normale
  • r – Destra lento
  • U – Servo su
  • D – Servo giù

In origine avevo previsto di utilizzare una piccola webcam facilmente montabile su una squadretta per servi ma si è rivelata incompatibile con lo streaming e quindi ho utilizzato una classica Logitech C170 che però richiede qualche studio per essere mossa in verticale. Sarebbe utile anche una lente aggiuntiva grandangolare per migliorare la visibilità o un posizionamento diverso più in alto e arretrato ma mi sembra che risulti troppo esposta. Il video onboard è stato realizzato con GoPro (per fortuna) e senza il router montato. Nelle foto potete vedere la disposizione dei componenti.

Un paio di note a proposito dei vari fissaggi. Tutte le viti e colonnine sono provviste di ranelle in quanto il lexan utilizzato è relativamente delicato quindi tende a creparsi. Il vantaggio è che è facilmente tagliabile con il metodo del vetro. Basta incidere la forma desiderata e con un po’ di attenzione si riesce a rompere lungo queste linee proprio come il vetro. Angoli e spigoli vanno quindi rifiniti per ovvi motivi di sicurezza, sia vostra che dei cavi.
Il router è invece fissato con velcro 3M Dual Lock che si trova in strisce o pretagliato come quello dei telepass.

Rover 5 bluetooth

L’alimentazione del Rover 5 bluetooth

L’assemblaggio attuale prevede 2 batterie separate per arduino e router. Per quest’ultimo ho scelto una batteria 9V alloggiata in un portabatterie modificato con un regolatore di tensione, un 7805, e un cavo Mini USB B realizzato collegando solo i poli dell’alimentazione.

Rover 5 bluetooth

In rete si trovano diverse guide alla piedinatura delle USB tra cui questa di usbpinout.net

mini-usb-b-pinout

Dove il pin 1 è il positivo (+5v) e il pin 5 il negativo.

ATTENZIONE: questo tipo di connessione, se errato, rischia di bruciare il vostro router. Fate tutti i controlli del caso, doppi e tripli, verificando la correttezza dei collegamenti con un tester e confrontando i risultati con un cavo funzionante e sicuro prima di collegare il vostro.

Lo sketch Arduino

Vediamo ora il programma Arduino:

// M2
int E_DX=5; 
int M_DX=4;

// M1
int E_SX=6;
int M_SX=7;

#define VELOCITA_ALTA 255
#define VELOCITA_NORMALE 130
#define VELOCITA_BASSA 100

int val;

void setup()
{
  pinMode(M_DX,OUTPUT);
  pinMode(M_SX,OUTPUT); 
  fermo();

  Serial1.begin(9600);
}

void loop()
{
  val=Serial1.read();
  if(val!=-1)
    switch(val)
    {
    case 'S':
    default:
      fermo();
      break;

    case 'G':
      avanti(VELOCITA_ALTA);
      break;

    case 'N':
      indietro(VELOCITA_ALTA);
      break;

    case 'K':
      sinistra(VELOCITA_ALTA);
      break;

    case 'E':
      destra(VELOCITA_ALTA);
      break;

    case 'F':
      avanti(VELOCITA_NORMALE);
      break;

    case 'f':
      avanti(VELOCITA_BASSA);
      break;

    case 'B':
      indietro(VELOCITA_NORMALE);
      break;

    case 'b':
      indietro(VELOCITA_BASSA);
      break;

    case 'L':
      sinistra(VELOCITA_NORMALE);
      break;

    case 'l':
      sinistra(VELOCITA_BASSA);
      break;

    case 'R':
      destra(VELOCITA_NORMALE);
      break;

    case 'r':
      destra(VELOCITA_BASSA);
      break;

    case 'U':
      // Camera Su
      break;

    case 'D':
      // Camera Giu
      break;
    }
}

void fermo()
{
  analogWrite(E_DX,0);
  analogWrite(E_SX,0);
}

void avanti(int velocita)
{
  digitalWrite(M_DX,HIGH);
  digitalWrite(M_SX,HIGH);  

  analogWrite(E_DX,velocita);
  analogWrite(E_SX,velocita);
}

void indietro(int velocita)
{
  digitalWrite(M_DX,LOW);
  digitalWrite(M_SX,LOW);  

  analogWrite(E_DX,velocita);
  analogWrite(E_SX,velocita);
}

void destra(int velocita)
{
  digitalWrite(M_DX,HIGH);
  digitalWrite(M_SX,LOW);  

  analogWrite(E_DX,velocita);
  analogWrite(E_SX,velocita);
}

void sinistra(int velocita)
{
  digitalWrite(M_DX,LOW);
  digitalWrite(M_SX,HIGH);  

  analogWrite(E_DX,velocita);
  analogWrite(E_SX,velocita);
}

Nelle prime righe troviamo le definizioni delle variabili per i pin utilizzati dal motor shield e le costanti per definire le 3 velocità dei motori.
Nel setup abbiamo l’inizializzazione dei pin M_DX e M_SX utilizzati per comunicare allo shield la direzione dei motori.
Subito dopo viene chiamata la funzione fermo() che, come dice il nome, imposta a zero la velocità del rover.

Alla riga 21 c’è l’inizializzazione della seriale 1, dedicata al socket xbee. Il baudrate deve essere quello settato sul modulo, nel mio caso è 9600 di default.

Nel loop non viene fatto altro che leggere e interpretare il valore di questa seriale.
L’istruzione switch permette di elencare i valori possibili di una variabile evitando di utilizzare if nidificate che renderebbero complicato e “brutto” il codice.

Dalla riga 93 troviamo la definizione delle funzioni per impostare la direzione dove il valore HIGH o LOW sui pin M indentifica la direzione e i valori da 0 a 255 sui pin E la velocità.

Questo, per il momento, è tutto. Nel prossimo post vi illustrerò la procedura per comandare questo Rover da un device Android.

Permalink link a questo articolo: http://www.mauroalfieri.it/informatica/rover-5-bluethoot-sketch-e-test.html

5 comments

Vai al modulo dei commenti

  1. ankamacha

    Ciao Mauro, complimenti davvero per gli ottimi articoli sempre molto interessanti!

    Conosco da circa 2 anni la piattaforma Arduino e davvero mi ha aperto un mondo davanti!

    Con Arduino ho implementato una stazione meteo che puoi vedere sul mio sito segnalato, e il monitoraggio dell’ impianto fotovoltaico di casa. Passo tutti i dati ad un database mysql e a dei grafici in tempo reale. In futuro grazie principalmente ai tuoi articoli proverò a realizzare un mezzo cingolato come descritto benissimo in queste pagine.

    Grazie ancora
    A presto!

    Luca Serafini
    ankamacha staff

    http://ankamacha.altervista.org/index.html

    1. Mauro Alfieri

      Ciao Luca,
      se ti va di postare tutto il progetto in una serie di articoli con le spiegazioni di sketch pagine web e tabelle MySql il blog è a disposizione e sono certo che tanti appassionati come te e me ne sarebbero felici.

  2. Luca

    Ciao Mauro, certo ottima idea! Appena troverò un pò di tempo scriverò con grande piacere una guida passo passo per la realizzazione di una stazione meteo simile alla mia. E’ anche un utile modo per fare ordine tra i miei tanti appunti sparsi ovunque!

    Ciao a presto e continua cosi vai forte!

    Luca
    http://ankamacha.altervista.org/index.html

  3. Maurizio

    Ciao Mauro, vorrei sapere come funziona la webcam…
    Come l’hai collegata e dove visualizzo le immagini ?
    Grazie

    1. Mauro Alfieri

      Ciao Maurizio,
      hai già letto gli altri articoli dedicati al Rover 5 BT?
      Bruno l’ha descritto negli articoli precedenti in modo dettagliato.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>