sábado, 6 de febrero de 2016

Robot controlado por Bluetooth + aplicacion android (apk)


Materiales:

  • Kit motores reductores + llantas (esos chinos amarillos que venden en las tiendas de electrónica).
  • Modulo  driver de motor L298N.
  • Arduino (Uno, Nano, Mega, etc). (recomiendo el  nano por el tamaño reducido)
  • Modulo bluetooth hc05 0 hc06  (solo recibira datos desde el android para manejar el carrito).
  • Cables machos para protoboard ( para unir el circuito en el protoboard).
  • 1 switch, 1 led, 1 resistencia de 1K.
  • Un mini Protoboar. 
  • Ball Caster o rueda loca
  • Tornillos largos (para unir el ball caster o rueda loca al chasis)
  • Baterias de litio, lipo o kit de pilas con voltajes de 7.4v  a 9 v ( mayor a 5 V si no el arduino no  arrancara). 
  • Portapilas AA (si utilizas pilas, compra una que venga de 6 ,  o sino una de 4 y la otra de 2)
  • Celular o tablet android con conectividad bluetooth.
  • El chasis puede ser de acrilico, triplay (darle forma ).

La Forma del Chasis:

Hay que hacer un cuadrado y dentro de el hacer una circunferencia en la plataforma (acrilico, triplay, etc) .
 Luego cortar dos esquinas del cudrado, esto para colocar los motores y las llantas, hacerlo con mucho cuidado de no quebrar.
Los agujeros serviran para colocar tornillos que sujeten alos motores y ball caster o rueda loca.
Las baterias para ahorrar espacio se pueden colocar debajo.


El circuito electrónico:



Programa en Arduino:

En escencia lo que hace el el programa del arduino es recibir un caracter  y adicionalmente una bandera para indicar si es un dato de dirección("d") o de la velocidad("#") y los concatena. De esa manera se podra manejar mejor la comunicación.
Adicionalmente el control del robot tebnra una función para  aumentar o disminuir la velocidad.

////////
#include <SoftwareSerial.h>
#define motor_1_a    7
#define motor_1_r    8
#define motor_2_a    5
#define motor_2_r    6
#define pin_pwm1     9
#define pin_pwm2     10
#define led1         13
#define led2         11
int numero=0;
int direccion=0;
SoftwareSerial bluetooth(2, 3); // RX, TX
String readString="";
void motores(float pwm1,  float pwm2)
{
   int v1, v2;
   if(pwm1 >= 0) //para el motor 1
   {
     digitalWrite(motor_1_a, HIGH);
     digitalWrite(motor_1_r, LOW);
     v1 = pwm1;
   }
   else if(pwm1 < 0)
   {
     digitalWrite(motor_1_a, LOW);
     digitalWrite(motor_1_r, HIGH);
     v1 = pwm1 * (-1);
   }

   //para el motor 2
   if(pwm2 >= 0)
   {
     digitalWrite(motor_2_a, HIGH);
     digitalWrite(motor_2_r, LOW);
     v2 = pwm2;
   }
   else if(pwm2<0)
   {
     digitalWrite(motor_2_a, LOW);
     digitalWrite(motor_2_r, HIGH);
     v2 = pwm2 * (-1);
   }
analogWrite(pin_pwm1, v1);
analogWrite(pin_pwm2, v2);
}

void setup()
{
  delay(500);
  pinMode(led1,  OUTPUT);
  pinMode(led2,  OUTPUT);
  pinMode(motor_1_a,  OUTPUT);
  pinMode(motor_1_r,  OUTPUT);
  pinMode(motor_2_a,  OUTPUT);
  pinMode(motor_2_r,  OUTPUT);
  pinMode(pin_pwm1,  OUTPUT);
  pinMode(pin_pwm2,  OUTPUT);

  digitalWrite(led1,HIGH);
  delay(500);
  digitalWrite(led1,LOW);
  delay(500);
  digitalWrite(led1,HIGH);
  delay(500);
  digitalWrite(led1,LOW);
  delay(500);
  digitalWrite(led1,HIGH);
   delay(500);
   Serial.begin(9600);
 bluetooth.begin(9600);
}

void loop()
{

readString="";
while( bluetooth.available())
  {
    delay(2);
    char c=bluetooth.read();
    if(c=='#')//bandera velocidad
    {
       numero=readString.toInt(); //convierte cadena a entero numero
        numero=numero*2.54;
       Serial.println(numero);
     }
    if(c=='d')//bandera direccion
    {
      direccion=readString.toInt();
      Serial.print("dato direccion ");
       Serial.println(direccion);
    }  
 
    readString+=c; //concatena datos que llegan
  }
        if(direccion==0)   {digitalWrite(led2,LOW); motores(0,0);}
        if(direccion==1)   {digitalWrite(led2,HIGH);motores(numero,numero-5);}
        if(direccion==2)   {digitalWrite(led2,HIGH);motores(-numero,-numero);}
        if(direccion==3)   {digitalWrite(led2,HIGH);motores(0,numero-3);}
        if(direccion==4)   {digitalWrite(led2,HIGH);motores(numero,0);}      
}





Aplicacion Android ".apk":

Lo que hace la aplicación es enviar caracteres numéricos  seguido de una bandera para identificar que tipo de dato es. Si es de dirección (avanzar=1, retroceder=2, izquierda=3, derecha=4) adicionando la bandera "d" que indicara que es justamente de direccion. Si no se preciona nada, entonces enviara "0" (detenido). De esta forma el robot funcionara si solamente es presionado algún boton de direccion.
Ln el slider de velocidad la logica es similar, pero en este caso enviara datos numerico que van desde 0 hasta 255, que justamente es el pwm con el cual variaremos la velocidad en el arduino, seguido de la bandera "#" que justamente identifica que es un dato de direccion.
Todo esos datos son enviados mediante la rutina  call bluetoothClient como se nota en la imagen.

Puedes descargarlo desde aqui : apk carrito bluetooth
clave de cifrado: !H2nwlNrYYt_EaM-xcvGrmQKe1VcPZl8lv_xcqZQKjkI

Imagen de la aplicacion desde dispositivo android:


Nota: antes de presionar los botones, primero hay que conectarse con el modulo bluetooth desde el botón correspondiente, sino dara un mensaje de error.