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...
No hay comentarios:
Publicar un comentario