viernes, 21 de enero de 2011

Robot Seguidor de Linea con ARDUINO

Este blog ha sido creado con la finalidad compartir paso a paso como desarrollar un robot seguidor de linea negra utilizando una placa de ARDUINO UNO, la construcción es muy sencilla al igual que la programación, cabe mencionar que este diseño gano el concurso de robótica RACEBOT.T. IEEE 2010 llevado a cabo en el Instituto Tecnológico de Toluca

1. Materiales Utilizados en el proyecto.



- Una tarjeta ARDUINO UNO (cualquier versión sirve)



- Circuito Integrado L293B


- Dos moto-reductores (se adaptaron unos de un robot de juguete que tenia de niño pero pueden utilizar unos como estos cuestan al rededor de $60.00 pesos)




- 8 diodos 1n4148


- 5 Sensores óptico-refletcivos QRD1114


- Ruedas. Para construir este robot se emplearon 2 ruedas fueron compradas en una tienda de electrónica y una rueda loca que diseño con piezas de mecano

- Y lo mas importante ¡¡MUCHA IMAGINACIÓN!!
Añadir imagen

2. Construcción de la base del robot

Esta parte del proyecto es muy importante ya que de ella depende la movilidad del robot así como de su rigidez para soportar los elementos electrónicos que posteriormente se integrarán a el.

Se eligió como soporte un pequeño trozo de acrílico de 3mm de espesor y aproximadamente 20cm de largo y 10cm de ancho; el acrílico es muy fácil de manejar de hecho se puede cortar con un cutter y una regla repasando varias veces sobre el.

La rueda loca (llamada graciosamente así) es una rueda igual a la que usan los carritos de supermercado y las sillas de oficina (igual en concepto, no físicamente) esta tiene un movimiento libre de 360º que facilita los giros del robot; la rueda loca implementada en este proyecto fue construida con piezas de mecano y una llanta de un carrito de juguete; pero también se pueden encontrar en tiendas de electrónica o robótica unas muy bonitas y no tan pesadas. A continuación muestro una foto de la rueda.

Y por último pero no menos importante la parte de tracción del robot; constituida por los dos moto-reductores y sus respectivas ruedas, cada uno de estos puede ser controlado independientemente y son los que le dan dirección al robot, cabe destacar que si uno gira en sentido opuesto al otro respectivamente se puede obtener un giro de 360º sobre el eje del robot, lo que permite un amplio rango de movimiento.

Este es el aspecto final de la construcción del chasis del robot seguidor de linea que hemos bautizado BICHIBOT XD



jueves, 20 de enero de 2011

3. Diseño del driver para los motores.



En esta etapa de la construcción del robot BICHIBOT trata sobre el diseño de un controlador bidireccional para motores de corriente directa, que esta constituido de un Circuito Integrado L293B.

El L293B (datasheet) es un driver de 4 canales capaz de proporcionar una corriente de salida de hasta 1A por canal. Cada canal es controlado por señales de entrada compatibles TTL y cada pareja de canales dispone de una señal de habilitación que desconecta las salidas de los mismos.

Dispone de un pin para la alimentación de las cargas que se están controlando, de forma que dicha alimentación es independiente de la lógica de control.

La siguiente imagen describe la conexión básica de un motor al driver y en la tabla se muestra las señales de control, +Vs es el pin de alimentación de los motores

imagen y tabla de Carlos Canto Q.

La conexión del circuito aparece en el siguiente diagrama esquemático, los motores se conectan a los pines OUT1 y OUT2 para el primer motor y OUT3 y OUT4 para el segundo. Los diodos (1N4148) que van conectados a los motores son de protección contra sobrecorrientes de retorno debido a la conmutación de las bobinas de los mototes; evitando asi un sobrecalentamiento o posibles daños al driver.

Nota: El diagrama incluye un regulador de voltaje 7805, podemos descartarlo en el diseño ya que la placa de arduino cuenta con un regulador y pines que entregan 3.3V y 5V pero si se desea incluir algunos componentes extras es recomendable alimentarlos mediante la salida de este regulador para no sobrecargar al Arduino.

Para facilitarles la vida PDF listo para imprimir y hacer el PCB del diagrama anterior!!!! CLICK AQUÍ

miércoles, 19 de enero de 2011

Manual de ARDUINO en Español!!!!!!!

Para saber mas aqui les dejo este manual creado por Rafael Enríquez Herrador espero que les sirva es muy facil de entender y a mi parecer viene muy bien explicado Download

martes, 18 de enero de 2011

4. Programa para el Robot Seguidor de Linea.

El programa hecho para este robot es muy básico y puede ser modificado para mejorar el control del robot, se puede agregar auto ajuste de sensibilidad a la luz de los sensores, medidor de nivel de batería, algún sonido o cualquier otra cosa útil en el desempeño del robot.

