Sensor CNY70.             



El CNY70 de Vishay es uno de los sensores que más se suele usar para los robots seguidores de línea, es el primer sensor empezando por la izquierda, el cuadrado de 7mm de lado aproximadamente. Está compuesto por un fotodiodo y un fototransistor como se puede ver en el dibujo sacado del datasheet.



El fotodiodo se encarga de emitir luz cuya intensidad es función de la resistencia que pongamos en serie con él y la tensión a la que le alimentemos. El fototransistor se encarga de recibir esta luz cuando se refleja sobre alguna superficie, y dependiendo de la cantidad de luz recibida trabaja en sus distintas regiones y pasa más o menos intensidad por él. Por lo que podemos detectar distintas superficies en función de la luz que reflejen, y así es como seguimos una línea negra sobre un fondo blanco, o viceversa. Cuando el sensor se encuentre sobre la parte negra (la línea) esta absorberá gran parte de la luz emitida por el diodo, por lo que nuestro transistor estará en corte y apenas tendrémos intensidad a través de éste, cuando el sensor se sitúa sobre una superficie blanca, gran parte de la luz emitida por el diodo será reflejada al fototransistor, pasando éste de su región de corte a la de activa o saturación y teniendo una intensidad bastante mayor.



Para poder detectar la cantidad de luz recibida por el transistor sólo necesitaremos una resistencia en serie con éste, el valor de tensión leído será función de la intesidad que pasa por el transistor, es decir función de la luz recibida. Por lo que el circuito más simple sería el siguiente:



Salida = Vcc - Ic*R 

Una resistencia se encarga de limitar la intensidad y luz emitida por el diodo. La otra resistencia nos proporciona un valor de tensión, por ejemplo si el transistor no reibiese luz (está sobre negro), pasaria una intensidad muy muy baja, por lo que la caída de tensión en la resistencia sería muy pequeña y en la salida tendríamos aproximadamente el valor de Vcc. Ahora el caso contrario, el transistor se encuentra en saturación porque recibe mucha luz, la Ic es muy grande y el valor de la salida sería la Vce de saturación del transistor 0.3 V.

En el caso de que recibiesemos luz sin llegar a saturación, los valores de nuestra salida oscilarían entre los dos valores anteriores. En principio podemos usar este circuito tan simple, cuando el sensor se encuentre sobre negro tendrá un valor próximo a Vcc y cuando se encuentre sobre blanco próximo a los 0.3 V, por lo que podríamos enganchar esta salida a la entrada digital y que reconozca ambos niveles lógicos. Pero también nos podemos encontrar con niveles de tensión por encima del nivel de umbral de cero de la lógica y por debajo del nivel de umbral del 1. Es decir si nuestra lógica por ejemplo toma un 1 a partir de 4 V, y un cero cuando la entrada es menor de 1 V
, que interpretaría la lógica cuando la salida fuese 3 voltios?

Para solucionar esto lo mejor es usar un disparador Schmitt, se encarga de proporcionar una señal de 0 ó 5 voltios al microcontrolador en función del valor de la salida de nuestro sensor con una histéresis. Por lo que es la mejor solución cuando vamos a leer los sensores en digital, además muchos microcontroladores incorporan ya este disparador en sus entradas, por lo que sólo hay que ver si el puerto lo lleva y conectar el circuito anterior, si no lo lleva es mejor ponerlo externo.


En este dibujo se muestra el disparador, por lo general un 74HCT14, en este caso la resistencia se coloca en el emisor en lugar del colector, por lo que cuando estemos sobre blanco leemos un 1 en Q y un cero cuando estemos sobre negro. Aquí: Salida= Re*Ie, y lo que hace el 74HCT es que cuando la tensión en Re sea mayor de cierto valor nos da 5V en Q, y cuando sea menor a otro valor próximo pone Q a 0 V, por lo que evitamos meterle niveles intermedios a la lógica.

