miércoles, 19 de marzo de 2014

BiRueda Pulsador (+Giro sobre sí mismo)

          Vamos a añadirle las funciones de giro en sentido horario y antihorario al vehículo BiRueda. Para ello necesitaremos un "mando" con más botones obviamente.


          Como podéis ver hay dos botones más. Los dos centrales son hacia adelante y hacia atrás, siendo los dos de los extremos el que gira en sentido horario y el otro el que gira en sentido antihorario. Para poder controlar el vehículo hay que añadir los eventos de pulsación de dichos pulsadores nuevos como veremos en el sketch.

//Importamos la libreria AFMotor.h
#include <AFMotor.h>
//Definimos los pines de los botones
#define ADELANTE    22
#define ATRAS       23
#define IZQUIERDA   24
#define DERECHA     25
//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 (+Giro sobre sí mismo)");

  //Botones como entrada y abiertos
  pinMode(ADELANTE, INPUT);
  digitalWrite(ADELANTE, HIGH);
  pinMode(ATRAS, INPUT);
  digitalWrite(ATRAS, HIGH);
  pinMode(IZQUIERDA, INPUT);
  digitalWrite(IZQUIERDA, HIGH);
  pinMode(DERECHA, INPUT);
  digitalWrite(DERECHA, 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;
}
//Botón izquierda
boolean LEFT()
{
  int left_pulsado = !digitalRead(IZQUIERDA);
  return left_pulsado;
}
//Botón derecha
boolean RIGHT()
{
  int right_pulsado = !digitalRead(DERECHA);
  return right_pulsado;
}
 
//Función 'Loop'
void loop() {
  //Obtenemos los eventos de cada botón usando las funciones implementadas
  boolean ad = UP();
  boolean at = DOWN();
  boolean iz = LEFT();
  boolean de = RIGHT();
  
  //Si los dos pulsadores de velocidad 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);
  }
  
  //Si los dos pulsadores de dirección están pulsados o no seguirá con la misma velocidad
  if ((iz == 1 && de == 1)|| (iz == 0 && de == 0)){
    motor.setSpeed(255);
    motor2.setSpeed(255);
  }//Giro en sentido horario
  else if(iz == 0 && de == 1){
    Serial.println("R");
    motor.run(BACKWARD);
    motor2.run(FORWARD);
    motor.setSpeed(155);     
    motor2.setSpeed(155);
  }//Giro en sentido antihorario
  else if(iz == 1 && de == 0){
    Serial.println("L");
    motor.run(FORWARD);
    motor2.run(BACKWARD);
    motor.setSpeed(155);   
    motor2.setSpeed(155);
  }
  
  //Dejamos un retraso de 20 milisegundos
  delay(20);
}
          Como podemos apreciar en el código del sketch, si los dos botones de giro está pulsados o no simultáneamente mantendremos la dirección del vehículo. En cambio cuando pulsemos uno, invertirá el giro de uno de los motores (el conveniente para el giro en el sentido deseado) y reduce la velocidad de los motores para la realización del giro. Sin más os dejo con el funcionamiento.