LittleBOT – App per il controllo robot

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.

APP controllo robot

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.

stazione controllo little BOT

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.

APP controllo robotSono disponibili una vasta scelta di controlli raggruppati in 9 diversi tipi: testi, pulsanti, interruttori, cursori, pad, accelerometri, indicatori, grafici e terminali.

APP controllo robot
Schermata principale
APP controllo robot
Pannello per connessione con modulo Bluetooth
APP controllo robot
Esempio di schermata di esecuzione
APP controllo robot
Esempio di pannello in via di creazione

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

APP controllo robot

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");
}