13

Tutorial de Arduino, Bluetooth y Android #3 – Robot teledirigido con MIT inventor

Ir a la Parte #1
Ir a la Parte #2

¡Hola, homo fabers! ¿Qué hay? En esta tercera (y última) parte de la serie de tutoriales de Arduino, Bluetooth y Android voy a explicaros cómo construir un robot con Arduino que pueda controlarse con el móvil. Así podréis ir a recoger vuestra fuente de energía biológica (comida) sin tener que levantaros del sillón.

Al igual que en la última parte, vamos a usar MIT App Inventor 2 para construir esta aplicación, así que si no lo habéis hecho, os invito a leer el segundo tutorial de esta serie para entender qué es y cómo funciona.

Para construir el robot voy a utilizar un controlador de motores DRV8835 con el chasis Zumo de Pololu que tengo, pero también voy a explicar cómo hacerlo a partir del controlador de motores L298 H-Bridge o un L293D para que puedas utilizar cualquier otro chasis personalizado.

Bueno, ¡basta de hablar! Ponemos un poco de música y empezamos. Como este es el año Sibelius (el día 12 se cumplieron 150 años de su nacimiento) vamos a poner una parte del Concierto de Violín en do menor.


Material:

Los que queráis montar el robot con el chasis Zumo vais a necesitar:

Sino, tenéis la opción de seguir el tutorial con otro chasis personalizado. Si es así debéis conseguir:

  • Una placa Arduino y cable USB compatible
  • Un controlador de motores L298 Dual H-Bridge o L293D
  • Un módulo bluetooth HC 06
  • Un chasis con motores y batería

I – Preparar Arduino

Lo primero será escribir una función para mover los motores, que será diferente según cuál sea vuestro controlador de motores. Después habrá que poner esa función dentro de otro código de Arduino que leerá comandos por Bluetooth y variará la velocidad de los motores.

Función para L293D

Los que decidáis usar un controlador de motores L293D tenéis que conectarlo así:

Esta es la función para mover los motores con un L293D.

/* Funcion para mover los motores del Chasis Zumo de Pololu
 * Autora: Glare
 * www.robologs.net
 */

void motores(int m1, int m2)
{
   //m1 y m2 son las velocidades del primer
   // y segundo motor, entre -255 y 255

   //Declarar los pines para el motor 1
   pinMode(7, OUTPUT);
   pinMode(8, OUTPUT);
   pinMode(10, OUTPUT);
   
   //Declarar los pines para el motor 2
   pinMode(2, OUTPUT);
   pinMode(4, OUTPUT);
   pinMode(6, OUTPUT);
   
   
   //Invertir el giro del motor 1 si es necesario
   if(m1 < 0)
   {
      digitalWrite(8, HIGH);
      digitalWrite(7, LOW);
      m1 = -m1;
   }
   else
   {
      digitalWrite(8, LOW);
      digitalWrite(7,HIGH);
   }
   

   //Invertir el giro del motor 2 si es necesario
   if(m2 < 0)
   {
      digitalWrite(4, HIGH);
      digitalWrite(2, LOW);
      m2 = -m2;
   }
   else
   {
      digitalWrite(4, LOW);
      digitalWrite(2,HIGH);
   }

   //Generar pulso PWM
   analogWrite(10, m1);
   analogWrite(6, m2);
}

Función para L298 Dual H-Bridge

Los que tengáis el controlador de motores L298 Dual H-Bridge conectadlo así:

El código de la función es muy parecido al del L293D:

/* Funcion para mover los motores del Chasis Zumo de Pololu
 * Autora: Glare
 * www.robologs.net
 */

