bclose

Controlando un Rover 4×4 por bluetooth

Objetivos

 

 

    • Seguimos jugando con los motores de corriente continua y la controladora Motor Shield V1 de Adafruit.
    • Controlaremos el Rover desde nuestro smartphone o tablet por bluetooth
    • Programaremos los movimientos básicos de robot.
    • Mostraremos una aplicación Android para poder controlar el Rover mediante bluetooth

 

 

Material requerido.

Version R3Arduino MEGA o equivalente.
Adafruit V1 Un Motor Shield V1
  Chasis tractorUn chasis robot con 4 motores.
Porta bateriasUn porta pilas
Modulo Bluetooth HC-05Un módulo bluetooth HC-05 o similar
Conversor de voltaje YP-6 Conversor de voltaje de 5V a 3.3V
Powerbank 5V DCPowerbank de unos 2200 mAh
 

Introduccion

 

Hemos dedicado varios tutoriales al Rover 4×4 ya en nuestra página, en concreto los tutoriales:

Y ya que nos pasamos todo el día enganchados al móvil y que cada vez la tendencia es usarlo para todo, creemos que faltaba un tutorial con el que pudiéramos manejarlo directamente con nuestro smartphone o nuestra tablet.

En las sesiones previas hemos visto los conceptos básicos de los motores CC y cómo usar una controladora tipo Motor Shield, para gobernar varios motores simultáneamente, también hemos hablado de cómo gobernar el giro con tracción independiente a las cuatro ruedas controlando de forma diferencial la velocidad de giro de las ruedas.

Toda la teoría está ya en los tutoriales previos, así que si no los habéis visto aún o se os ha olvidado un poco podéis repasarlos y refrescar conceptos.

Lo único que añadiremos es un pequeño módulo bluetooth, en este caso el HC-05, un conversor de voltaje de 5V a 3.3V para el módulo y un powerbank, como el que usamos para cargar el móvil, con el que alimentaremos nuestro Arduino Mega.

Vamos con el diagrama de conexión

 

 

Diagrama de conexión

 

La conexión del circuito es realmente simple, sólo tenemos que pinchar el Motor Shield v1 al Arduino Mega (fijaos en que el pin 0 del Motor Shield coincida con el RX0 del Arduino Mega y que el A5 del Motor Shield coincida con el A5 del Arduino Mega), los cables para la transmisión y recepción de datos, RX y TX, y la alimentación del módulo bluetooth.

El esquema Fritzing del Motor Shield es diferente del que vamos a utilizar, pero lamentándolo mucho no está disponible así que usamos este otro porque ocupa los mismos pines aunque la disposición de los componentes en el shield sea algo diferente. Luego explicaremos como realizar las conexiones basándonos en una fotografía.

En el Arduino Mega vamos a utilizar el puerto Serie número 1 para la transmisión y recepción de datos con el módulo bluetooth, es decir, los pines RX1 y TX1. Como siempre hay que recordar que el cable RX del módulo bluetooth va con el TX del Arduino y viceversa.

Como pasa en muchos módulos vamos a usar un conversor de voltaje para alimentar el bluetooth con 3.3 V en lugar de los 5V que da la salida de los pines de Arduino. En nuestro caso es un YP-6, pero hay un montón de ellos disponibles. Conectamos los cables del Arduino a los pines Vin y GND del conversor y los Vout y GND a nuestro módulo bluetooth.

Esquema Fritzing Rover BT

 

En cuanto a la conexión de los motores hay que tener en cuenta que están numerados del M1 al M4, girando en el sentido contrario a las agujas del reloj, siendo el M1 y el M2 los motores de las ruedas delanteras y M3 y M4 los de las ruedas traseras. Siguiendo el código de colores el rojo es para el positivo y el negro para el negativo, GND. Como usamos 6 pilas AA de 1,5 V estaremos alimentando los motores con 9V en total y el Motor Shield se encargará de repartir la alimentación individualmente a cada motor.

