Coche robot 4×4 autónomo – Parte II

¡Hola amig@s robóticos! ¿Qué tal ha ido el verano? ¿Habéis practicado mucho? Nosotros hemos aprovechado para hacer mucho I+D y preparar prácticas que os puedan servir para llevar el aula.

Vamos a comenzar el curso en el mismo punto donde lo dejamos: la creación de un coche 4×4 autónomo. En esta ocasión le vamos a añadir un sensor tipo “siguelíneas” que le dará autonomía en los trazados que nosotros elijamos.

Resultado de imagen de sensor sigue lineas

Este tipo de sensores en realidad son sensores infrarrojos y están compuestos de un LED infrarrojo y un fototransistor, de forma que el LED actúa como emisor y el fototransistor como receptor. El LED infrarrojo emite luz infrarroja, y si choca contra una superficie blanca se reflejará y llegará al fototransistor. Si la superficie es negra, no llegará al fotorreceptor. Por esta razón se suelen realizar montajes de líneas negras sobre fondo blanco ya que podremos detectar si se sale por la derecha o por la izquierda de la línea y de esta forma programar sus movimientos correctores.

 

En nuestro coche añadiremos dos sensores en la parte inferior delantera de nuestro coche para comprobar si se sale del trazado por la izquierda o por la derecha y así poder programar giros hacia el interior del trazado.

 

El primer montaje nos servirá para comprobar el modo de funcionamiento de este sensor. Conectaremos la salida de valores del infrarrojos hacia el Arduino en el pin 8:

 

El código sería el siguiente:

int IR = 8; //Entrada digital conectada al sensor infrarrojo

void setup()
{
Serial.begin(9600);
pinMode( IR , INPUT) ; //Sensor infrarrojo como entrada
}

void loop()
{
int valor = digitalRead(IR) ; //leemos el valor del sensor infrarrojo
Serial.println(valor);
}

Activando la consola podremos ver cómo al enfocar el sensor hacia por ejemplo un tablero blanco nos devuelve el valor «0» y al enfocarlo hacia un color negro nos da un valor «1». Sabiendo qué es blanco y qué es negro (0 y 1) podremos programar nuestros giros en el montaje definitivo.

La programación del montaje final es muy sencilla puesto que sólo tenemos que añadir dos variables para recoger el estado de los infrarrojos. En el caso por ejemplo que el sensor de la derecha nos esté dando un valor 0, significa que se está saliendo por ese lado (color blanco) y por lo tanto tendremos que hacer un giro a la izquierda para que vuelva a entrar en el trazado.

En el caso de que no se salga del trazado seguirá avanzando y si por algún casual se sale completamente del trazado entonces el coche se detendrá. Veamos el código en detalle:

 

#include <AFMotor.h>

AF_DCMotor Motor1(1);
AF_DCMotor Motor2(2);
AF_DCMotor Motor3(3);
AF_DCMotor Motor4(4);

int Vel = 160 ; // Define la velocidad base del Rover
int IRDerecha= 36; //Siguelineas derecha
int IRIzquierda= 45; //Siguelineas izquierda

 

void setup()
{
Serial.begin(9600);
// Usaremos el pin 34 para 5V del siguelineas derecho
pinMode(34, OUTPUT) ;
digitalWrite(34, HIGH) ;
pinMode(IRIzquierda,INPUT);

// Usaremos el pin 43 para 5V del siguelineas izquierdo
pinMode(43, OUTPUT) ;
digitalWrite(43, HIGH) ;
pinMode(IRDerecha,INPUT);
}

void loop()
{

 

int valor1 = digitalRead(IRIzquierda) ; //leemos el valor del sensor infrarrojo
//Serial.println("ValorIzquierda");
Serial.print(valor1);Serial.print(" - ");
int valor2 = digitalRead(IRDerecha) ; //leemos el valor del sensor infrarrojo
//Serial.println("ValorDerecha");
Serial.println(valor2);

//Si esta entre la linea , avanzamos...
if (valor1 == 0 && valor2 == 0){
Avance();
}
//Si el siguelineas derecho se esta saliendo de la linea , giramos Izquierda
if (valor1 == 1 && valor2 == 0){
giroIzquierda();
}
//Si el siguelinas izquierdo se esta saliendo de la linea , giramos Derecha
if (valor1 == 0 && valor2 == 1){
giroDerecha();
}

//Si por algun motivo se sale de la linea , paramos el coche
if (valor1 == 1 && valor2 == 1){
Paro();
}

//delay(50);
}

 

void SetVel(int v1, int v2, int v3, int v4)
{
Motor1.setSpeed(v1);
Motor2.setSpeed(v2);
Motor3.setSpeed(v3);
Motor4.setSpeed(v4);
}

void Avance()
{
SetVel(Vel,Vel,Vel,Vel);
Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
}

void Retroceso()
{
SetVel(Vel,Vel,Vel,Vel);
Motor1.run(BACKWARD) ;
Motor2.run(BACKWARD);
Motor3.run(BACKWARD);
Motor4.run(BACKWARD);
}

void Paro()
{ Motor1.run(RELEASE);
Motor2.run(RELEASE);
Motor3.run(RELEASE);
Motor4.run(RELEASE);
}

void giroDerecha()
{
SetVel(Vel,Vel,Vel,Vel);
Motor1.run(FORWARD) ;
Motor2.run(RELEASE);
Motor3.run(RELEASE);
Motor4.run(FORWARD);
}

void giroIzquierda()
{
SetVel(Vel,Vel,Vel,Vel);
Motor1.run(RELEASE) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(RELEASE);
}

 

Cómo se puede ver, el código es muy similar al utilizado en el proyecto anterior con el ultrasonidos, pero con la diferencia principal que añadimos las variables para los dos sensores, las instrucciones para recoger sus valores, y los respectivos IF para comprobar si se sale o no de nuestro trazado.

Por si quedara alguna duda de todo lo que acabo de contar, nuestro compañero Manuel Pérez nos cuenta en este video detallado todo el proceso de montaje y el código.

Como podéis ver, nuestro coche puede ser equipado con distintos sensores para añadir nuevas funcionalidades. Iremos viendo alguno más en la próxima entrega.

¡Nos vemos en quince días aprendices robóticos!

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *