Sensor de infrarrojos CNY70 como entrada digital. El dispositivo CNY70 es un sensor óptico infrarrojo, de un rango de corto alcance (menos de 5 cm) que se utiliza para detectar colores de objetos y superficies. Su uso más común es para construir pequeños robots siguelíneas. Contiene un emisor de radiación infrarroja -fotodiodo- y un receptor -fototransistor-. El fotodiodo emite un haz de radiación infrarroja, el fototransistor recibe ese haz de luz cuando se refleja sobre alguna superficie u objeto. Dependiendo de la cantidad de luz recibida por el fototransistor el dispositivo envía una señal de retorno a Arduino. El sensor CNY70 Puede utilizarse como entrada digital o analógica. En este ejemplo se ha utilizado como entrada digital para distinguir dos colores: blanco o negro. Cando el sensor está orientado hacia una superficie u objeto de color negro éste absorbe gran parte de la luz emitida por el diodo. Entonces el sensor enviará un valor alto (HIGH – 1) a Arduino. A su vez cuando el sensor se sitúa sobre una superficie u objeto de color blanco gran parte de la luz emitida por el diodo será reflejada al fototransistor. Entonces, el sensor enviará un valor alto (LOW- 0) a Arduino. El CNY70 tiene cuatro terminales. Para distinguir los terminales a fin de poder hacer el conexionado correctamente, tienes que colocar el sensor con la parte del fotodiodo y del fototransistor hacia arriba y los terminales hacia abajo. Además, la cara del sensor que está serigrafiada con el nombre del dispositivo ha de estar situada en tu derecha, tal y como se muestra en la siguiente imagen. Una vez identificados los terminales hay que realizar el conexionado a la protoboard y a Arduino. Este esquema te servirá para hacer correctamente las conexiones. El pin de Arduino que se ha usado en este programa ejemplo es el 4. Puedes conectarlo a cualquier otro pin digital.
El sensor vimos en el caso de
CNY70 puede utilizarse como entrada digital, como artículo anterior o como entrada analógica. En el entrada digital el sensor puede distinguir entre dos colores. En el caso de entrada analógica, el sensor devuelve valores entre 0 y 1023, como cualquier otro sensor conectado a una entrada analógica de
Arduino. El siguiente programa está preparado para que se pueda comprobar, a través del puerto serie de Arduino, los valores que devuelve éste en función del color de la superficie u objeto al que esté orientado el sensor. Una vez conocidos qué valores devuelve el CNY70, se podrán diseñar otros programas que puedan distinguir diferentes colores. Se podrá observar que los valores devueltos por el sensor varían sensiblemente en función de la distancia que haya entre el sensor y la superficie u objeto sobre el que esté orientado. Por eso, para tener una medida más precisa de los valores, se aconseja colocar el CNY70 de forma que la distancia entre él y la superficie sobre la que se desea determinar el color permanezca constante. COXNTRUCCION 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 también se pueden encontrar en robótica unas muy bonitas y no continuación muestro una foto de la rueda.
un carrito de juguete; pero tiendas de electrónica o tan pesadas. A
Y por último pero no menos importante la parte de tracción del robot; constituida por los dos motoreductores 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 línea que hemos bautizado BICHIBOT.
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 está 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.
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 motores; evitando así 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.
PROGRAMA PARA EL ROBOT. 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); } }
SENSORES PARA LA DETECCION 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.