8 ene. 2013

El coche con control remoto usando Arduino ya está aquí

Ya he hablado de diferentes elementos y cómo utilizarlos con nuestro Arduino. Experimentos con un sensor de distancias, con un receptor de infrarrojos para la comunicación, arranque, parada e inversión de giro en motores... Todo ello destinado a utilizarlos en el coche que hoy os muestro. Ha sido una larga espera hasta tener a disposición todos los elementos necesarios (ya que la gran mayoría proceden de China), sin embargo, el montaje y programación han resultado sencillos. Ahora que tengo un mejor conocimiento de Arduino, puedo decir que me ha impresionado su sencillez, gracias en buena parte al gran trabajo de la gran comunidad que tiene detrás y que proporciona librerías, documenta proyectos... Y hubiese sido más sencillo y rápido la construcción de éste coche de haberme percatado antes de los problemas que provocaban un funcionamiento incorrecto, ésto es, el ruido generado por los motores y la utilización de una sola fuente de alimentación para el circuito.
El aspecto final del coche se muestra a continuación

Aspecto final del coche con control remoto

En la siguiente imagen podéis apreciar también el mando que utilizo para controlarlo
Conjunto de mando a distancia y coche

Por último mostraros una vista más detallada del frontal del vehículo, en el que se puede apreciar el servo sobre el cuál reside el sensor de distancia
Parte frontal del coche en la que se encuentra el servo y el sensor de distancias

Y una última que muestra las conexiones de la placa de prototipos
Placa de prototipos con las conexiones realizadas
El funcionamiento es el siguiente:
Con el mando a distancia podemos enviar diferentes señales en función del botón pulsado. Estas señales son leídas utilizando el receptor de infrarrojos e interpretadas por Arduino, para realizar la acción oportuna. Las diferentes acciones son (por ahora), avance recto, avance recto lento, giro a derechas y giro a izquierdas. Esto se consigue controlando individualmente la velocidad de cada uno de los motores (mediante PWM). Al mismo tiempo, cuando el vehículo se encuentra en movimiento, el sensor de distancia chequea si hay algún objeto cercano, en cuyo caso, para evitar la colisión, se procede a tomar la decisión de modificar el sentido de avance del coche. Como el sensor de distancias "ve" a los objetos que tiene justamente enfrente (tiene un ángulo de visión pequeño), se ha optado por colocarlo encima de un servo que permita girarlo, haciendo un barrido en función del sentido del movimiento del coche. Todas estas acciones se pueden ver en el vídeo a continuación
El código utilizado para lograr todo esto es:

/*Proyecto ArduinoCar utiliza un mando a distancia convencional para 
controlar remotamente un coche a escala con Arduino. Para el movimiento
del coche se utilizan motores independientes en la rueda izquierda (control
de la rueda conectado al pin 5) y la rueda derecha (control conectado al 6)
*/
//Libreria para comunicacion por infrarrojos
#include <NECIRrcv.h>
//Libreria para el sensor de distancias
#include <Ultrasonic.h>
//Libreria para el servo
#include <Servo.h>
//Pin al que se conecta el receptor infrarrojos
#define IRPIN 7
//Codigos del mando a distancia
#define OFF 3877142272
#define ON 4278222592
#define UNO 3893853952
#define DOS 3910565632
#define TRES 3927277312
//Inicializacion del sensor de ultrasonidos (trigger, echo)
Ultrasonic ultrasonic (8,9);
//Inicializacion del receptor infrarrojos
NECIRrcv ir(IRPIN);
//Inicializacion del servo
Servo servo;
//Variables globales a utilizar
unsigned long ircode;
unsigned long codigo;
//Setup inicial
void setup() {
  ir.begin() ;
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  //Control del servo conectado al pin 13
  servo.attach(13);
  servo.write(90);
}
//Bucle que se ejecutara continuamente
void loop() {
  //Si hay datos recibidos desde el control remoto, los capturamos
  while (ir.available()) {
    ircode = ir.read();
    //Dependiendo del boton pulsado realizamos una determinada accion
    switch (ircode){
    case OFF:
    //Paramos el coche
    codigo=OFF;
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    //El servo apunta al frente
    servo.write(90);
    break;
    case ON:
    codigo=ON;
    //El coche avanza recto
    digitalWrite(5,HIGH);
    digitalWrite(6,HIGH);
    servo.write(90);
    break;
    case UNO:
    //El coche tuerce a la izquierda
    codigo=UNO;
    analogWrite(5,160);
    digitalWrite(6,HIGH);
    //El servo apunta a la izquierda
    servo.write(150);
    break;
    case DOS:
    //El coche avanza recto a menor velocidad
    codigo=DOS;
    analogWrite(5,200);
    analogWrite(6,200);
    servo.write(90);
    break;
    case TRES:
    //El coche tuerce hacia la derecha
    codigo=TRES;
    analogWrite(6,160);
    digitalWrite(5,HIGH);
    //El servo apunta a la derecha
    servo.write(30);
    break;
    }
  }
  //Si detecta algun obstaculo a menos de 20 centimetros
  if (((ultrasonic.Ranging(CM))<=20) && (codigo!=OFF)){
    if (codigo==UNO){
      //Si el coche estaba torciendo hacia la izquierda, comienza a girar a la derecha
      digitalWrite(5,HIGH);
      digitalWrite(6,LOW);
      delay(200);
      //Devuelve el estado que tuviese
      analogWrite(5,160);
      digitalWrite(6,HIGH);
    }else if (codigo==TRES){
      //Si el coche estaba torciendo hacia la derecha, comienza a girar a la izquierda
      digitalWrite(5,LOW);
      digitalWrite(6,HIGH);
      delay(200);
      analogWrite(6,160);
      digitalWrite(5,HIGH);
    }else if (ircode==ON || ircode==DOS){
      //Si el coche avanzaba recto, realiza un giro mayor
      digitalWrite(5,LOW);
      digitalWrite(6,HIGH);
      delay(400);
      if (ircode==ON){
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
      }else {
        analogWrite(5,200);
        analogWrite(6,200);
      }
    }
  }
}

Por último comentar que tengo previsto introducir varias mejoras, alguna de ellas creo que bastante interesantes. La primera de ellas pasa por incluir la posibilidad de inversión de giro (aún no disponible debido a falta de componentes), la segunda consiste en añadir otro tipo de comunicación remota, bien por bluetooth o bien por radiofrecuencia, ya que la comunicación infrarroja tiene bastantes limitaciones y un último proyecto en el que Arduino utiliza sistema GPS para realizar un trazado de forma autónoma. Os mantendré informados...