Sensores QTR RC
Sensores QTR RC
01/2012
El circuito basa su funcionamiento en las tensiones umbrales de los diferentes estados a la entrada digital de un puerto, dependiendo del nivel de tensin que tengamos en una entrada, se considerar un 1 o un 0 lgico. En la tabla de las caractersticas elctricas del AVR podemos encontrar estos valores VILmin ,VILmax , VIHmin y VIHmax. Si partimos del instante t0 en el que el condensador C1 se encuentra cargado, tendremos un nivel H en la entrada del AVR
21
01/2012
Transcurrido un tiempo t1, el condensador se ir descargado a travs del transistor hasta alcanzar la tensin en el colector el valor de VILmax. Al alcanzar la entrada del AVR ese valor, har que pase a considerarse un nivel L. El tiempo que tarde en alcanzarse esa tensin en el colector del transistor, depender de lo rpido que se descargue el condensador a travs del transistor. Podemos decir que el transistor regula el tiempo de descarga del condensador. Para hacer ms o menos conductor al transistor debemos aplicarle ms radiacin IR a la base o menos. Para aplicarle ms o menor radiacin IR a la base, al tratarse de un dispositivo que detecta la radiacin reflejada en una superficie, deberemos hacer que esa superficie sea ms o menos reflectante, es decir, ms oscura o clara (NEGRO, BLANCO). Tiempos cortos de descarga implicara superficies reflectantes claras, tiempos largos de descarga implicara superficies oscuras.
Para que el circuito funcione, el condensador debe ser cargado inicialmente desde el pin del puerto del microcontrolador al que est conectado, esto obliga al programador a configurar el pin del puerto como salida y sacar un estado alto H por ese pin, un tiempo determinado, de ese modo el condensador C se cargar. Ese tiempo es 5RC, es decir aproximadamente: 5RC= 5*220 *10*10-9 = 11 s. Esta carga la mantendr de forma temporal. Si ahora configuramos el pin del puerto como entrada, el AVR leer un estado H mientras la tensin en el colector del transistor est por encima de VLmax, cuando la tensin en el colector disminuya por debajo de VLmax, pasar a leer un nivel bajo L. El tiempo que tarde el condensador en descargarse depender de la corriente de base, es decir, de la cantidad de radiacin infrarroja (IR) que llegue a la base del fototransistor. Si la reflexin se produce sobre blanco ser muy corto (imagen derecha) y si se produce sobre una superficie negra (imagen izquierda) tardar ms tiempo en descargarse el condensador.
22
01/2012
En la imagen del osciloscopio, se observa que el voltaje del condensador (trazo amarillo) en el colector de transistor y el valor considerado a la entrada del pin del puerto (trazo azul). La cantidad de corriente que fluye a travs del fototransistor depende del nivel de luz reflejada, de modo que cuando el robot est en una superficie blanca brillante, el valor 0 se devuelve con mucha ms rapidez que cuando est sobre una superficie de color negro.
3.2.- SU PROGRAMACIN Una vez conocido el comportamiento del circuito y sabiendo que el robot incorpora 6 circuitos como estos conectados a los pines 2,4,3,7,8 y 11 de ARDUINO, podemos traducir en seudocdigo la tarea que debe realizar nuestra funcin para leer el estado en el que se encuentran los 6 sensores de reflexin IR. .
.- 1 LAS LINEAS DE E/S (pines 2,4,3,7,8 y 11)PROGRAMADAS COMO SALIDA .- 2 Coloca a 1 las sali!as pines 2,4,3,7,8 y 11. .- " Ca #a los C !$ an%e 2& s pa a c$an!o C' .- ( Desac%i)a !e p$ll-$p !el pin * .- & coloca las l+neas co,o en% a!a .- - Espe a a lee $n ..
No nos asustemos, no necesitamos crear las funciones para calibrar y leer los sensores. Utilizaremos la librera que ha desarrollado Pololu para su manejo en ARDUINO. En el siguiente enlace encontraremos la informacin de cmo instalarla y en este otro enlace cmo utilizarla. En ambos enlaces y en un perfecto ingls, nos explica todo lo que necesitamos saber para usar el array de sensores en ARDUINO. Para facilitaros de comprender cmo debemos instalar y usar la librera aqu os dejo una rpida traduccin del contenido de los enlaces anteriores: 3.2.1 INSTALACIN DE LA LIBRERA Descargar el archivo de GitHub, descomprimirlo, y copiar la carpeta "QTRSensors" en el directorio arduino-1.0/libraries.
23
01/2012
Ahora deberemos ser capaces de utilizar las libreras en nuestros programas, para ello seleccionaremos Sketch> Import Library> QTRSensors del entorno de programacin de la placa de Arduino IDE (o simplemente escribir # include <QTRSensors.h> en la parte superior de nuestro programa). Tener en cuenta que es posible que tengamos que reiniciar el Arduino IDE para poder ver la librera recin instalada. Una vez hecho esto, ya podemos crear un objeto para nuestro sensor QTR-RC:
// create an object for three QTR-xA sensors on analog inputs 0, 2, and 6 QTRSensorsAnalog qtra((unsigned char[]) {0, 2, 6}, 3); // create an object for four QTR-xRC sensors on digital pins 0 and 9, and on analog // inputs 1 and 3 (which are being used as digital inputs 15 and 17 in this case) QTRSensorsRC qtrrc((unsigned char[]) {0, 9, 15, 17}, 4);
Esta librera sirve tanto para los sensores analgicos QTR-xA, como para los digitales QTR-XRC, proporcionando una interfaz comn para ambos sensores. La nica diferencia externa est en los constructores, como se puede ver en el ejemplo de cdigo anterior. El primer argumento para el constructor QTRSensorsAnalog es una matriz de pines de entrada analgica (0 - 7), mientras que el primer argumento del constructor de QTRSensorsRC es una matriz de pines digitales (0 - 19). Ntese que las entradas analgicas 0 a 5 se puede utilizar como pines digitales 14 - 19. La otra diferencia est en el tiempo que tarda en leer los valores de los sensores. Los sensores de QTR-XRC se pueden leer en paralelo, cada uno requiere un tiempo de hasta 3 ms. Los sensores QTR-XA utilizar el convertidor analgico-digital (ADC) y por lo tanto deben ser ledos secuencialmente. Dos ejemplos de utilizacin estn a nuestra disposicin, uno para los sensores analgicos QTR-XA y otro para los digitales QTR-XRC. Para ver estos ejemplos, abrir el IDE de Arduino e ir a: Archivo> Ejemplos> QTRSensors y seleccione QTRAExample o QTRRCExample. 3.2.1 GUIA DE REFERENCIA DE LOS COMANDOS Para los sensores analgicos QTR-XA, crearemos una instancia de un objeto QTRSensorsAnalog, y para los digitales QTR-XRC una instancia de un objeto QTRSensorsRC. Adems de los constructores, estos dos objetos proporcionan los mismos mtodos para la lectura de los valores de los sensores. La librera permite el acceso tanto a los valores de los sensores en bruto, como a las funciones de alto nivel, incluyendo la calibracin y el rastreo de la lnea. La biblioteca define un objeto para cada uno de los dos tipos de sensores QTR, la clase QTRSensorsAnalog a de ser utilizada con QTR-XA y la clase QTRSensorsRC a de ser utilizada con QTR-XRC. Esta biblioteca se ocupa de las diferencias internas entre los sensores QTR-xA y QTR-XRC, proporcionando una interfaz comn para ambos sensores. La nica diferencia externa es en los constructores. Deberemos crear una instancia QTRSensorsAnalog o QTRSensorsRC, antes de poder utilizar los sensores. Esto nos permite controlar varios array de sensores de forma independiente como objetos separados QTRSensors. Internamente, esta biblioteca utiliza todas las funciones estndar de Arduino como micros () para la sincronizacin y analogRead () o digitalRead () para obtener los valores de los
24
01/2012
sensores, por lo que debera funcionar en todos los Arduinos sin entrar en conflicto con otras libreras.
void read(unsigned int *sensorValues, unsigned char readMode = QTR_EMITTERS_ON) Lee los valores de los sensores en bruto en una matriz. Debe haber tanto espacio para almacenar los valores como sensores se especifiquen en el constructor. Los valores devueltos son una medida de la reflectancia en unidades que dependen del tipo de sensor utilizado, los valores ms altos corresponden a baja reflectancia (una superficie de color negro o un hueco). QTR-XA sensores devolver un valor en bruto entre 0 y 1023. Mienras que los sensores QTR-XRC devolver un valor en bruto entre el 0 y el argumento de tiempo de espera (en unidades de microsegundos), especificado en el constructor (que por defecto es 2000). Las funciones que se leen los valores de los sensores llevan todas un argumento readMode, que especifica el tipo de lectura que se llevar a cabo. Se definen varias opciones para readMode: .- QTR_EMITTERS_OFF especifica que la lectura debe hacerse sin necesidad de encender el infrarrojo (IR) emisores, en cuyo caso la lectura representa niveles de luz ambiente cerca del sensor; .- QTR_EMITTERS_ON especifica que los emisores debe ser activado para la lectura, que los resultados en una medida de la reflectancia, y .- QTR_EMITTERS_ON_AND_OFF especifica que una lectura debe hacerse tanto en el estado encendido y apagado. Los valores devueltos cuando la opcin se utiliza QTR_EMITTERS_ON_AND_OFF vendrn dados por on + max- off, donde on es la lectura con los emisores activados, off es la lectura con los emisores desactivados, y el mx es la lectura mxima del sensor. Esta opcin puede reducir las interferencias de la luz ambiente. Tenga en cuenta que el control del emisor slo funcionar si se especifica un pin emisor vlido en el constructor.
Ejemplo:
1 2
unsigned int sensor_values[8]; sensors.read(sensor_values);
void emittersOn()
Encender el LED de infrarrojos.
void emittersOff()
Apaga el led de infrarrojos.
25
01/2012
de longitud numSensors, especificada en el constructor, y que slo se asignarn despus de llamar al mtodo calibrate().
unsigned int readLine(unsigned int *sensorValues, unsigned char readMode = QTR_EMITTERS_ON, unsigned char whiteLine = 0)
Funciona de la misma forma que readCalibrate(), pero con una caracterstica distinta diseada especficamente para seguir la lnea: esta funcin devuelve una posicin estimada de la lnea. La estimacin se realiza mediante un promedio ponderado de los ndices de los sensores, multiplicado por 1000, por lo que un valor de retorno de 0 indica que la lnea est directamente debajo del sensor 0, un valor de retorno de 1000 indica que la lnea est directamente debajo del sensor 1, 2000 indica que est por debajo del sensor de 2,etc los valores intermedios, indican que la lnea se encuentra entre dos sensores. La frmula es: 0*value0 + 1000*value1 + 2000*value2 + ... value0 + value1 + value2 + ... Mientras los sensores no estn demasiado separados respecto de la lnea, este valor que retorna est diseado para ser montono, lo que hace ideal para uso en el control PID en bucle cerrado. Adems, este mtodo recuerda donde se vio por ltima vez a la lnea, as que si alguna vez perdemos la lnea a la izquierda o a la derecha, su valor nos indicar donde se encuentra la lnea. Vistas algunas de los mtodos que se encargan de los sensores, haremos uso del array de sensores que tenemos montados en la parte delantera de nuestro ROBOT para conseguir que nos represente en pantalla el estado de los sensores al recorrer la lnea con los motores parados. Aconsejo que no se acometan tareas ms complicadas, sin antes comprobar que no hay ningn sensor que falle. Si alguno de los sensores falla recomiendo que se averige el fallo, siempre suele provenir de malos contactos o rotura de alguno de los sensores. Para comprobar que todos los sensores estn alimentados correctamente es conveniente observar a travs de la ptica de una cmara de un mvil que se iluminan todos los diodos LED de IR. Para comprobar que el ROBOT es capaz de leer la lnea de forma segura, recomiendo cargar el programa que podemos encontra en la librera y que se llama QTRRCExample.ino en el robot y comprobar la lectura de los sensores. Para leer la lnea nos valdremos de la funcin readLine() que hemos visto antes. El valor que retorna la funcin es el valor en decimal comprendido entre 0 y 5000 que nos indica que sensor est sobre la lnea. #include <QTRSensors.h> // This example is designed for use with eight QTR-1RC sensors or the eight sensors of a // QTR-8RC module. These reflectance sensors should be connected to digital inputs 3 to 10.
26
01/2012
// The emitter control pin can optionally be connected to digital pin 2, or you can leave // it disconnected and change the EMITTER_PIN #define below from QTR_NO_EMITTER_PIN.
to
// The setup phase of this example calibrates the sensor for ten seconds and turns on // the pin 13 LED while calibration is going on. During this phase, you should expose each // reflectance sensor ot the lightest and darkest readings they will encounter. For // example, if you are making a line follower, you should slide the sensors across the // line during the calibration phase so that each sensor can get a reading of how dark the // line is and how light the ground is. Improper calibration will result in poor readings. // If you want to skip the calibration phase, you can get the raw sensor readings // (pulse times from 0 to 2500 us) by calling qtra.read(sensorValues) instead of // qtra.readLine(sensorValues). // The main loop of the example reads the calibrated sensor values and uses them to // estimate the position of a line. You can test this by taping a piece of 3/4" black // electrical tape to a piece of white paper and sliding the sensor across it. It // prints the sensor values to the serial monitor as numbers from 0 (maximum reflectance) // to 9 (minimum reflectance) followed by the estimated location of the line as a number // from 0 to 5000. 1000 means the line is directly under sensor 1, 2000 means directly // under sensor 2, etc. 0 means the line is directly under sensor 0 or was last seen by // sensor 0 before being lost. 5000 means the line is directly under sensor 5 or was // last seen by sensor 5 before being lost.
#define NUM_SENSORS 8 // number of sensors used #define TIMEOUT 2500 // waits for 2500 us for sensor outputs to go low #define EMITTER_PIN 2 // emitter is controlled by digital pin 2 // sensors 0 through 7 are connected to digital pins 3 through 10, respectively QTRSensorsRC qtrrc((unsigned char[]) {3, 4, 5, 6, 7, 8, 9, 10}, NUM_SENSORS, TIMEOUT, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS];
void setup() { delay(500); int i; pinMode(13, OUTPUT); digitalWrite(13, HIGH); // turn on LED to indicate we are in calibration mode for (i = 0; i < 400; i++) // make the calibration take about 10 seconds { qtrrc.calibrate(); // reads all sensors 10 times at 2500 us per read (i.e. ~25 ms per call) } digitalWrite(13, LOW); // turn off LED to indicate we are through with calibration // print the calibration minimum values measured when emitters were on Serial.begin(9600); for (i = 0; i < NUM_SENSORS; i++) { Serial.print(qtrrc.calibratedMinimumOn[i]); Serial.print(' '); } Serial.println();
27
01/2012
// print the calibration maximum values measured when emitters were on for (i = 0; i < NUM_SENSORS; i++) { Serial.print(qtrrc.calibratedMaximumOn[i]); Serial.print(' '); } Serial.println(); Serial.println(); delay(1000); }
void loop() { // read calibrated sensor values and obtain a measure of the line position // from 0 to 5000, where 0 means directly under sensor 0 or the line was lost // past sensor 0, 1000 means directly under sensor 1, 200 means directly under sensor 2, etc. // Note: the values returned will be incorrect if the sensors have not been properly // calibrated during the calibration phase. To get raw sensor values, call: // qtra.read(sensorValues); unsigned int position = qtrrc.readLine(sensorValues); //qtrrc.read(sensorValues); // print the sensor values as numbers from 0 to 9, where 0 means maximum reflectance and // 9 means minimum reflectance, followed by the line position unsigned char i; for (i = 0; i < NUM_SENSORS; i++) { Serial.print(sensorValues[i] * 10 / 1001); Serial.print(' '); } Serial.print(" "); Serial.println(position); delay(250); }
28