Nella prima versione della stazione di comando del robot LittleBOT questo era stata realizzata con l’utilizzo di una scheda Arduino Esplora.
Con la disponibilità degli smartphone e soprattutto di specifiche APP di controllo del robot ha portato alla possibilità di creare una speciale interfaccia di comando.
Come visibile sotto l’interfaccia permette sia il completo comando del robot sia la lettura dei dati di telemetria forniti dai sensori presenti sul robot.
Indice
Prima stazione di controllo del robot
Nella prima versione del robot, la stazione di controllo era basata sulla scheda Arduino Esplora, opportunamente integrata con un modulo Bluetooth.
Dotazione del robot
La scheda di controllo del robot è dotata di un modulo bluetooth tipo HC-05, il modulo è facilmente riconosciuto dagli attuali smartphone
Controllo tramite APP Bluetooh Electronics
Per il controllo si utilizza una APP chiamata Bluetooh Electronics, realizzata dalla from KEUWLSOFT, che permette di comandare, tramite il proprio dispositivo Android, il robot su cui è installato un modulo Bluetooth HC-05 o HC-06.
Sono disponibili una vasta scelta di controlli raggruppati in 9 diversi tipi: testi, pulsanti, interruttori, cursori, pad, accelerometri, indicatori, grafici e terminali.
Sul sito ww.keuwl.com si potranno trovare ulteriori informazioni e una biblioteca contenente esempi di programmazione.
E’ possibile creare sino a venti pannelli. Per crearli sarà sufficiente selezionare il comando voluto e inserirlo nella posizione scelta, utilizzando la griglia.
Occorrerà poi assegnare ai vari comandi o caselle di testo, i codici necessari al funzionamento.
Per esempio il pad per il comando del motore invierà il carattere 8 quanto sarà premuto il tasto UP.
E’ possibile creare sino a venti pannelli. Per crearli sarà sufficiente selezionare il comando voluto e inserirlo nella posizione scelta, utilizzando la griglia.
Occorrerà poi assegnare ai vari comandi o caselle di testo, i codici necessari al funzionamento.
Navigazione nell’app
All’avvio dell’app, si accede alla schermata principale, dove sarà possibile vedere una selezione di pannelli tra cui scegliere. Generalmente si desidera selezionare o modificare il pannello, quindi utilizzare la schermata di connessione per connettersi a un dispositivo e quindi fare clic su Esegui per usarlo.
Il diagramma seguente illustra il flusso tra le schermate nell’app.
Per tornare allo schermo da cui si è appena arrivato, usare il pulsante Indietro
Main Screen
Oltre a fornire l’accesso alle altre schermate, l’area centrale della schermata principale mostra una versione ridotta dei pannelli.
Selezionare il pannello che si desidera modificare o eseguire da qui. Le informazioni sul pannello vengono visualizzate nella parte inferiore sinistra dello schermo.
Se si trattengono le informazioni di questo pannello, verranno visualizzate ulteriori informazioni (se disponibili) sul pannello.
Connect
Cliccare il pulsante Connetti / Cambia per accedere alla schermata di connessione da cui è possibile scegliere di connettersi a un dispositivo Bluetooth o tramite una connessione seriale USB.
Settings
Gli ingranaggi nella parte superiore sinistra della schermata principale consentono di modificare alcune impostazioni principali. Tutte le proprietà / impostazioni dell’elemento del pannello vengono modificate nella schermata di modifica.
Info
Il pulsante i visualizza ulteriori informazioni sull’app, inclusa questa guida per l’utente.
File I/O
Il pulsante del disco consente a tutti i pannelli di essere salvati su file, caricati da file o caricati da un URL Web.
Il caricamento dal collegamento Web è un altro modo opzionale per condividere i pannelli evitando la necessità di copiare i file nella directory keuwlsoft sul dispositivo Android.
Per caricare o salvare un singolo pannello, utilizzare l’opzione di importazione / esportazione nella schermata di modifica.
Le operazioni sui file vengono eseguite nella directory keuwlsoft che verrà creata sul dispositivo.
Edit Screen
Questo è il pannello dove modificare il pannello o crearne uno nuovo.
Trascinate e rilascia gli elementi del pannello dove desiderate e modificatene le proprietà.
Per cambiare i pannelli, utilizzare i pulsanti freccia in alto a destra. Sotto il numero del pannello è presente un elenco di controlli / indicatori che possono essere aggiunti al pannello e altre funzioni come importazione / esportazione, libreria, cancellazione, impostazione delle note del pannello, regolazione delle dimensioni della griglia e generazione di codice remoto.
La maggior parte di questi elementi dell’elenco porterà ulteriori opzioni nella parte inferiore della schermata di modifica.
Run Screen
Una volta collegato a un dispositivo Bluetooth o USB, questo pulsante è abilitato ed è possibile accedere alla modalità di esecuzione con il pannello selezionato.
Library
Dalla schermata Modifica, selezionando Libreria si aprirà una serie di pannelli pronti che possono essere copiati per sostituire il pannello attualmente selezionato.
Navigare tra gli esempi con le frecce nella parte superiore della schermata Libreria.
Remote Code
Dalla schermata Modifica, selezionando Codice remoto sarà visualizzato un generatore di codice automatico per il pannello che potà essere utilizzato per generare codice per l’IDE Arduino.
Esempio di implementazione
Vediamo ora come funziona l’APP controllo robot utilizzata, mostrando alcuni dei comandi utilizzati per la creazione del pannello di comando di Little Bot
Per esempio il pad per il comando del motore invierà il carattere 8 quanto sarà premuto il tasto UP.
Per la lettura dei dati dei sensori, si utilizzerà la casella testo. I testi in cui, per esempio, se viene ricevuta la stringa *T23.95*, inserirà nella relativa casella il testo 23.95
Nella memoria della scheda di controllo, si dovrà caricare il programma di gestione del robot. Le varie funzioni saranno eseguite quando il relativo comando sarà inviato dallo smartphone.
Comando ricevuto
case ‘8’:
robot_avanti ();
break;
Dato inviato
int reading = analogRead(temp);
float tempC = reading * 0.48875;
Serial.print(“*T” + String(tempC) + “*”);
Codice completo per la gestione del robot
Sotto è riportato il codice che deve essere caricato nella memoria della scheda Arduino Nano
Nota:
Il modulo Bluetooth comunica con Arduino Nano attraverso la porta hardware UART, la stessa porta è anche utilizzata dall’IDE Arduino per effettuare il download del firmware.
Esiste quindi, un accesso contemporaneo alla risorsa e chiaramente le due cose non possono funzionare insieme.
Quindi, quando dovete programmare la scheda Arduino NANO, occorre rimuovere il modulo Bluetooth, effettuare il download, inserire nuovamente il modulo Bluetooth ed infine accendere la scheda.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 |
/* Pin Digitali */ #define buzzer 2 #define PWMA 3 #define AIN1 5 #define AIN2 4 #define PWMB 9 #define BIN1 7 #define BIN2 8 #define STBY 6 #define servo_pin 11 #define luce 12 #define ledpin 13 /*Pin analogici*/ #define vbat 1 #define foto 0 #define temp 2 #define sharp 7 #include <SharpIR.h> //Gestione sensore infrarosso SharpIR sensor( SharpIR::GP2Y0A21YK0F, A7); /*Definizione variabili*/ #define vel 100 //velocità dei motori int servo1 = 1250; //test servo tilt position (0 to 180) int minPulse1 = 600; // posizione minima 0° int maxPulse1 = 2400; // posizione massima 180° int turnRate1 = 100; // ruota di 10° alla volta int pulseWidth1; // servo pulse width int centerServo1; int distance; int val = 0; //faro void setup() { Serial.begin(9600); // Reinizializza la seriale bluetooth 9600 delay (200); //Impostazione pin pinMode(PWMA, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMB, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(STBY, OUTPUT); pinMode(luce, OUTPUT); pinMode(ledpin, OUTPUT); pinMode(servo_pin, OUTPUT); robot_accendi(); servo_center(); } void loop() { while (Serial.available() < 1) { } // Attesa sino a quando riceve un carattere char val = Serial.read(); // Legge il carattere dal modulo Bluetooth e lo salva nella variabile val switch (val) // Eseguie i comandi in base al carattere ricevuto { case 'p':// Se il carattere ricevuto è 'p' esegue la routine servo a DX servo_dx(); break; case 'i':// Se il carattere ricevuto è 'i' esegue la routine servo a SX servo_sx(); break; case 'o':// Se il carattere ricevuto è 'l' esegue la routine servo al centro servo_center(); break; case '8':// Se il carattere ricevuto è '8' esegue la routine Robot avanti robot_avanti (); break; case '2'://Se il carattere ricevuto è '2' esegue la routine Robot indietro robot_indietro (); break; case '4'://Se il carattere ricevuto è '4' esegue la routine Robot sinistra robot_sinistra (); break; case '6'://Se il carattere ricevuto è '6' esegue la routine Robot destra robot_destra (); break; case 'k'://Se il carattere ricevuto è 'k' Accende/spegene faro frontale faro (); telemetria (); break; case 'l'://Se il carattere ricevuto è 'l' Legge la fotocellula leggi_luce (); break; case 's'://Se il carattere ricevuto è 's' Emette un suono tone (buzzer, 500, 500); break; case 'q'://Se il carattere ricevuto è 'q' Trasmette i dati dei sensori tone (buzzer, 500, 500); telemetria (); break; case 't'://Se il carattere ricevuto è 't' Legge temperatura tramite LM35 temperatura (); break; case 'b'://Se il carattere ricevuto è 'b' Legge tensione della batteria batteria (); break; case 'd'://Se il carattere ricevuto è 'd' Legge la distanza di un'oggetto dal sensore distanza (); break; case 'n'://Se il carattere ricevuto è 'n' accende il led di segnalazione led_on (); break; case 'm'://Se il carattere ricevuto è 'm' spegne il led di segnalazione led_off (); break; case '0'://Se il carattere ricevuto è '0' esegue la routine Robot fermo stop(); break; case 'h'://Se il carattere ricevuto è 'h' esegue la routine HELP help(); break; default: stop(); // Ferma il robot break; } } void stop (void) { digitalWrite (AIN1, HIGH); digitalWrite (AIN2, HIGH); analogWrite(PWMA, vel); digitalWrite (BIN1, HIGH); digitalWrite (BIN2, HIGH); analogWrite(PWMB, vel); } void robot_indietro () { digitalWrite (AIN1, HIGH); digitalWrite (AIN2, LOW); analogWrite(PWMA, vel); digitalWrite (BIN1, HIGH); digitalWrite (BIN2, LOW); analogWrite(PWMB, vel); delay (200); } void robot_avanti () { digitalWrite (AIN1, LOW); digitalWrite (AIN2, HIGH); analogWrite(PWMA, vel); digitalWrite (BIN1, LOW); digitalWrite (BIN2, HIGH); analogWrite(PWMB, vel); delay (200); } void robot_destra () { digitalWrite (AIN1, HIGH); digitalWrite (AIN2, LOW); analogWrite(PWMA, vel); digitalWrite (BIN1, LOW); digitalWrite (BIN2, HIGH); analogWrite(PWMB, vel); delay (200); } void robot_sinistra () { digitalWrite (AIN1, LOW); digitalWrite (AIN2, HIGH); analogWrite(PWMA, vel); digitalWrite (BIN1, HIGH); digitalWrite (BIN2, LOW); analogWrite(PWMB, vel); delay (200); } void robot_accendi () { digitalWrite(STBY, HIGH); } void robot_spegni() { digitalWrite(STBY, LOW); } /* Muove il servo a destra*/ void servo_dx() { pulseWidth1 = pulseWidth1 - turnRate1; if (pulseWidth1 < minPulse1) { pulseWidth1 = minPulse1; } digitalWrite(servo_pin, HIGH); delayMicroseconds(pulseWidth1); digitalWrite(servo_pin, LOW); delay(20); } /* Muove il servo a Sinistra*/ void servo_sx() { pulseWidth1 = pulseWidth1 + turnRate1; if (pulseWidth1 > maxPulse1) { pulseWidth1 = maxPulse1; } digitalWrite(servo_pin, HIGH); delayMicroseconds(pulseWidth1); digitalWrite(servo_pin, LOW); delay(20); } /* Posiziona il servo in centro*/ void servo_center() { centerServo1 = maxPulse1 - ((maxPulse1 - minPulse1) / 2); pulseWidth1 = centerServo1; digitalWrite(servo_pin, HIGH); delayMicroseconds(pulseWidth1); digitalWrite(servo_pin, LOW); delay(20); } /* Accensione led segnalazione*/ void faro() { if (digitalRead(luce) == HIGH) // il led era acceso? { digitalWrite(luce, LOW); // lo spengo Serial.println("Led spento"); } else // il led era spento { digitalWrite(luce, HIGH); // lo accendo Serial.println("Led acceso"); } } /* Accensione led segnalazione*/ void led_on() { digitalWrite(ledpin, HIGH); // sets the LED on } /* Spegnimento led segnalazione*/ void led_off() { digitalWrite(ledpin, LOW); // sets the LED off } /* Lettura della tensione della batteria*/ void batteria () { float vbatt = (analogRead(vbat) * (5.0 / 1024) * 2); Serial.print("Tensione batteria: "); Serial.print (vbatt); Serial.println (" V"); } /* Legge la temperatura */ void temperatura () { /* Lettura sensore */ int reading = analogRead(temp); float tempC = reading * 0.48875; Serial.print("Temperatura: "); Serial.print(tempC, 1); Serial.println(" gradi C"); } /* Verifica funzionamento fotocellula */ void leggi_luce () { float lettura_foto = analogRead(foto); // lettura grezza dall'adc Serial.print("Valore luce = "); Serial.println(lettura_foto, 0); //stampiamo il valore } /* Lettura distanza*/ void distanza() { int distance = sensor.getDistance(); Serial.print("Distanza in centimetri: "); Serial.println(distance); } /*Trasmissione telemetria*/ void telemetria() { led_on (); //Preparazione dei valori float vbatt = (analogRead(vbat) * (5.0 / 1024) * 2); float batteria = vbatt; int fotocellula = analogRead(foto); // lettura grezza dall'adc int reading = analogRead(temp); float tempC = reading * 0.48875; int distance = sensor.getDistance(); //Invio valori verso stazione di comando Serial.print("*V" + String(batteria) + "*"); Serial.print("*L" + String(fotocellula) + "*"); Serial.print("*T" + String(tempC) + "*"); Serial.print("*D" + String(distance) + "*"); led_off (); } /* HELP*/ void help() { Serial.print("\nComandi robot "); Serial.print("\nh - Questo elenco"); Serial.print("\nb - Tensione della batteria"); Serial.print("\nt - Temperatura"); Serial.print("\nd - Legge distanza"); Serial.print("\nl - Legge luminosita'"); Serial.print("\ns - Emette un BIP"); Serial.print("\nk - Accende/spegne il faro"); Serial.print("\np - Servo a DX"); Serial.print("\ni - Servo a SX"); Serial.print("\no - Servo al centro"); Serial.print("\n8 - Robot avanti"); Serial.print("\n2 - Robot indietro"); Serial.print("\n4 - Robot a SX"); Serial.print("\n6 - Robot a DX"); Serial.print("\n0 - Robot fermo"); Serial.print("\nn - Accende led"); Serial.print("\nm - Spegne led"); Serial.print("\nq - Trasmette telemetria"); } |