Sensores  QTR-8RC.
       

Prueba de la placa de sensores QTR-8RC de pololu que se caracteriza por leer la línea mediante el tiempo de carga (a través del fototransistor) de un condensador, y vistos los resultados me parece que me he equivocado eligiendo esta opción para un robot de iniciación, pudiendo elegir una placa de sensores con resistencia para leer directamente en digital, 1 ó 0, que si funciona es lo más sencillo para el robot.

Para las pruebas se utiliza cinta aislante negra sobre una superficie blanca, se escribe el programa que se encargue de configurar los pines del micro que van a los sensores como entradas y salidas para poder realizar la lectura, código.

Para comenzar se realiza una primera lectura con todos los sensores sobre negro, para ver el resultado de la lectura se utiliza un analizador lógico que se conecta a los 8 sensores.


El ancho de pulso nos da la distancia del sensor a la línea, cuanto más corto sea es que al sensor le llega más luz y por tanto significa que está sobre blanco, cuando le llega menos luz el sensor está sobre negro y el pulso es más largo. Se generan los pulsos y se leen los sensores cada 4 ms, en la imagen de debajo se observa la duración de los pulsos de los 8 sensores cuando están sobre negro.


Los pulsos de cada sensor cuando están sobre negro no son iguales, el menor está sobre 1 ms y el mayor sobre 1.37 ms, este ancho de pulso además de la situación de la línea respecto al sensor, también depende de factores como la altura, la colocación, los umbrales de tensión de los pines del microcontrolador, o del propio sensor.  Por lo que es necesario una calibración individual de cada sensor para poder tener una lectura precisa. y ésto es un problema para un robot que pretende ser simple y fácil de hacer.


Para la lectura de los sensores se utiliza un analizador lógico, que distingue entre niveles de tensión de uno y cero según sus umbrales: input low voltage: -0.5 to 0.8 V y en input high voltage: 2 a 5.25 V. En el ATmega328p el umbral para el nivel bajo de entrada estaría en -0.5V a 1.5V y el alto de 3V a 5.5V. Todo esto significa que si el micro leyese la entrada, al estar detectando el nivel bajo y ser el umbral del micro superior al del analizador, podríamos tener tiempos un poco más cortos en el ancho de pulso.

Si se observa en el osciloscopio lo que pasa en el sensor, no se ve una pulso constante en su salida, se ve como la tensión de salida del sensor va disminuyendo según se carga el condensador. El pulso se mantendría en uno hasta que la salida del sensor alcance un nivel de tensión que el micro o el analizador interprete como cero. Por lo que los tiempos medidos en esta prueba no son exactos, la única forma de conocerlos con exactitud es mediante un pin del micro que se active para anotar el tiempo cuando el pin de entrada lee cero, y habría que hacerlo para todos los sensores, cosa que no tiene sentido ya que también afectan otros factores externos y variables.



El robot 3 pi soluciona este problema haciendo una calibración de los sensores al principio, para ello antes de comenzar a correr gira sobre si mismo, de tal forma que todos los sensores pasen por la línea y anota y guarda los valores máximos y mínimos leídos por cada sensor y para cada sensor, asigna el valor 0 al menor valor leído y el valor 1000 al máximo de cada sensor y en las lecturas devuelve un cantidad comprendida entre estos valores.

Continuando con las pruebas se colocan los sensores sobre blanco y se observa la salida en el analizador.


Nada más que se inicia el pulso hay un delay de 40 us para descargar el condensador, por lo que el sensor que más tarda en cargarse lo hace en apenas 55us. La diferencia entre el valor para negro mínimo y el valor para blanco máximo es de aproximadamente 1 ms, lo que en principio nos va a permitir obtener una buena precisión con un timer.

Se hace una prueba metiendo un poco de luz ambiente, (en la imagen se encienden 3 lámparas de mesa aunque sólo se ve una, no es luz solar que sería la buena para la prueba) y se pasa a apagar los diodos de la placa de sensores para ver si afecta en algo la iluminación exterior que podemos encontrar en los concursos.


Se toma la siguiente medida en el analizador.


El condensador no recibe casis luz y nunca llega a cargarse en el período de 4 ms, el pulso a nivel bajo que se ve en el analizador tiene un ancho menor de 1 us y se ha puesto para disparar el trigger del analizador, se corresponde con la habilitación de la resistencia de pull-up propia de cada pin del puerto, al realizar el cambio de configurar el pin como salida a entrada. Esta resistencia estaría en paralelo con el condensador, y su valor es suficiente para que con la mínima intensidad que circule por el fototransitor ponga a nivel bajo el colector de éste.

        _delay_us(40); //Se descarga el condensador.

        DDRD &= ~((1<<S0)|(1<<S1)|(1<<S2)); //Se configuran los sensores como entrada. Pull-up habilitado.
        DDRB &= ~((1<<S3)|(1<<S4));
        DDRC &= ~((1<<S5)|(1<<S6)|(1<<S7));

        PORTD &= ~((1<<S0)|(1<<S1)|(1<<S2)); //Pull-up apagado, Hi-Z
        PORTB &= ~((1<<S3)|(1<<S4));
        PORTC &= ~((1<<S5)|(1<<S6)|(1<<S7));

        _delay_ms(4);

Inicio del pulso.


PORTD |= ((1<<S0)|(1<<S1)|(1<<S2)); //Se pone a 1 la salida
PORTB |= ((1<<S3)|(1<<S4));
PORTC |= ((1<<S5)|(1<<S6)|(1<<S7));

Esta imagen sólo por curiosidad para observar como se van poniendo a 1 los sensores según se ejecuta su instrucción en distinto tiempo.


Por último se hace una prueba con el robot sobre la línea, con los sensores centrales sobre ella, y se toman las medidas con las lámparas encendidas y apagadas.


Lámparas apagas, sensores centrales sobre la línea.

Se obseva la enorme diferencia de tiempo entre los sensores sobre negro (S3 y S4) y el resto sobre blanco.

Lámparas encendidas.

Se observa lo mismo que en el caso anterior, el tiempo a disminuido unos pocos microsegundos, lo que es totalmente despreciable, y a la altura a la que están los sensores se puede decir que el ruído creado por la iluminación artificial que tengo aquí es despreciable.

Lo ideal para solucionar el problema de los distintos valores que puede registrar cada sensor cuando están sobre la línea es realizar un calibración antes de correr como el 3 pi, así se solucionar el problema de las condiciones externas e internas al sensor. Pero va en contra de la normativa de los concursos:

La puesta en marcha del robot se realizará mediante interruptor o “cuerda”. En ningún caso se permitirá que los robots estén en funcionamiento antes de dar la salida.

Normativa del Cosmobot, según eso el robot no pude realizar una calibración antes de comenzar a correr, aunque en los últimos concursos se haya hecho, si no lo tenemos en cuenta nos podemos encontrar con el robot descalificado.

Salida de los sensores sobre negro.


Mirando los tiempos de los sensores sobre negro se ven que todos pasan una cantidad mínima, lo que se podría hacer para solucionar el problema de la calibración, es establecer un valor máximo, en este caso 1 ms, y que ese valor máximo se modifique de manera individual si algún sensor lo sobrepasa en alguna de sus lecturas. Se haría la calibración sobre la pista y a la velocidad que se realizan las lecturas, pongamos que el bucle principal se realiza cada 10 ms, pues no afectaría al comportamiento del robot. Otra opción es hacer la calibración en las rodas de homologación y almacenar los datos en la eeprom, una vez grabados cambiar los interruptores de tal forma que no se vuelvan a hacer.

La placa de sensores RC pues es mejor opción que la alternativa analógica porque obtenemos mayor resolución, pero creo que no es adecuada para las intenciones de este proyecto, cuando hay una alternativa que leyendo simplemente uno o cero puede funcionar. Voy a comprar una de las placas analógicas y una vez probadas las dos y vistos los resultados pues veré cuál se queda en el robot.

Para cualquier cosa: foro.