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.
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.
In rete si trovano diverse guide alla piedinatura delle USB tra cui questa di usbpinout.net
Dove il pin 1 è il positivo (+5v) e il pin 5 il negativo.
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.
Prima di inserire un commento, per favore, leggi il regolamento
5 pings