martes, 18 de marzo de 2014

BiRueda Pulsador (Adelante y atrás)

          Muy bien, ya hemos visto como programar rutinas de movimiento (nada inteligentes) al vehículo BiRueda, pero lo que en principio nos interesa para el proyecto es poder mandar órdenes al vehículo. Para comenzar a enviar estos comandos vamos a usar una especie de mando con pulsadores sobre un breadboard que irá conectada directamente a Arduino.



          Como podéis ver, lo único que añadimos son las dos entradas de los pulsadores a Arduino, pines 22 y 23, con los que haremos que el BiRueda vaya Adelante o Atrás dependiendo de cual se pulse. En el caso de que no pulsemos ninguno o pulsemos los dos a la vez el vehículo permanecerá parado. Aquí podéis ver como es el sketh usado para este propósito:

//Importamos la libreria AFMotor.h
#include <AFMotor.h>
//Definimos los pines de los botones
#define ADELANTE    22
#define ATRAS       23
//Creamos los dos motores que están conectados a M1 y M2 respectivamente con frecuencia 64KHZ
AF_DCMotor motor(2, MOTOR12_64KHZ); 
AF_DCMotor motor2(1, MOTOR12_64KHZ);

//variable para la velocidad
int velocidad

//Función 'Setup'
void setup() {
  //Inicializamos Serial
  Serial.begin(9600);   
  Serial.println("BiRueda Pulsador (Adelante y atrás)");
  //Botones como entrada y abiertos
  pinMode(ADELANTE, INPUT);
  digitalWrite(ADELANTE, HIGH);
  pinMode(ATRAS, INPUT);
  digitalWrite(ATRAS, HIGH);
  //Le damos velocidad a los motores
  motor.setSpeed(255);
  motor2.setSpeed(255);
}

//Eventos de captura de los botones
//Botón adelante
boolean UP()
{
  //Si el pin está LOW quiere decir que está pulsado
  int up_pulsado = !digitalRead(ADELANTE);
  return up_pulsado;
}
//Botón atras
boolean DOWN()
{
  int down_pulsado = !digitalRead(ATRAS);
  return down_pulsado;
}
 
//Función 'Loop'
void loop() {
  //Obtenemos los eventos de cada botón usando las funciones implementadas
  boolean ad = UP();
  boolean at = DOWN();
  
  //Si los dos pulsadores están pulsados o no el BiRueda no se moverá  
  if ((ad == 1 && at==1) || (ad == 0 && at==0)){
    Serial.print(".");
    motor.run(RELEASE);
    motor2.run(RELEASE);
  }//Si sólo está pulsado ADELANTE
  else if(ad ==1){
    Serial.print("U");
    motor.run(FORWARD);
    motor2.run(FORWARD);
  }else if(at == 1){
    Serial.println("D");
    motor.run(BACKWARD);
    motor2.run(BACKWARD);
  }
  //Dejamos un retraso de 20 milisegundos
  delay(20);
}

          Como hemos visto en otros miniproyectos que usan pulsadores, necesitamos funciones para que capturen los eventos de pulsación de cada botón, que durante 'Loop' vamos comprobando para ver que comando debe ejecutar el BiRueda. Sin más os dejo con una demostración de su funcionamiento.