Ultima modifica il 10 Agosto 2026 by Adriano
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.
/* 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");
}




