18 agosto 2013

Controlando Arduino vía Bluetooth desde Android Pt.1

Hace casi dos semanas, les compartíamos un pequeño tutorial donde les explicaba rápidamente el funcionamiento de un puente H y su utilización en el control de la dirección de motores DC.

Si recuerdan un poco, les mencioné en ese momento que la idea era armar un carro a control remoto que pudiéramos controlar desde bluetooth a través de una aplicación en Android.

En esta entrada revisaremos la sencilla construcción del módulo controlador del carrito y les mostraré rápidamente como probar la conexión Bluetooth del Arduino en Android con un software gratuito que pueden encontrar en la PlayStore.

En los próximos días les estamos preparando un tutorial en conjunto con los amigos de AndroiSensei donde les mostraremos como programar la aplicación que se encargará de controlar el carrito en Android.


¡Comencemos!



Diseño del sistema


Algo que nos ayudará mucho a construir nuestro carrito Bluetooth es hacer un pequeño diagrama de los distintos bloques funcionales. La siguiente imagen muestra los componentes que utilizaremos y nos indicará de manera general las conexiones que utilizaremos al momento de construirlo.


El diseño es sumamente sencillo: Tendremos el Arduino Nano justo enmedio actuando como sistema de control del carro conectado a un módulo Bluetooth que nos servirá para enviar enviar comandos y recibir información del estado.

Ya que el carro hace uso de dos motores DC para controlar la dirección y el desplazamiento necesitaremos dos puentes H conectados a las líneas D3...D6 y D9...D12.

Aunque no lo revisaremos en esta entrada, nos quedan cuatro líneas libres que podemos utilizar para activar otros actuadores o conectar otros sensores  y todas las líneas análogas si por ejemplo quisieramos leer el nivel de la batería.

Debo aceptar que no es el diseño más "compacto" y prometo diseñar  una versión más sencilla para una futura versión del carro.

¿Por qué cuatro líneas en vez de solo dos y una compuerta lógica inversora?

Por una razón muy simple: Modulación de pulsos.

Si bien en esta entrada solo vamos a examinar el funcionamiento general invirtiendo la polaridad de la alimentación de los motores con los puente H. Para el próximo tutorial queremos modular también la velocidad/fuerza de desplazamiento del motor DC y una forma fácil de hacerlo es por medio de modulación de pulsos.

El Arduino Nano soporta modulación de pulsos por medio de la función analogWrite en los pines 3,5,7,9 y 11. Para modular la fuerza del motor podemos activar uno de los transistores que queden en serie y al segundo enviarle un tren de pulsos que provocará un cambio en la carga del motor DC.

El diagrama eléctrico


Al detallar nuestro diagrama de bloques tendremos algo como lo siguiente:

Se que se ve un poco complicado pero realmente es muy sencillo. Revisemos los componentes de izquierda a derecha:

Fuente de poder


El voltaje para operar el circuito lo obtendremos de un arreglo de 4 baterías Alcalinas AA que proveen de 1.5V. Obtenemos de las baterías dos voltajes, sacando una línea de las dos primeras baterías tenemos 3V que servirán para alimentar los puentes H y una segunda línea del arreglo de las cuatro baterías para obtener 6V.

La línea de 6V la conectaremos al pin VIN de nuestro Nano. Esto lo hacemos de esta manera para que pase por el regulador de voltaje de la placa. Me preguntarán ¿Por qué no he utilizado la salida regulada de 3.3V de la placa Nano.

La razón es que quería tener las fuentes de alimentación "separadas" solo en caso de que hubiera algún accidente,  así si por ejemplo hubiera un cortocircuito en algún momento el puente H la corriente circularía directamente de la batería y no pasaría por el Arduino Nano reduciendo las posibilidades de que este resulte dañado.

Puentes H


No entraré en muchos detalles sobre el puente ya que lo hemos revisado en una entrada anterior. Pero seguramente han notado que la única diferencia es que el puente que controla el motor de tracción utiliza resistencias de 680Ohm.

¿Por qué? Una confusión. Cuando fuí a comprar las resistencias no las revisé en el momento y al llegar a mi casa me percaté que eran de 680Ohm en vez de las de 1KOhm que había solicitado.

Así que decidí re-calcular la corriente máxima que podría circular por el puente H  utilizando las resistencias de 680Ohm y los transistores 2N2222 y es de 633mA. Inferior al 1A máximo que puede circular por el transistor según la hoja técnica así que es bastante seguro. Además esto es suficiente para los pequeños motores DC que deseo controlar así que decidí utilizarlas en vez de reemplazarlas por las de 1K.

Para el control de dirección mantuve las resistencia de 1K que limitarán la corriente del puente H a cerca de 460mA y a decir verdad funciona a la perfección.

Arduino Nano y Módulo bluetooth


Esta es la parte más sencilla ya que únicamente debemos conectar las líneas de datos correspondientes al Nano y el módulo bluetooth al puerto UART. Solo hay que tener cuidado de cruzar las líneas TX y RX o de lo contrario no podremos comunicarnos con el módulo.