Hay que fijarse en el cuadrado amarillo de la derecha en el que están serigrafiadas las letras PWR, Power o potencia, es muy importante. En el cuadrado podemos observar un par de pines que pueden ser unidos mediante un jumper. Si el jumper estuviera uniendo los dos pines significaría que estaríamos usando la misma alimentación de los motores para alimentar también a nuestro Arduino Mega, lo cual es una mala idea porque le estamos proporcionando 9V cuando nuestro Arduino sólo necesita 5V. Aparte de posibles comportamientos erráticos podríamos correr el riesgo de freír a nuestro Arduino Mega por lo que dejaremos los pines al aire, indicando que usaremos alimentación independiente a través del puerto USB del Arduino con el powerbank para hacer funcionar la placa.

En el cuadrado amarillo de la izquierda vemos también serigrafiadas las letras EXT_PWR (External Power, alimentación externa) y +M (Alimentación positiva de los motores), GND. En este conector es donde deberemos conectar los cables de alimentación de nuestro portapilas.

Motor Shield

 

Sólo nos queda conectar el powerbank mediante un cable USB A-B, como el de las impresoras, a nuestro Arduino para poder alimentarlo. Es una solución bastante económica, versátil, fácil de recargar y que no pesa demasiado para poder ser usado en proyectos en los que queramos mover nuestros Arduinos sin tener que usar baterías más pesadas, de ácido y plomo, por ejemplo.

¡Voilá! Ya tenemos listo nuestro Rover bluetooth para cargar nuestro programa.

 

El programa de control

 

Lo primero es descargar la librería adafruit-Adafruit-Motor-Shield-library-8119eec y que la instaléis siguiendo el procedimiento habitual.

Como vamos a utilizar el Motor Shield, lo primero que debemos hacer es importar la librería que nos permita utilizarlo:

#include <AFMotor.h>

Ahora lo siguiente es definir cada uno de los motores que queremos controlar:

AF_DCMotor Motor1(1); // Delante Derecha
AF_DCMotor Motor2(2); // Delante Izquierda
AF_DCMotor Motor3(3); // Detrás Izquierda
AF_DCMotor Motor4(4); // Detrás Derecha

Acto seguido definimos la velocidad y la proporción de giro que usaremos para gobernar los motores:

int Vel = 180 ;    // Define la velocidad base del Rover
float P = 0.25 ;   // Proporcion de giro

Vamos ahora con la función setup(), en la que definimos el pin 49 del Arduino Mega como salida (con el que alimentaremos nuestro módulo bluetooth HC-05) para después activarlo. Lo único que queda es activar la comunicación serie del puerto 1 del Arduino Mega estableciendo una velocidad de 38400 bps, que es la velocidad por defecto en los módulos bluetooth.

void setup()
{
    pinMode(49, OUTPUT);  // A través de este pin alimentamos al módulo bluetooth
    digitalWrite(49, HIGH);
    Serial1.begin(38400);  // Velocidad por defecto en los módulos HC-05 
}

Dentro de la función loop(), lo que hacemos es comprobar si existen datos disponibles a través del puerto serie 1 utilizando la función available(), Serial1.available(). Si existe algún dato disponible definimos una variable de tipo char que almacene su valor y después analizamos la cadena usando la función analizarCadena(c).

void loop()
{
    	if (Serial1.available()){
      	char c;
      	c = Serial1.read();     
       analizarCadena(c); 
	}	   
}

 

Aquí empieza la parte interesante, la función analizarCadena(). Esta función recibe como entrada el dato que el Arduino Mega recibe del módulo bluetooth, char c, es decir, un dato de tipo caracter. Lo que debemos hacer es analizarlo para saber qué órdenes debemos mandar a los motores.

Usamos una triquiñuela para pasar de un tipo char a un tipo string, definiendo una cadena vacía, String s=””, y después concatenándola con el caracter recibido para formar una cadena con el dato que hemos recibido a través del bluetooth. Este ejemplo es muy sencillo y no haría falta, pero dependiendo de la cadena que recibáis podría venir muy bien poder usar las funciones disponibles para el manejo de cadenas.