Los valores de las resistencias tenemos que calcularlos en función de varios parámetros. Si queremos que el diodo emita mucha luz, la resistencia en serie tendrá que ser lo menor posible,
Rd = (Vcc - 1.25)/ Id, siendo el valor mayor de Id máximo de 50 mA, Por lo que cuanto mayor sea la intensidad de luz emitida por el diodo más llegará al transistor y menor tendrá que ser la resisntecia en serie con este, pero hacer que la corriente sea máxima para obtener la mayor señal reflejada no es siempre la mejor solución, hay que tener en cuenta otros factores como la distancia, la temperatura, las frecuencias del sensor, el consumo total..

De la
distancia del sensor a la superficie depende la cantidad de luz recibida por el transistor y por tanto la intensidad que pasa por él. Si nos vamos al datasheet vemos una gráfica que nos da como cambia la intensidad del colector en función de la distancia para una tensión de alimentación de 5V y una corriente de diodo de 20 mA.




Como se puede ver en la gráfica lo ideal es llevar los sensores lo más cerca posible del suelo, cuánto más alejados estén necesitaremos emitir más luz (mayor consumo), una R de transistor mayor (mayores tiempos de encendido y apagado) y nos afectará más la luz ambiente. Ahí se puede ver como a partir de 6 mm la intensidad ha caído más de un 80% del valor inicial.

La luz ambiente es el mayor problema que nos podemos encontrar en un concurso, podemos llevar nuestro robot más que probado en el garaje de casa, llegar al concurso y encontrarnos con algún foco o luz del día que sature nuestros sensores y el robot está ciego, no será capaz de leer la línea, y todo el trabajo realizado se habrá perdido en este punto. Una luz constante sobre los sensores disminuye la sensibilidad de estos, tendríamos una corriente constante de transistor que nos daría un valor apreciable continuo en la salida, y si este valor es lo suficientemente grande no detectaríamos los cambios de blanco y negro, tendríamos siempre un 1 o un cero en la salida.

Para la luz ambiente hay varias soluciones. La primera es llevar los sensores lo más pegados posibles al suelo de esta forma la luz ambiente reflejada es menor, muy pegados se evita totalmente, además es normal ver como los concursantes cubren por los lados sus placas de sensores para que les llegue menos luz reflejada del exterior.

Otra opción es modular la señal de diodo y filtrar la salida del transistor. En lugar de alimentar el diodo de forma continua, ahora metemos una señal pulsatoría en éste, y la salida del transistor la pasamos por un filtro para obtener la señal producida por el diodo y evitar los efector de la luz ambiente siempre que no sature el sensor. Esta solución implíca mucha electrónica adicional. Habría que generar una señal en pulso para los diodos, que esto en principio no requiere de muchos componentes, con un transistor a una pata del micro bastaría. Pero el inconveniente viene en la salida, que hay que montar un filtro para cada transistor, y si llevamos unos cuantos sensores requiere bastantes componente adicionales que cuestan y ocupan espacio, además de la tarea de realizar el filtro. También se podría demultiplexar.

La tercera opción que se suele ver y la usa mucha gente es leer en analógico. Para ello necesitamos usar un conversor analógico digital (adc) del micro, teniendo los sensores apagados leeríamos el valor del adc en cada transistor, una vez leído procedemos a ir encendiendo los diodos uno a uno y leemos el valor analógico en el transistor, la diferencia entre el valor leído con el diodo encendido y el valor leído con el diodo apagado nos proporciona la cantidad de luz reflejada por la superficie, evitaríamos la luz ambiente siempre que ésta no sea capaz de saturar el sensor. De igual forma aquí tenemos que usar electrónica adicional, como puede ser algún demultiplexor analógico, además debemos de tener en cuenta los tiempos de conversión del ADC. Esta es la mejor opción de las posibles, ya que nos proporciona un valor analógico real que se corresponde con la posición de la línea entre dos o más sensores y por tanto tendríamos una sensibilidad mayor.