Reemplazando la tableta controladora original


Para este paso solo necesitan un poco de creatividad, no voy a entrar en muchos detalles, prefiero mostrarles unas fotos del proceso desde la tableta perforada hasta el módulo final montado.

Módulo de RC original.

Tableta perforada cortada a la medida del módulo original.

Midiendo la ubicación de los componentes.

Colocando los conectores para los motores DC.

Reposicionando el Arduino Nano para la colocación del módulo bluetooth.

Colocando los puentes H con sus respectivas resistencias.

Una foto del módulo casi terminado, solo hasta este punto solo restaba agregar las líneas de control para los puentes H. 

Aquí pueden ver las líneas que controlan los puentes H, disculpen el desorden ya era tarde y tenía sueño.
 

El código en Arduino


Vamos a reutilizar el código de la entrada anterior y para simplificar la lectura del código vamos a escribir varias funciones asociadas a cada una de las siguientes acciones:

  • Adelante (FORWARD): Provocará que puente H de control de tracción se active de tal manera que el carrito se mueva hacia adelante.
  • Reversa (REVERSE): Provocará que el puente H de control de tracción se active de tal manera que el carrito se mueva en reversa.
  • Alto (STOP): Desactivará todos los transistores en el puente H provocando que el motor se detenga.
  • Derecha (RIGHT): Provocará que el puente H del control de dirección se active de tal manera que la dirección se oriente a la derecha.
  • Izquierda (LEFT): Provocará que el puente H del control de dirección se active de tal manera que la dirección se oriente a la izquierda .
  • Centrar (CENTER): Desactivará todos los transistores en el puente H provocando que la dirección regrese al centro.

Código de control de los puentes H:
 // Definimos a las líneas a las que se encuentran
// conectados los puentes H
#define M1A 9
#define M1B 10
#define M1C 11
#define M1D 12
#define M2A 3
#define M2B 4
#define M2C 5
#define M2D 6

// Buffer para almacenar los textos de control
#define BUFFSIZE 255 

void setup() {
  //Configuramos todos los pines de control como output
  pinMode(M1A, OUTPUT); 
  pinMode(M1B, OUTPUT); 
  pinMode(M1C, OUTPUT); 
  pinMode(M1D, OUTPUT); 
  pinMode(M2A, OUTPUT); 
  pinMode(M2B, OUTPUT); 
  pinMode(M2C, OUTPUT); 
  pinMode(M2D, OUTPUT); 
  
  // Iniciamos el serial al que está conectado el módulo bluetooth
  Serial.begin(9600);
}

// FORWARD
void go_forward() {
  digitalWrite(M1A,LOW);
  digitalWrite(M1B,HIGH);
  digitalWrite(M1C,HIGH);
  digitalWrite(M1D,LOW);
}

// REVERSE
void go_reverse() {
  digitalWrite(M1A,HIGH);
  digitalWrite(M1B,LOW);
  digitalWrite(M1C,LOW);
  digitalWrite(M1D,HIGH);
}

// STOP
void stop_motor() {
  digitalWrite(M1A,LOW);
  digitalWrite(M1B,LOW);
  digitalWrite(M1C,LOW);
  digitalWrite(M1D,LOW);
}

// RIGHT
void turn_right() {
  digitalWrite(M2A,HIGH);
  digitalWrite(M2B,LOW);
  digitalWrite(M2C,LOW);
  digitalWrite(M2D,HIGH);
}

// LEFT
void turn_left() {
  digitalWrite(M2A,LOW);
  digitalWrite(M2B,HIGH);
  digitalWrite(M2C,HIGH);
  digitalWrite(M2D,LOW);
}

// CENTER
void center_wheels() {
  digitalWrite(M2A,LOW);
  digitalWrite(M2B,LOW);
  digitalWrite(M2C,LOW);
  digitalWrite(M2D,LOW);
}

Para recibir los comandos re-utilizaremos las funciones que definimos en la entrada sobre Utilizando el módulo de serie Bluetooth en Arduino. Estas funciones nos ayudaran a rellenar un pequeño buffer con los comandos a leer y a vaciarlo (flush) en caso de que se llene.

Código para manejo del buffer:
char buffer[BUFFSIZE];
int i = 0;

void flush_buffer() {
  Serial.write((const uint8_t*)buffer,i);
  for(int j=0;j<=i;j++) {
    buffer[j] = 0;
  }
  i = 0;
}

void append_buffer(char c) {
  if(i<BUFFSIZE) {
    buffer[i++] = c;
  } else {
    flush_buffer();
  }
}

La lógica del loop principal es bastante simple:
  • Cada vez que recibamos un carácter se almacena en el buffer y se imprime de regreso al puerto serie (para poder visualizar los comandos enviados).
  • Si se recibe un fin de línea se compara el texto almacenado con las "palabras clave" con la función strstr.
  • Si la palabra clave está contenida en el buffer se ejecuta el comando correspondiente, si no, se continúa con la ejecución.
  • Cada vez que se recibe un fin de línea, se imprime un fin de línea de regreso.