En nuestro caso hemos usado una app gratuita que se llama Bluetooth Electronics y que además permite modificar el panel de control para controlar el módulo bluetooth. Tampoco sería necesario en nuestro caso ya que lo único que vamos a usar es lo que en el programa llama pad para manejar el Rover en 9 direcciones, pero puede ser interesante para futuros proyectos.

Si usáis otro programa para manejar el Rover debéis averiguar qué es lo que manda el programa al Arduino a través del módulo bluetooth para poder mandar las órdenes a los motores.

La modificación que habría que realizar para ver qué es lo que manda es mínima. Habría que incluir estas instrucciones dentro de la función setup() para inicializar el puerto serie y ver la salida en el monitor de la consola serie:

Serial.begin(9600);
Serial.println("A la espera de ordenes");
Serial.println("----------------------");
Serial.println("");

Y después dentro de la función loop() añadir una instrucción para ver qué es lo que recibimos, la instrucción Serial.write(c):

void loop()
{
    	if (Serial1.available()){
      	char c;
      	c = Serial1.read(); 
		Serial.write(c);    
       analizarCadena(c); 
	}	   
}

De esta manera ya sabríamos que es lo que manda la aplicación cada vez que pulsamos una tecla y podemos programar la respuesta desde el programa de Arduino.

En este caso el programa manda los siguientes datos:

Movimientos del Pad

En realidad mientras mantenemos pulsadas las teclas del mando manda un número del 1 al 8 y cuando lo soltamos manda un cero. Cuando detectemos que se ha mandado un cero lo usaremos para mandar al Rover la orden de frenar, ya que no habrá ninguna tecla pulsada en ese momento.

Lo bueno de este programa es que se pueden editar los valores que queremos que mande cuando pulsemos las teclas. Lo veremos más adelante cuando echemos un vistazo a cómo funciona el programa.

Utilizamos un bucle if múltiple con las diferentes opciones y analizamos la cadena usando la función startsWith(), es decir, empieza por. Según el valor que obtengamos le damos las órdenes correspondientes al Rover.

void analizarCadena(char c){
  String s="";
  s += c;
  if(s.startsWith("1")){
     // Adelante 
     Avance();
  }
  else if(s.startsWith("5")){
      // Adelante a la Derecha 
      Avance();
      giroDerecha();
  }
  else if(s.startsWith("2")){
      // Derecha 
      giroDerecha();	
  }
  else if(s.startsWith("6")){
      // Abajo a la Derecha 
      RetrocesoIzquierda();
  }
  else if(s.startsWith("3")){
      // Abajo 
      Retroceso();
  }   
  else if(s.startsWith("7")){
      // Abajo a la Izquierda 
      RetrocesoDerecha();
  }
  else if(s.startsWith("4")){
      // Izquierda 
      
      giroIzquierda();
  } 
  else if(s.startsWith("8")){
      // Adelante a la Izquierda
      Avance();
      giroIzquierda();
  } 
  else if(s.startsWith("0")){
      // Frena
      Paro();
  }
}   

Lo único que queda ya es introducir las funciones que gobiernan el avance, retroceso, giro, freno o control de velocidad de los motores.

void SetVel(int v1, int v2, int v3, int v4)
{
     Motor1.setSpeed(v1);
     Motor2.setSpeed(v2);
     Motor3.setSpeed(v3);
     Motor4.setSpeed(v4);         
}

void Avance()
{ 
  SetVel(Vel,Vel,Vel,Vel);
  Motor1.run(FORWARD) ;
  Motor2.run(FORWARD);
  Motor3.run(FORWARD);
  Motor4.run(FORWARD); 
}

void Retroceso()
{ 
  SetVel(Vel,Vel,Vel,Vel);
  Motor1.run(BACKWARD) ;
  Motor2.run(BACKWARD);
  Motor3.run(BACKWARD);
  Motor4.run(BACKWARD);
}


void Paro()
{ 
  Motor1.run(RELEASE);
  Motor2.run(RELEASE);
  Motor3.run(RELEASE);
  Motor4.run(RELEASE); 
}

void giroIzquierda()
{  
    int v = Vel * P ;   
    SetVel( v, Vel, v, Vel) ;    
    Motor1.run(FORWARD) ;
    Motor2.run(FORWARD);
    Motor3.run(FORWARD);
    Motor4.run(FORWARD);    
}
         
void giroDerecha()
{  
    int v = Vel * P ;
    SetVel( Vel, v, Vel, v) ;    
    Motor1.run(FORWARD) ;
    Motor2.run(FORWARD);
    Motor3.run(FORWARD);
    Motor4.run(FORWARD);    
}

void RetrocesoDerecha()
{  
    int v = Vel * P ;   
    SetVel( v, Vel, v, Vel) ;
    Motor1.run(BACKWARD) ;
    Motor2.run(BACKWARD);
    Motor3.run(BACKWARD);
    Motor4.run(BACKWARD);
}
         
void RetrocesoIzquierda()
{  
    int v = Vel * P ;
    SetVel( Vel, v, Vel, v) ;    
    Motor1.run(BACKWARD) ;
    Motor2.run(BACKWARD);
    Motor3.run(BACKWARD);
    Motor4.run(BACKWARD);
}

 

 

LA APP BLUETOOTH

 

Hemos estado probando distintas aplicaciones y esta es bastante sencilla de utilizar, aunque el panel de control nos va a quedar un poco viudo… sólo un pad con las nueve direcciones. Pero dicen que la belleza reside en la simplicidad así que vamos allá con la aplicación.

Lo primero que debemos hacer es conectarnos a Google Play y buscar Bluetooth Electronics.

App Bluetooth electronics

Una vez que la hayamos descargado e instalado, abriremos la aplicación. Tendremos que tener el bluetooth del teléfono o tablet activado, sino una ventana nos avisará de que una aplicación está intentado activarlo, le diremos “Permitir” y veremos la siguiente pantalla:

 

Screenshot_2016-07-06-01-05-47

 

Si pulsamos el botón Discover, descubrir dispositivos bluetooth al alcance, veremos una pantalla muy similar a esta. Aquí se ven los dispositivos que han estado emparejados con nuestra tablet o móvil a la derecha, debajo de Paired Devices, y a la izquierda los que ha descubierto ahora, debajo de Discovered Devices.

Conectado

 

En la lista de dispositivos descubiertos aparecerá el nombre o nombres de los dispositivos descubiertos y su dirección MAC. En la imagen ya estamos conectados al dispositivo, pero si no pulsaríamos en el botón Connect, conectar, y la aplicación se conectaría al dispositivo. En la parte superior aparecerá de nuevo el nombre del dispositivo al que estamos conectados y su dirección MAC. Pulsaremos en el botón Done, hecho, y avanzaremos a la siguiente pantalla.

 

En la siguiente pantalla tenemos una serie de paneles con los que poder trastear. Algunos vienen ya predefinidos, pero a través del botón Edit, editar, podremos modificarlos a nuestro antojo.

Paneles

 

Nos moveremos hasta el panel número 9, que es un panel vacío y le daremos al botón Edit para poder insertar nuestro control pad. Dentro de esta nueva ventana nos encontramos con una lista de controles en la parte de la derecha debajo del nombre del panel que estamos editando.

Nos moveremos hasta la opción Pads y seleccionaremos el segundo por la izquierda. Usando el dedo seleccionamos el control, lo arrastramos y lo soltamos dentro de la zona de despliegue del panel. Hay mucho sitio y no vamos a usar ningún otro, así que podéis ponerlo donde queráis, aunque convendría centrarlo un poco.

Edición del panel

 

Observad una cosa, si seleccionamos el pad vemos que abajo a la derecha aparecen unos valores para arriba, abajo, izquierda y derecha y también un botón que pone Edit. Estos son los valores que el programa manda al Arduino según qué tecla pulsemos, pero si recordáis, dijimos que podían cambiarse y poner los que quisiéramos. Si pulsamos el botón Edit nos aparecerá la siguiente ventana:

Edición del Pad

 

Aquí están todos los valores que manda dentro de la sección “Direction strings to send”, o sea, cadenas de dirección para mandar según cada una de las direcciones que pulsemos.

La cadena de freno es la que llama “Release String”, es decir, el valor que manda cuando dejamos de pulsar una tecla.

Después tenemos dos opciones:

  • Mandar solamente la cadena cuando cambie la tecla pulsada, “Send on change”
  • Mandar continuamente la cadena mientras tengamos la tecla pulsada, “Send Continuously while pressed”. Si seleccionáramos esta opción también podríamos definir cada cuantos milisegundos queremos que se mande la cadena, dentro de la casilla “Repeat every (ms)”.

 

Nosotros dejaremos seleccionada la opción que viene por defecto, “Send on Change”, para que sólo mande la cadena cada vez que cambie la tecla que esté pulsada.

Como algo opcional, podríamos añadir a la cadena algún caracter de inicialización o finalización dentro de las casillas “Start with” o “End with”, respectivamente, aunque no lo vemos necesario.

Pulsaríamos el botón OK y saldríamos guardando los cambios.

Ya sólo tenemos que darle al botón regresar para volver a la pantalla anterior pero esta vez, seleccionaremos el panel 9 y pulsaremos el botón Run, ejecutar.

Ahora viene la mejor parte, ya podemos utilizar el mando y empezar a juguetear con nuestro Rover, al menos hasta que se acaben las pilas.

Iremos haciendo más cosas con el Rover pero no está mal para ir abriendo boca.

 

Nota:

Esta es la versión 2.0 del programa que soporta la opción de un control deslizante para modificar la velocidad: bt_rover_v2

Resumen de la sesión

 

 

    • Seguimos usando la controladora de Adafruit MotorShield
    • Hemos visto cómo manejar nuestro Rover mediante bluetooth a través de nuestro móvil o tablet.
    • Hemos aprendido cómo usar una aplicación Android para controlar el Rover desde nuestro móvil o tablet mediante bluetooth.
    • Hemos aprendido un nuevo uso para el powerbank de nuestro móvil, alimentar a nuestro Arduino.
 
 
 

 

 

 