void motores(float m1, float m2)
{
   //m1 y m2 son las velocidades del primer
   // y segundo motor, entre -255 y 255

   //Declarar los pines para el motor 1
   pinMode(7, OUTPUT); //I1
   pinMode(8, OUTPUT); //I2
   pinMode(10, OUTPUT); //EA
   
   //Declarar los pines para el motor 2
   pinMode(2, OUTPUT);  //I3
   pinMode(4, OUTPUT);  //I4
   pinMode(6, OUTPUT); //EB
   
   
   //Invertir el giro del motor 1 si es necesario
   if(m1 < 0)
   {
      digitalWrite(8, HIGH);
      digitalWrite(7, LOW);
      m1 = -m1;
   }
   else
   {
      digitalWrite(8, LOW);
      digitalWrite(7,HIGH);
   }
   

   //Invertir el giro del motor 2 si es necesario
   if(m2 < 0)
   {
      digitalWrite(4, HIGH);
      digitalWrite(2, LOW);
      m2 = -m2;
   }
   else
   {
      digitalWrite(4, LOW);
      digitalWrite(2,HIGH);
   }

   //Generar pulso PWM
   analogWrite(10, m1);
   analogWrite(6, m2);
}

Función para el Chasis Zumo

Esta función es para los que tengáis el Chasis Zumo de Pololu. En vez de utilizar la librería que ofrece Pololu, he decidido escribir mi propio código.

Sólo hay que colocar la placa Arduino encima del chasis (vigilando que ningún pin quede fuera de su lugar). La función para motores es esta:

/* Funcion para mover los motores del Chasis Zumo de Pololu
 * Autora: Glare
 * www.robologs.net
 */
 
void motores(int m1, int m2)
{
   //m1 y m2 son las velocidades del motor derecho
   // e izquierdo, entre -255 y 255
   pinMode(7, OUTPUT);
   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
   pinMode(10, OUTPUT);
   
   //Invertir el giro del motor derecho si es necesario
   if(m1 < 0)
   {
      digitalWrite(7, HIGH);
      m1 = -m1;
   }
   else
      digitalWrite(7, LOW);
    
   //Invertir el giro del motor izquierdo si es necesario
   if(m2 < 0)
   {
      digitalWrite(8, HIGH);
      m2 = -m2;
   }
   else
      digitalWrite(8, LOW);
 

 
   //Generar pulso PWM
   analogWrite(10, m2);
   analogWrite(9, m1);
}

Esta función “motores” recibe dos argumentos: m1 y m2, las velocidades del motor 1 y 2 (que van de 0->255). Después comprueba si la velocidad m1 es menor que cero. En este caso, activa el pin D8 (este pin invierte el giro) y convierte m1 a un número positivo (ya que el pin D10, que controla la velocidad, sólo acepta valores mayores que cero). Lo mismo para m2.

Las dos últimas líneas generan un pulso PWM en los pines D9 y D10 para mover los motores.

Comprobar la función

Es posible que tengáis cableados los motores al revés que yo. Para que esto no dé problemas más adelante, vamos a testear la función y a modificarla si algún motor gira en la dirección que no debería.

Este código mueve los motores así:

  • Motor derecho hacia adelante.
  • Motor derecho hacia atrás.
  • Motor izquierdo hacia adelante.
  • Motor izquierdo hacia atrás.
  • Ambos hacia adelante.
  • Ambos hacia atrás.
  • Paro.

Debéis añadir la función ‘motores’ de vuestro controlador al final de todo. Por ejemplo, si utilizáis el chasis Zumo de Pololu, debéis copiar la función que hay más arriba y pegarla al final de este programa.

void setup()
{
}

void loop()
{
  motores(100, 0);
  delay(700);
  motores(-100,0);
  delay(700);
  motores(0, 100);
  delay(700);
  motores(0, -100);
  delay(700);
  motores(100,100);
  delay(700);
  motores(-100,-100);
  delay(700);
  motores(0,0);
  delay(700);
}

//Copiar la funcion de motores aqui

¿Funcionan cómo deberían? ¿No? Veamos cómo arreglarlo:

Los que tengáis el controlador de motores L293D o el Dual H-Bridge y os falle el motor derecho, debéis intercambiar las líneas 26 y 27 de vuestra función por las líneas 32 y 33. Si es el motor 2 el que funciona al revés, intercambiad las líneas 40 y 41 por las líneas 46 y 47.

Los que tengáis el chasis Zumo, debéis intercambiar las lineas 19 y 23 si falla el motor izquierdo, y las lineas 28 y 32 si falla el motor derecho.

Programa Bluetooth

Bien, ahora ya funcionan los motores. Lo siguiente será conectar el módulo HC 06 y cargar el programa de Arduino que recibirá los comandos que enviaremos por el móvil.

