Una de las cosas mas habituales que un robot Arduino suele tener que hacer es detectar líneas
en el suelo (blancas sobre fondo negro o negras sobre fondo blanco). Normalmente las líneas marcan
el camino que el robot tiene que seguir (por ejemplo en una carrera) o los límites del campo de juego (por ejemplo en un combate de sumo).
Para detectar línea en el suelo se usa un sensor de reflectividad CNY70 (el aŕea marcada es la cara en la ques están impresas las letras blancas)
Abajo se muestra la VISTA SUPERIOR del CNY70
Robot seguidor de línea negra
El sensor consta de:
-Un diodo LED infrarrojo: (su luz es invisible al hojol humano, aunque se puede usar la cámara del móvil para ser si luce). Los terminales del led son Ánodo (A +) y Cátodo (K -). Tiene una lente azulada.
- Un fototransistor: Es como un grifo que se cierrra o se abre en función de la luz reflejada que recibe dejando pasar más o menos corriente eléctrica. Los terminales del fototransistor son Colector (C +) y Emisor (E -).
La idea es que un suelo blanco refleja mucha de la luz infrarroja del LED de vuelta al fototransistor, por lo que el grifo se abre a tope y la corriente que pasa por el transistor es máxima. Cuando el sensor está justo encima de una línea negra, la cantidad de luz reflejada hacia el fototransistor disminuye mucho, y el grifo se cierra y la corriente que pasa por el transistor es mínima.
Conexión del sensor a una placa Arduino
Lo que se pretende con este sensor es medir el grado de reflectividad del suelo, por lo que se conectará a una de las entradas analógicas de la placa Arduino. El problema es que las entradas analógicas miden valores de voltaje, mientras que este sensor traduce una variación de luz reflejada en una variación de corriente, no de voltaje. Para convertir un cambio de corriente en un cambio de voltaje se usa un resistor de entre 10k y 47k conectado en serie con el fototransistor.
La diferencia entre las dos formas de conexión mostradas en la imagen es que en la primera el voltaje a la salida es mayor cuanto mas claro es el suelo, mientras que en el segundo sucede lo contrario, el voltaje es mayor cuanto más oscuro es el suelo.
El resistor de 220 ohms se usa para limitar la corriente que pasa por el LED a unas decenas de miliamperios y se puede colocar indistintamente conectado al ánodo (A) o al cátodo (K).
Vcc es la fuente de tensión que alimenta el sensor, en nuestro caso van conectados al pin 5V de la placa Arduino.
GND es masa y hay que conectarlos a cualquiera de los pines de masa de la Placa Arduino.
Programa de prueba básico
A continuación se muestra un programa muy simple que se puede usar para calibrar un sensor CNY70.
1- Monta el circuito: Conecta el CNY70 de acuerdo a lo indicado en cualquiera de los dos diagramas de arriba. Si no tienes un resistor de 47K a mano, puedes usar cuooalquiera de entre 10K y 50K.
2- Conecta el circuito a Arduino:
Vcc se conectan juntos al pin 5V de Arduino para alimentar el sensor
3- Conecta tu Arduino al puerto USB, y carga el siguiente programa.
int reflectividad = 0;
void setup() {
// Iniciamos la comunicacion con el ordenador a traves del puerto USB
Serial.begin(9600);
}
void loop() {
// Leemos el voltaje la entrada A0
reflectividad = analogRead(0);
// mandamos el valor leido al ordenador a traves del puerto USB
Serial.print("Reflectividad: ");
Serial.println(reflectividad);
// esperamos un poco, para no atascar el puerto USB de datos
delay(300);
}
4- Ve al menú Herramientas->Monitor Serial y espera un poco, verás que empiezan a aparecer números. Sujeta el sensor a unos 2mm de superficies de distintos colores y
observa el resultado.
Detectar una línea negra
Ahora vamos a hacer un programa en el que Arduino reccione encendiendo el LED de la salida 13 cuando el sensor CNY70 pase sobre un línea negra.
1- Sobre una superficie blanca y lisa pega un trozo de cinta aislante negra, de la que usan los electricistas. Es importante que sea cinta y no cartulina negra o papel negro, ya qu hay muchas cartulinas que a pesar de ser negras reflejan mucha luz infrarroja y el sensor las toma por blancas.
2- Carga el programa de prueba y anota los números que se corresponden a las lecturas del sensor sobre la superficie blanca y sobre la cinta. En nuestro caso la lectura sobre suelo banco da 930 y sobre cinta negra 110.
3- Fijar un umbral de detección. Es decir decidir cual es el valor del sensor a partir del cual vamos a considerar con total seguridad que estamos sobre una línea negra. Supongamos que fijamos el umbral de detección de la línea negra en 100. Puede suceder que debido a; rugosidades en la cinta, variaciones de iluminación, variación de la distancia del sensor al suelo, el sensor de valores bastante mayores que 100 sobre la línea negra. Si esto sucede, el robot estaría sobre la línea pero el programa no la detectaría. Para evitar este problema se fija el umbral de detección en la media de los valores para blanco y negro. En nuestro caso:
umbralDeNegro = (valorBlanco + valorNegro) / 2
Sustituyendo
umbralDeNegro = (110 + 930) / 2 = 520
De acuerdo con esto el programa detectará como línea negra aquella superficie cuyo valor de reflectividad esté por debajo de 520.
4- Carga el siguiente programa en tu Arduino
/*
* Este programa enciende el led de la salida 13 cuando un sensor CNY70 pasa sobre una linea
* negra sobre fondo blanco. Ademas envia al ordenador la lectura del sensor a traves del
* puerto USB
*
* Se toma como valor umbral para el negro 520, cualquier valor inferior es considerado negro.
*
* Entradas: A0 detecta el nivel de reflectividad del suelo usando un CNY70
* Salidas: D13 conectada internamente a un diodo LED de color amarillo.
*
* Alimentacion del sensor:
* +5V de la propia placa Arduino
* GND a la placa Arduino
*
* Autor: Javier Casado 27/03/2015
*
* Licencia cc by
*
*/
int reflectividad = 0;
void setup() {
// configuramos el pin 13 como salida
pinMode(13,OUTPUT);
// Iniciamos la comunicacion con el ordenador a traves del puerto USB
Serial.begin(9600);
}
void loop() {
// Leemos el voltaje la entrada A0
reflectividad = analogRead(0);
// mandamos el valor leido al ordenador a traves del puerto USB
Serial.print("Reflectividad: ");
Serial.println(reflectividad);
// si el valor de reflectividad es inferior al umbral => negro => enciende el LED
// si no, apagalo
if(reflectividad < 520) {
digitalWrite(13,HIGH);
} else {
digitalWrite(13,LOW);
}
// esperamos un poco, para no atascar el puerto USB de datos
delay(300);
}
5- Abre el monitor del puerto serie y comprueba pasando el sensor sobre la línea que el LED se enciende al pasar el sensor por encima
de la línea.
6- Modifica el programa para detectar una línea blanca, sólo hay que cambiar la condición if así:
// si el valor de reflectividad es superior al umbral => blanco => enciende el LED
// si no, apagalo
if(reflectividad > 520) {
digitalWrite(13,HIGH);
} else {
digitalWrite(13,LOW);
}