(16) Comments

  • Hola
    quiero usar el bluetooth HC-06 pero no se como pasarlo en el sketch.
    Me pueden decir como lo añado al sketch porfavor.

    • Hola Darius, el sketch ya incluye la utilización del bluetooth utilizando el puerto serie serial1 del arduino mega. No sé muy bien a que te refieres con tu consulta. Saludos!

    • William

    No pude conseguir el arduino mega, como puedo hacer para utilizar el bluetooth, hay alguna manera de utilizar los pines analogicos, o utiizar los pines Tx y Rx??

    • Hola William, puedes usar la librería SoftwareSerial para comunicar con el bluetooth. Lo que pasa es que el shield que usamos se reserva todos los pines que podrías usar con la librería, ya que sólo te quedan libres el 2 y el 13, y el 13 no es compatible con la librería SoftwareSerial. Por eso es necesario utilizar el Arduino Mega.

      De todas formas tienes un grupo de sesiones dedicadas por completo el bluetooth. Te dejo el enlace: http://www.prometec.net/indice-bluetooth/

      Un saludote!

  • Buen dia, disculpe como puedo variar esta parte de codigo “int Vel = 180 ; // Define la velocidad base del Rover” visto que es la variable que regula la velocidad del motor.. variarlo desde 100 a 255 por una app usando un slider..

    • Hola Yuri, la forma mas sencilla que se me ocurre es leer el slider y modificar el valor de vel en funcion del valor leido

    • Hola Yuri, verás que he incluido la versión V2 del programa en un enlace antes del resumen, que incluye un control deslizante para regular la velocidad del Rover.

      Sólo tienes que añadir un control deslizante en el panel que estés editando, definir su rango entre 0 y 255, después añadir la letra “S” al campo “Starts With” y la “E” al campo “Ends With”. De esta manera definimos los caracteres de inicio y de fin de cadena para el mensaje que manda el control deslizante al programa de Arduino.

      Con eso ya tendría que funcionar el Rover con control de velocidad.

      Si tienes alguna duda sobre cómo funciona la nueva función analizarCadena() sólo tienes que decirlo.

      Aquí va el nuevo código, para que le echéis un ojo:

      void loop()
      {
        analizarCadena();
        // Keep reading from Arduino Serial Monitor and send to HC-05
        if (Serial.available())
          Serial1.write(Serial.read());
      }
      
      void analizarCadena(){   
        if (Serial1.available()){    
            char c;                 
            String s="";     
            c = Serial1.read();     
            s += c;           
            if(s.startsWith("S")){
               // Modificamos la velocidad         
               long velocidad;
               velocidad = Serial1.parseInt();
               Vel = (int) velocidad;        
               return;
            }
            else if (s.toInt()>0 && s.toInt()<9){                            
                int m = s.toInt();         
                  switch(m){
                    case 1:        
                      Serial.println("Arriba"); 
                      Avance();
                      break;
                    case 5:
                      Serial.println("Arriba a la Derecha"); 
                      Avance();
                      giroDerecha();
                      break;
                    case 2:          
                      Serial.println("Derecha"); 
                      giroDerecha();
                      break;
                    case 6:
                      Serial.println("Abajo a la Derecha"); 
                      RetrocesoIzquierda();
                      break;
                    case 3:
                      Serial.println("Abajo"); 
                      Retroceso();
                      break;
                    case 7:
                      Serial.println("Abajo a la Izquierda"); 
                      RetrocesoDerecha();
                      break;
                    case 4:
                      Serial.println("Izquierda"); 
                      giroIzquierda();
                      break;
                    case 8:
                      Serial.println("Arriba a la Izquierda"); 
                      Avance();
                      giroIzquierda();
                      break;
                    case 0:
                      Serial.println("Echa el freno"); 
                      Paro();
                      break;        
                  }                              
            }
        }
      

      Un saludo

  • Porque usar el conversor si arduino tiene una salida de 3.3v?

    • Hola Martin:
      El Motor Shield tapa la salida de 3.3V del Arduino Mega por lo que no puedes usarla. Algunos adaptadores funcionan con doble voltaje: de 5V y de 3.3V, así que si tienes una entrada de 5V puedes usarla directamente, sin el conversor de voltaje. También se puede usar la salida de 5V que tiene el Motor Shield en lugar de usar el pin 49 como fuente de voltaje.

      Un saludo

  • ya esta, lo solucione….muchas gracias

  • Gracias Ivan, tengo otra pregunta, estoy utilizando el arduino mega y el modulo bluetooth HC06, los txd y rxd, son los mismos el GND también pero el VSS no es lo mismo, donde lo conecto??

  • Hola Ivan, estoy teniendo problemas a la hora de compilar, me lanza error con Serial1 , me dice que no esta declarado…..le he puesto bien la librería y se ven de color naranja las letras, no se que estoy haciendo mal…..podrías ayudarme?
    gracias

    • Hola! Has comprobado que como placa tengas seleccionada la Arduino Mega en el IDE? Porque el error puede venir si tienes seleccionado por ejemplo el Arduino Uno.

      Un saludote!

  • ¿Por qué se necesita el conversor de corriente? ¿si no se usara se estropearía el módulo bluetooth? y si se usa Powerbank para alimentar la placa, ¿entonces para que se necesita el portapilas?

    • Hola Guillermo, el conversor lo usamos para bajar el voltaje y adaptarlo al módulo. Si no podría romperse y si no lo hiciera disiparía la energía sobrante en forma de calor, lo cual es muy poco eficiente. Con el conversor nos quitamos ese problema.

      El Powerbank lo usamos para alimentar las placas mientras que con el portapilas lo que alimentamos son los motores. Un saludo.

Give a Reply

WordPress Anti-Spam by WP-SpamShield