int Sen1 = 0; //Extremo izquierdo
int Sen2 = 1; //Izquierdo
int Sen3 = 2; //Centro
int Sen4 = 3; //Derecho
int Sen5 = 4; //Extremo Derecho

int Val1 = 0; // Valor de los sensores
int Val2 = 0;
int Val3 = 0;
int Val4 = 0;
int Val5 = 0;
//Control de los motores
int Azul = 6;
int Gris = 9;
int Cafe = 10;
int Negr = 11;

int x = 650; //Diferencia entre negro y blanco (Valor > x = Negro).

int Vel0 = 100;
int Vel1 = 155; // Especificar velocidad de
int Vel2 = 190; // motores en el giro.
int Vel3 = 230;
int Vel = 255;

void setup()
{
pinMode(Azul, OUTPUT);
pinMode(Gris, OUTPUT);
pinMode(Cafe, OUTPUT);
pinMode(Negr, OUTPUT);
Serial.begin(9600);
}
void loop()
{
//Lectura y registro de los valores de los sensores
Val1 = analogRead(Sen1);
Val2 = analogRead(Sen2);
Val3 = analogRead(Sen3);
Val4 = analogRead(Sen4);
Val5 = analogRead(Sen5);
//Direccionamiento del robot
if ((Val1 < x)&&(Val2 < x)&&(Val3 > x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel);
analogWrite(Negr, Vel);
}
else if ((Val1 < x)&&(Val2 > x)&&(Val3 > x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel1);
analogWrite(Negr, 0);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 > x)&&(Val4 > x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel1);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 < x)&&(Val4 > x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel2);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 < x)&&(Val4 > x)&&(Val5 > x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel3);
}
//*********!!!!!!!!!
else if ((Val1 < x)&&(Val2 < x)&&(Val3 < x)&&(Val4 < x)&&(Val5 > x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel);
}
else if ((Val1 < x)&&(Val2 > x)&&(Val3 < x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel2);
analogWrite(Negr, 0);
}
else if ((Val1 > x)&&(Val2 > x)&&(Val3 < x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel3);
analogWrite(Negr, 0);
}
else if ((Val1 > x)&&(Val2 < x)&&(Val3 < x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel);
analogWrite(Negr, 0);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 > x)&&(Val4 > x)&&(Val5 > x))
{
analogWrite(Azul, 0);
analogWrite(Gris, Vel);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel2);
delay(250);
}
else if ((Val1 > x)&&(Val2 > x)&&(Val3 > x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, Vel);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel2);
analogWrite(Negr, 0);
delay(250);
}
else if ((Val1 > x)&&(Val2 < x)&&(Val3 > x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, Vel);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel2);
analogWrite(Negr, 0);
delay(250);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 > x)&&(Val4 < x)&&(Val5 > x))
{
analogWrite(Azul, 0);
analogWrite(Gris, Vel);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel2);
delay(250);
}
else if ((Val1 > x)&&(Val2 > x)&&(Val3 > x)&&(Val4 > x)&&(Val5 > x))
{
analogWrite(Azul, Vel);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel2);
analogWrite(Negr, 0);
delay(250);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 < x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, Vel);
analogWrite(Gris, Vel);
analogWrite(Cafe, 0);
analogWrite(Negr, 0);
delay(200);
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel);
analogWrite(Negr, Vel);
}
}

4. Sensores para la detección de la linea.

Aquí se describe la construcción del sensor que está constituido de 5 QRD1114 (pueden utilizar CNY70 o algún otro sensor óptico-reflectivo)

Para la polarización de estos es necesario un resistor de 220 ohm y uno de 4.7Kohm y los conectaremos como se muestra en el circuito. Véase datasheet QRD1114
El diagrama anterior representa la conexión de un solo sensor; es necesario repetir 5 de estos circuitos. La linea que indica SALIDA es el voltaje que entregara el sensor, que es proporcional a la cantidad de luz reflejada por alguna superficie y recibida por el fototransistor.

En este caso se han acomodado los QRD1114 de la siguiente manera; pero si asi se cree conveniente se pueden agregar u omitir sensores.

Una vez montado el circuito y polarizado se puede comprobar que todos los LEDs infrarrojos de los QRD1114 encienden mediante una cámara digital (podemos usar la de nuestro celular) y se verán con una luz en un tono violeta.


Para asegurarnos que los fototransistores de los QRD1114 están trabajando correctamente deberemos comprobar el voltaje de las salidas. Con una superficie reflectante (un trozo de papel blanco) deberemos obtener un voltaje superior a 3 volts aproximadamente; en ausencia de algún objeto que refleje la luz infrarroja emitida por los LEDs mediremos aproximadamente 1 volt, este valor puede variar dependiendo de la luz del ambiente en el que estemos trabajando, aspecto que debe ser considerado en la programación del robot.

Con esto hemos terminado la parte electrónica y mecánica de nuestro robot, resta conectar todo a nuestro Arduino y comenzar con la programación.