Robot teledirigido por bluetooth

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

El robot teledirigido que nosotros vamos a hacer está basado en el Robot sigue líneas con Arduino, tan solo que no vamos a usar sensores. En nuestro caso, el robot será manejado con el teléfono móvil.

Construcción del robot

Materiales

El chasis que verás en las fotos es específico, creado a medida por la empresa What's Next? para el proyecto [Robots Boost Skills]. El resto de componentes son genéricos y se pueden comprar Arduinos oficiales, What's Next Yellow o cualquier clon compatible.

Esta es la lista de materiales:

  • Chasis que permita 2 ruedas con motor DC analógicos y una rueda delantera.
  • 2 Motores DC analógicos con reducción y ruedas.
  • Arduino Uno o equivalente.
  • Arduino Motor Shield o alguno que tenga el mismo Chip L298
  • Baterías, entre 9V y 12V
  • Receptor bluetooth HC-06.
  • Teléfono móvil (En nuestro caso, con Android, bluetooth y una app como, por ejemplo, Arduino Bluetooth Controller)

Fotos

Este sería el esquema a montar:

Blue bb.png

Programación

Leyendo del receptor

Para empezar, vamos a probar que comunica nuestro bluetooth con el teléfono. Podemos cargar este programa:

Nunca cargar el programa con el bluetooth encendido en el Arduino, ya que usa los mismos puertos.
const int led = 13;
 
int option;
 
void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT); 
}
 
void loop(){
  //si existe información pendiente
  //delay(1000);
  if (Serial.available()>0){
    //leeemos la opcion
    char option = Serial.read();
    //si la opcion esta entre '1' y '9'
    if (option >= '1' && option <= '9')
    {
      //restamos el valor '0' para obtener el numero enviado
      option -= '0';
      for(int i=0;i<option;i++){
         digitalWrite(led, HIGH);
         delay(100);
         digitalWrite(led, LOW);
         delay(200);
         Serial.println(i);
      }
    }
  }
}

Ahora, conectamos el bluetooth, en nuestro caso la contraseña es 1234, y abrimos la opción de Terminal Mode donde podremos enviar el número que queramos y leer lo que envía. Al mismo tiempo, el LED integrado se encenderá las veces que marque nuestro número.

Moviendo las ruedas

Para mover las ruedas, podemos crear las funciones para ir hacia delante, atrás, izquierda y derecha:

void front(int time, int speed){
  digitalWrite(12, HIGH);  // Dirección de A
  digitalWrite(9, LOW);   // Quitar el freno de A
  analogWrite(3, speed);    // Establece la velocidad de A
  digitalWrite(13, LOW); // Dirección de B
  digitalWrite(8, LOW);   // Quita el freno de B
  analogWrite(11, speed);   // Establece velocidad de B
    delay(time);
}
void left(int time, int speed){
  digitalWrite(12, HIGH);   
  digitalWrite(9, LOW);   
  analogWrite(3, speed);   
  digitalWrite(13, LOW); 
  digitalWrite(8, HIGH);   
  analogWrite(11, 0);      // <-- Parar el motor B (velocidad 0)
    delay(time);
}
void right(int time, int speed){
  digitalWrite(12, HIGH);  
  digitalWrite(9, HIGH);   
  analogWrite(3, 0);    // <-- Para el motor A
  digitalWrite(13, LOW); 
  digitalWrite(8, LOW);   
  analogWrite(11, speed);    
    delay(time); 
}

Una vez creadas las funciones, podemos llamarlas en función de lo que el mando a distancia indique. Para ello, vamos a asociar un caracter del mando a un movimiento. Podemos usar el estándar de los juegos wasd:

    ↑
    w
← a s d →
    ↓

De esta manera, el algoritmo queda así:

const int led = 2;

void back(int time, int speed){
  digitalWrite(12, HIGH);  // Dirección de A
  digitalWrite(9, LOW);   // Quitar el freno de A
  analogWrite(3, speed);    // Establece la velocidad de A
  digitalWrite(13, LOW); // Dirección de B
  digitalWrite(8, LOW);   // Quita el freno de B
  analogWrite(11, speed);   // Establece velocidad de B
    delay(time);
}
void front(int time, int speed){
  digitalWrite(12, LOW);  // Dirección de A
  digitalWrite(9, LOW);   // Quitar el freno de A
  analogWrite(3, speed);    // Establece la velocidad de A
  digitalWrite(13, HIGH); // Dirección de B
  digitalWrite(8, LOW);   // Quita el freno de B
  analogWrite(11, speed);   // Establece velocidad de B
    delay(time);
}
void left(int time, int speed){
  digitalWrite(12, LOW);   
  digitalWrite(9, LOW);   
  analogWrite(3, speed);   
  digitalWrite(13, HIGH); 
  digitalWrite(8, HIGH);   
  analogWrite(11, 0);      // <-- Parar el motor B (velocidad 0)
    delay(time);
}
void right(int time, int speed){
  digitalWrite(12, LOW);  
  digitalWrite(9, HIGH);   
  analogWrite(3, 0);    // <-- Para el motor A
  digitalWrite(13, HIGH); 
  digitalWrite(8, LOW);   
  analogWrite(11, speed);    
    delay(time); 
}

 
void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT); 
   //Setup Channel A
 pinMode(12, OUTPUT); //Inicia el pin del Motor A
 pinMode(9, OUTPUT); //Inicia el freno del Motor A
 //Setup Channel B
 pinMode(13, OUTPUT); //Inicia el pin del Motor B
 pinMode(8, OUTPUT);  //Inicia el freno del Motor B
}
 
void loop(){
  //si existe información pendiente
  //Serial.println("Blue");
  //delay(1000);
  if (Serial.available()>0){
    //leeemos la opcion
    char option = Serial.read();
    //si la opcion esta entre '1' y '9'
    if (option == 'a') { left(150,100); }
    if (option == 'w') { front(150,100); }
    if (option == 's') { back(150,100); }
    if (option == 'd') { right(150,100); }
  }
}

Enlaces

Tutorial de cómo conectar

Tutorial de conectar y monitorizar