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)); //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.