Código fuente del loop principal:
void loop() {
  while(Serial.available()>0) {
    char c = Serial.read();
    append_buffer(c);
    Serial.write(c);
    if(c=='\r'||c=='\n') {
       if(strstr(buffer,"FORWARD")!=0) {
          go_forward();
       }
       if(strstr(buffer,"REVERSE")!=0) {
          go_reverse();
       }
       if(strstr(buffer,"STOP")!=0) {
          stop_motor();
       }
       if(strstr(buffer,"LEFT")!=0) {
          turn_left();
       }
       if(strstr(buffer,"RIGHT")!=0) {
          turn_right();
       }
       if(strstr(buffer,"CENTER")!=0) {
          center_wheels();
       }
       flush_buffer();
       Serial.write("\r\n");
    }
  }
}

Antes de continuar recuerda que deberás programar el Arduino Nano mientras está desconectado al módulo. Si no lo haces así el módulo bluetooth podría interferir con la programación generando errores en el Arduino IDE.

Probando todo


Hasta este punto, si hemos armado todo correctamente ya estamos listos para conectar y probrar.

Para hacer las pruebas desde Android utilizaremos la App BlueTerm, este es un emulador de terminal que nos permite comprobar las conexiones serie vía bluetooth como se muestra en los siguientes screenshots:

Selecciona del menú "Conectarse a un dispositivo":


Elije el módulo "BT_ARDUINO", es posible que en tu caso se muestre con un nombre diferente como por ejemplo "LINVOR".


Ingresa el PIN del módulo. Si no lo has modificado debería de ser "1234".


Espera a que aparesca el mensaje "Conectado <dispositivo>" para comenzar a enviar los comandos.

Luego puedes comenzar a ingresar los comandos, para que sean procesados por el Arduino solo tienes que presionar [ENTER].


Si te equivocas al escribir un comando, presiona [ENTER] e intenta nuevamente en la siguiente línea. Recuerda que los caracteres se van leyendo al momento que se ingresan así que no hay forma de "borrar" si te has equivocado.

Es muchísimo más fácil de verificar si está funcionando bien si revisas el siguiente video:


Concluyendo


Este es un proyecto rápido que se puede armar en 3 o 4 días. Lo que más toma tiempo es el montaje de la tableta controladora por la cantidad de conexiones y las soldaduras que hay que realizar.

La parte buena es que los puentes H que hemos utilizado en este tutorial puedes utilizarlos fácilmente para controlar motores DC de 3V cuyo consumo no supere los 600mA.

Por ahora los dejaré hasta aquí y mantenganse pendientes ya que la segunda parte de este tutorial tratará de como hacer una aplicación para Android desde cero para que podamos controlar nuestro carro. Este tutorial no lo publicaremos en esta página sino que en el sitio web de nuestros amigos de Android Sensei.

Así que muy pendientes y por el momento sin nada más que decir...

¡Hasta la próxima!

Materiales

  • 1x Arduino Nano
  • 1x Módulo Bluetooth JY-MCU
  • 8x Transistores 2N2222
  • 4x Resistencias 680 Ohm 1/4W
  • 4x Resistencias 1K Ohm 1/4W
  • 1x Tableta perforada
  • Cable UTP suelto
  • 4x Baterías alcalinas AA
  • 1 carro de juguete a control remoto (Verificar que use motores DC para dirección y tracción)

10 comentarios:

carlos julian dijo...

excelente y funciona muy bien

walterr ferroni dijo...

que app mejorada puedo usar sin problema?

walterr ferroni dijo...

es decir, sin escribir los comandos

Max dijo...

Hola amigo, me parece un proyecto excelente y la idea la queremos utilizar para un proyecto de la escuela. La cosa es que nos surge la duda de la dirección del carro, ¿cómo puede ser controlada con un motor de ese tipo? Es lo único que nos falta conocer para empezar a realizarlo. De antemano, gracias.

romina delgado dijo...

hola una pregunta en vez de utilizar el bluetooht para moverlo... quisiera hacerlo ateravez de un detector de luz tenes idea de como? desde ya gracias

carlos montes dijo...

Buen día

Este dispositivo se podrá utilizar en un carrito montable para niños? los motores, el de avance como el del volante, se alimentan de una bateria de acido-plomo de 6v 4.5ah. gracias

euge uriarte dijo...

hola esta muy bueno este proyecto.... quise realizarlo pero la aplicación no me lee los comandos, habra algo mal en el programa?

Vito Kadavar dijo...

Hola!
Estoy intentando realizar este proyecto, he hecho todo paso a paso, pero al momento de conectarlo con la aplicación BlueTerm, no me sincroniza.
Sin embargo, sí logra sincronizar desde el teléfono. No sé qué podría estar sucediendo. ¿Sabes a qué se debe?

yuri cerezo villasante dijo...

puedo hacerlo con un arduino mega?

Miguel Reyna dijo...

puede ser cualquier modulo bluetooth o solo tiene que ser el especificado