jueves, 13 de marzo de 2014

BiRueda Autónomo (Adelante y Atrás)

          Vamos a empezar con el tema interesante, manejo de motores. Para Arduino existe un Shield Oficial para el control de motores, la Arduino Motor Shield:


          Como es un poco cara, me he decantado por una Shield no oficial para el control de motores, la Adafruit Motor Shield:


          Básicamente hace lo mismo, puede controlar motores DC, motores paso a paso y servomotores. Para ello hace uso de unas librerías que hay que meter en el IDE de Arduino. Para el caso en cuestión necesitaremos sólo la AFMotor.h con la que podremos controlar los dos motores DC uno para cada rueda del BiRueda que vamos a montar.

          El prototipo es realmente sencillo, tenemos que montar la Shield sobre la placa Arduino en los pines correspondientes (no hay peligro de equivocarnos, sólo encaja de una forma, no seáis brutos), enganchar los cables de cada motor en un módulo de control de motores de la Shield, colocando Vcc y Gnd en el lugar correspondiente. La alimentación se hará con una pila de 9V que conectaremos al Arduino, siendo necesaria ya que la potencia suministrada por el cable usb a Arduino es insuficiente la mayoría de las ocasiones para mover los motores.


          Una vez diseñado el prototipo lo montamos y le cargaremos el siguiente Sketch:



//Importamos la libreria AFMotor.h
#include <AFMotor.h>

//Creamos los dos motores que estan conectados al M1 y M2 respectivamente con una frecuencia de 64KHZ
AF_DCMotor motor(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);

int velocidad;

//Función 'Setup'
void setup(){
  //Ajustamos la una velocidad
  velocidad = 150;
  //Lo iniciamos parados
  motor.run(RELEASE);
  motor2.run(RELEASE);
  
  //Inicializamos Serial
  Serial.begin(9600);
  Serial.println("Test Motor");
}

//Función 'Loop'
void loop(){
  Serial.println("BiRueda Autonomo (Adelante y Atras Test)");

  //Le damos la velocidad a los motores
  motor.setSpeed(velocidad);
  motor2.setSpeed(velocidad);
  
  //Movimiento hacia delante
  motor.run(FORWARD);
  motor2.run(FORWARD);
  
  //Dejamos 2 segundos de movimiento
  delay(2000);
  
  //Paramos
  motor.run(RELEASE);
  motor2.run(RELEASE);
  
  //Dejamos 1 segundos de parado
  delay(1000);
  
  //Movimiento hacia atrás
  motor.run(BACKWARD);
  motor2.run(BACKWARD);
  
  //Dejamos 2 segundos de movimiento
  delay(2000);
  
  //Paramos
  motor.run(RELEASE);
  motor2.run(RELEASE);
  
  //Dejamos 1 segundos de parado
  delay(1000);
}

          Podemos comprobar la sencillez de uso de la librería: comenzamos cargándola para usar sus funciones. Tendremos que crear una instancia de AF_DCMotor para cada motor, indicando en que módulo esta conectado y a que frecuencia va a trabajar. En 'Setup' inicializamos los motores como parados y la velocidad que les vamos a dar. Ya en 'Loop' le damos la velocidad a los motores y hacemos la rutina de movimiento que es: adelante dos segundo, paramos un segundo, atrás dos segundo y paramos un segundo. Para indicar los estados de los motores se usan las constantes 'RELEASE', 'FORDWARD' y 'BACKWARD'. En el vídeo demostrativo podéis apreciar como funciona y se aprecia como la potencia de los motores DC usados no están calibrados, por lo que no va en línea recta, sino que se gira sólo. De momento no es preocupante para nuestro objetivo, puesto que es muy probable que sólo use un sólo motor DC para la tracción de MotorDroid. Sin más aquí lo podéis ver. Hasta la próxima: