Diferencia entre revisiones de «Robot sigue líneas con Arduino»
Línea 59: | Línea 59: | ||
Para que funcione, necesitamos la biblioteca correspondiente. En los últimos Arduino IDE es tan simple como ir al gestor de Bibliotecas y importar la QTRSensors. | Para que funcione, necesitamos la biblioteca correspondiente. En los últimos Arduino IDE es tan simple como ir al gestor de Bibliotecas y importar la QTRSensors. | ||
La librería funciona tanto para el QTR-8RC como el QTR-8A, pero el constructor es el que cambia: | |||
<syntaxhighlight lang="c" style="font-family:monospace; font-size:0.8em;"> | <syntaxhighlight lang="c" style="font-family:monospace; font-size:0.8em;"> | ||
// create an object for four QTR-xRC sensors on digital pins 0 and 9, and on analog | // create an object for four QTR-xRC sensors on digital pins 0 and 9, and on analog | ||
Línea 64: | Línea 66: | ||
QTRSensorsRC qtrrc((unsignedchar[]){0,9,15,17},4); | QTRSensorsRC qtrrc((unsignedchar[]){0,9,15,17},4); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{nota|Para aprender a usarlo, se recomienda ir a los ejemplos de Arduino IDE específicos de los sensores QTR.}} | |||
Calibrar los sensores es lo primero que debería hacer el robot. Así, en la rutina de inicialización (setup), se recomienda lanzar este código: | |||
<syntaxhighlight lang="c" style="font-family:monospace; font-size:0.8em;"> | |||
#include <QTRSensors.h> | |||
// create an object for your type of sensor (RC) | |||
// in this example we have three sensors on analog inputs 0 - 2, a.k.a. digital pins 14 -16 | |||
QTRSensorsRC qtr((char[]){14,15,16},3); | |||
void setup() | |||
{ | |||
// optional: wait for some input from the user, such as a button press | |||
// then start calibration phase and move the sensors over both | |||
// reflectance extremes they will encounter in your application: | |||
int i; | |||
for(i =0; i <250; i++)// make the calibration take about 5 seconds | |||
{ | |||
qtr.calibrate(); | |||
delay(20); | |||
} | |||
// optional: signal that the calibration phase is now over and wait for further | |||
// input from the user, such as a button press | |||
} | |||
</syntaxhighlight> | |||
Para leer del sensor, se recomienda usar la función '''readCalibrated()''' o '''read()'''. Con readCalibrated(), los valores obtenidos serán entre 0 (blanco) y 1000 (negro). | |||
Para la detección de líneas, se usar la función '''readLine()''' a la que se puede decir si la línea es blanca o negra. El resultado de esta función es 0 si la línea está dentro o fuera de sensor 0 y 1000*(N-1) para cada sensor. Los valores para 8 sensores pueden ser, por tanto, 0, 1000, 2000 ... 8000 dependiendo de la posición de la línea. |
Revisión del 10:49 1 abr 2019
Este artículo trata sobre la construcción y programación de un robot que sigue líneas con Arduino y un sensor de infrarojos.
Construcción del Robot
Materiales
El chasis que verás en las fotos es específico, creado a medida por la empresa What's Next? para el proyecto [Robots Boost Skills]. El resto de componentes son genéricos y se pueden comprar Arduinos oficiales, What's Next Yellow o cualquier clon compatible.
Esta es la lista de materiales:
- Chasis que permita 2 ruedas con motor DC analógicos y una rueda delantera.
- 2 Motores DC analógicos con reducción y ruedas.
- Arduino Uno o equivalente.
- 1 Sensor Pololu QTR-8A o QTR-8RC
- Arduino Motor Shield o alguno que tenga el mismo Chip L298
- Baterías, entre 9V y 12V
Construcción del Chasis
En el caso del robot del ejemplo, el chasis tiene todos los elementos necesarios. Si lo tienes que construir, aquí tienes algunos consejos:
- Se recomienda cuidar el centro de gravedad de robot para que no plante rueda y tenga la adherencia necesaria. Por ejemplo, las baterías deberían estar entre las ruedas motrices y la rueda delantera.
- La distancia al suelo del sensor infrarojo es muy importante, ha de estar muy cerca, pero no rozar.
- Hay que dejar espacio para los cables y para poder modificar las conexiones sin necesidad de desmontar todo el robot.
El sensor
En nuestro caso, el sensor QTR-8[A-RC] es un conjunto de 8 emisores y sensores infrarrojos en un mismo circuito. Esto permite una gran precisión ,ya que tienes 8 lecturas cada vez. Estos sensores tienen una distancia recomendada de 3mm y un máximo de 6mm para el QTR-A y 9.5mm para el QTR-8RC.
La salida de los dos sensores es diferente, (analógica o digital), por lo que es importante distinguirlos y decidir cual vamos a usar. En nuestro caso, tenemos el QRT-8RC, por lo que, a partir de aquí, todo el manual se basa en este.
Puesto que vamos a usar 5V para alimentarlo, no es necesario unir los pines de 3.3V Bypass
Podemos conectar el pin LEDON que permite indicar con HIGH, LOW o PWM el estado de los LEDs. Si los apagamos, podemos consumir menos energía cuando no está leyendo.
El QTR8-RC mide la reflectancia con el tiempo entre un estado HIGH y uno LOW.
La lectura típica en el QTR8-RC es la siguiente:
- Encender los LEDs (opcional)
- Poner la linea I/O a una salida y ponerla en HIGH.
- Dejar al menos 10 μs al sensor para que arranque.
- Poner la I/O a Input
- Medir el tiempo que tarda el voltaje en caer esperando a la I/O a que vuelva a LOW.
- Apagar los LEDs (opcional)
Estos pasos se pueden hacer en varias líneas I/O al mismo tiempo. Con mucha reflectividad, el tiempo de bajada a LOW debe ser mínimo. Con poca (superficie negra) el tiempo debe mayor. Se recomienda usar el LEDON para no gastar batería hasta en un 90% del tiempo para lecturas a baja frecuencia, unos (100Hz).
Si se necesitan lecturas a mucha frecuencia, se recomienda que el sensor esté muy cerca del suelo, recomendado 3,5 mm i máximo 9 mm.
Cuanto más lejos peor lecturas y cuanta más luz ambiental peor. Si es necesario, bloquearemos la luz ambiental con cinta aislante o similar.
Leyendo del sensor
Para que funcione, necesitamos la biblioteca correspondiente. En los últimos Arduino IDE es tan simple como ir al gestor de Bibliotecas y importar la QTRSensors.
La librería funciona tanto para el QTR-8RC como el QTR-8A, pero el constructor es el que cambia:
// 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((unsignedchar[]){0,9,15,17},4);
Calibrar los sensores es lo primero que debería hacer el robot. Así, en la rutina de inicialización (setup), se recomienda lanzar este código:
#include <QTRSensors.h>
// create an object for your type of sensor (RC)
// in this example we have three sensors on analog inputs 0 - 2, a.k.a. digital pins 14 -16
QTRSensorsRC qtr((char[]){14,15,16},3);
void setup()
{
// optional: wait for some input from the user, such as a button press
// then start calibration phase and move the sensors over both
// reflectance extremes they will encounter in your application:
int i;
for(i =0; i <250; i++)// make the calibration take about 5 seconds
{
qtr.calibrate();
delay(20);
}
// optional: signal that the calibration phase is now over and wait for further
// input from the user, such as a button press
}
Para leer del sensor, se recomienda usar la función readCalibrated() o read(). Con readCalibrated(), los valores obtenidos serán entre 0 (blanco) y 1000 (negro).
Para la detección de líneas, se usar la función readLine() a la que se puede decir si la línea es blanca o negra. El resultado de esta función es 0 si la línea está dentro o fuera de sensor 0 y 1000*(N-1) para cada sensor. Los valores para 8 sensores pueden ser, por tanto, 0, 1000, 2000 ... 8000 dependiendo de la posición de la línea.