Hay que conectar el módulo Bluetooth de esta forma:

  • Arduino RX -> HC06 TX
  • Arduino TX -> HC06 RX
  • Arduino 3.3v -> HC06 VCC
  • Arduino GND -> HC06 GND

¿Y qué hace el programa? Recibe un carácter vía bluetooth y mira si se corresponde a un carácter concreto: con ‘a’ mueve los motores hacia adelante, con ‘r’ hacia atrás, con ‘i’ gira a la izquierda, con ‘d’ a la derecha y con ‘s’ se paran.

Al igual que antes, tenéis que copiar vuestra función de motores al final.

int val;
 
void setup()
{
  Serial.begin(9600);
  delay(7000);
  
}
 
void loop()
{
  if(Serial.available() >= 1)
  {
    val = Serial.read();
  
    if(val == 'a')
    {
      motores(250,250);
    }
    else if(val == 'i')
    {
      motores(-250, 250);
    }
    else if(val == 's')
    {
      motores(0,0);
    }
    else if(val == 'r')
    {
      motores(-250,-250);
    }
    else if(val == 'd')
    {
      motores(250,-250);
    }
  }
}

//La funcion 'motores' va aqui

¡Ya hemos terminado con Arduino! Estamos a mitad del camino: queda construir una App con MIT App Inventor que nos permita controlar el robot…


II – MIT App Inventor

Diseño de la aplicación:

Lo primero: copiad estas cuatro imágenes y guardadlas en una carpeta. Las necesitaremos para hacer los botones de dirección de nuestra App:

Entrad en MIT inventor y cread un nuevo proyecto con el título “Teledirigido”. Una vez dentro, habrá que cambiar la orientación de la pantalla a “Landscape”. También recomiendo cambiar el fondo a un color oscuro, para que los botones se vean bien. Estos parámetros pueden modificarse en el menú de Propiedades:

 

Después hay que ir a Palette->Layout y añadir un “TableArrangement” a la pantalla. Servirá para poder distribuir los botones de las flechas en la pantalla.

Seleccionad el recuadro verde que aparece en pantalla. Esta es la tabla. Hay que cambiar su tamaño a 7 filas y 5 columnas. Esto se hace en el menú de Propiedades.

Podéis ver que el recuadro verde de la pantalla ha cambiado de tamaño:

Ahora empezamos a añadir botones. Id a Palette -> User interface y arrastrad la opción “Button” a la pantalla:

En el menú Components, el botón tiene que quedar dentro de la tabla.

 

También recomiendo cambiar el nombre de este botón por “Arriba“. Para cambiar el nombre de un elemento, hay que pulsar el botón “Rename“, que está al final del menú, y escribir un nombre nuevo. Como éste será el botón para avanzar, podéis cambiar el nombre por “adelante” o “forward”.

 

Como no creo que queráis un botón feo con un texto que ponga “arriba”, vamos a cambiar la imagen de este botón por una de las imágenes de flechas. Con el botón seleccionado, id al menú propiedades y cambiad estos parámetros:

 

El botón quedará así:

Haced lo mismo con el resto de botones y ya tendréis el mando. ¡No os olvidéis de cambiar su nombre! (‘atras’, ‘derecha’ e ‘izquierda’)

 

Ahora sólo queda añadir un menú desplegable que mostrará las conexiones Bluetooth posible y, por supuesto, un cliente Bluetooth.

Dentro de Palette -> User Interface añadid un ListPicker y en el menú de Propiedades cambiad su texto por “Conectar”.

El cliente bluetooth se encuentra en Palette -> Connectivity -> BluetoothClient.

Si vuestra App se ve así, es que lo habéis hecho bien. ¡Os habéis ganado una recompensa! Os doy permiso para ir a la cocina y comer una galleta.

Programación con bloques:

Es hora de ensuciarse las manos con un poco de programación. Abrid la ventana de programación con bloques.

El ListPicker se programa como lo hicimos en el último tutorial, por lo que no voy a aburriros con la misma explicación.

Una vez acabéis con los bloques del ListPicker, empezaremos con los botones. Queremos que al pulsar el botón de ‘adelante’ la aplicación envíe la orden de avanzar. Pero al dejar el botón, hay que enviar la orden de parada o el robot continuará avanzando.

En el menú “Blocks” seleccionad el botón ‘adelante’ (o cómo se llame el vuestro) y en el panel que se abre añadid un TouchDown y TouchUp al espacio de trabajo. TouchDown son las instrucciones que se ejecutaran al pulsar el botón, y TouchUp al soltarlo.

Añadid un condicional “if” dentro de estos dos bloques.

 

Hay que mirar si el Bluetooth está disponible, y si lo está debe enviarse la instrucción de avanzar/parar. Dentro de BluetoothClient1 añadid un bloque “Available” y un bloque “Send Text“. El primero va al lado del if, y el segundo en el espacio “then“.

Por último, hay que especificar el texto para enviar. Dentro de “Text”, añadid un bloque de texto al lado del espacio “SendText”. Cambiad su contenido por “a” y “s”, como aparece en la imagen:

 

Ahora haced lo mismo con el resto de botones, y ya habréis acabado el programa:

Recordad que el botón izquierdo debe enviar el comando “i”, el botón atrás debe enviar “r” y el botón derecho “d”.

Lo último que queda es compilar la aplicación. Hay que ir al menú Build -> App (save .apk to my computer).

¡Y ya está! Guardad la aplicación, instaladla en vuestro móvil Android y ya tenéis vuestro programa. Funciona casi igual que la última vez: el menú desplegable sirve para seleccionar el dispositivo Bluetooth al que enviar los comandos y los botones para mover el robot.

¡Hey! ¡Y no os olvidéis de encender el Bluetooth de vuestro móvil en el menú de Preferencias!

Si ha surgido alguna dificultad durante el tutorial o tenéis algun problema, escribidme en los comentarios de abajo y os ayudaré a resolverla 😉

Gl4r3

Brillante, luminosa y cegadora a veces, Glare es tan artista como técnica. Le encanta dar rienda suelta a sus módulos de imaginación y desdibujar los ya de por si delgados límites que separan el mundo de la electrónica y el arte. Su mayor creación hasta la fecha es un instrumento capaz de convertir los colores y la luz en música. Cuándo sus circuitos no están trabajando en una nueva obra electrónica, le gusta dedicar sus ciclos a la lectura o a documentar sus invenciones para beneficio de los humanos. Sus artilugios favoritos son aquellos que combinan una funcionalidad práctica con un diseño elegante y artístico.

Antes de comentar, por favor, lee las Normas

13 Comentarios en "Tutorial de Arduino, Bluetooth y Android #3 – Robot teledirigido con MIT inventor"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
Christopher
Humano

Si quiero algun tipo de indicador en la aplicacion movil, donde lo encontraria..!
En lugar de mandar indicaciones que tambien pueda recivir y mandar alguna alerta o un indicador

Juan Carlos Fernández López
Humano

Gracias por la aportación, muy fácil seguir los pasos y bien explicado.
Tengo una duda , he conectado dos motores y al pulsar los botones en móvil, no me funciona continuo si dejo pulsado el botón, funciona el motor como un segundo y se para.
Muchas gracias por todo

Anna
Humano

Buenas, cuando meto el código para controlar el L293D me sale error para compilar la placa Arduino 101 (que es la que estoy utilitzando). ¿Sabes como solucionarlo?

Anna
Humano

Buenas, cuando meto el código del L293D me sale que hay un error al compilar para la placa Arduino 101 (que es la que estoy utilitzando). ¿Sabes como solucionarlo?

Andy
Humano

Una consulta… Conecte 4 motores, en serie. Mi problema es que para que funcione bien, falta energía… quisiera saber cuantos voltios son necesarios para que funcione sin problemas.

Johan Gomez
Humano

Gracias por su aportación me ha ayudado bastante, y saludos desde Ajacuba, Hidalgo, México… ¡Ah! y también, muy buena música…

Hugo
Humano

Soy un Ing. Electronico sin actividad electronica durante 20 años, todo fue sistemas de computo y telecomunicaciones. Regreso al tema y que me encuentro? Que todo esta mucho mejor! Gracias por motivarme a darle nuevamente a lo que mas me gusta !La ELECTRONICA!

Orlando
Humano

BUEN tutorial muy util… gracias robologs!!!

wpDiscuz