Lo más rápido y fácil es la primera opción, leemos nuestros sensores en digital pasados por un trigger smichtt y nos preocupamos de llevarlos lo más cerca posible del suelo y bien tapaditos para que no les afecte mucho la luz ambiente, y con unos buenos valores de resistencia y condensador no tendrémos problemas de saturación. La gente que lleva un tiempo participando en concursos y con robots competitivos tiran para la tercera opción, hay mucho más trabajo en electrónica y código, pero para ganar hay que trabajar... Yo por supuesto me decanto por la primera opción...

Si queremos apagar y encender diodos tenemos que tener en cuenta los tiempos de apagado y encendido del sensor, y aquí juega un papel fundamental la resistencia de transistor y la capacitancia base colector. Cuanto mayor sea la resistencia mayores serán los tiempos de encendido y apagado, y si el transistor entra en saturación óptica el tiempo de apagado será bastante mayor que el de encendido, por lo que si disminuimos la R perdemos sensibilidad pero ganamos en tiempos. Aquí hay que sacar lapiz y papel y junto con el tiempo de conversión del adc ver cuanto tardamos en leer cada sensor, la placa total de sensores, y el espacio recorrido en este tiempo.

Por tiempo de apagado y encendido del sensor se entiende el tiempo que tarda la salida del sensor en alcanzar su valor. Por ejemplo estas imagenes son de una señal cuadrada conectada al diodo, y en azul la salida del transistor con una resistencia de emisor de 15k sobre un fondo blanco.

Amarilla: alimentación diodo. Azul: Vre Re=15K. F=1KHz.


Tiempo de subida


Tiempo de bajada


A 10 Khz el CNY no es capaz de seguir la entrada.


Si usamos una resistencia mayor de transistor 47k.

Amarillo: diodo. Azul: Vre Re=47k


Tiempo de subida.


Tiempo de bajada.


El tiempo aumenta considerablemente al aumentar la resistencia de carga, por lo que si queremos encender y apagar diodos para realizar mediciones debemos tenerlos en cuenta para calcular que distancia representa y ver si se puede despreciar.

Por último podemos usar un CNY para leer un encoder, y aquí es importante su resolución, la distancia mínima de línea que puede leer, además de los tiempos anteriores. Si miramos la gráfica encontramos que la posición del sensor respecto al desplazamiento de la línea y su distancia a ésta condiciona su resolución.




Por lo que si tenemos un encoder con líneas finas la colocación del cny nos puede influir bastante a la hora de ser capaz de leerlo.

A la hora de poner las resistencias hay que pensar en todo lo anterior (y más...), la placa de cny que voy a montar en el miniz va a ser leída en digital, como resistencias voy a usar 120 Ohmios de diodo y 15k de transistor, lo que me da un consumo de diodo muy elevado de 42 mA. Mi idea es que la intensidad del diodo sea la máxima posible para minimizar los efectos de la luz ambiente al poder permitirme llevar una resistencia de colector lo más baja posible, además mejoro el tema de tiempos (aunque puede que esto resulte despreciable a la velocidad a la que voy), que aunque leo en digital apago y enciendo los diodos en el periodo para minimizar el consumo total, ya que voy a montar 16 cny (640 mA) en la placa de sensores, uno pegado a otro, de tal forma que obtengo una buena resolución, ya que siempre voy a tener 3 sensores sobre la línea, o incluso 4 si esta pasa de los 20mm. La placa que voy a montar y probar es la siguiente, a ver si la paso por el ácido y veo como sale la idea.



Bueno aquí dejo colgado el pequeño resumen sobre el cny, que si no cada vez que tengo que usarlo me toca leerme los datasheet. Agradezco cualquier correción en lo que me haya podido equivocar, ya que tampoco es que tenga mucha experiencia con este sensor.

Gracias. Saludos.