Documentos de Académico
Documentos de Profesional
Documentos de Cultura
RTP Guia de Usuario Robot A3 PDF
RTP Guia de Usuario Robot A3 PDF
Seguidor de Línea
Guía de usuario
Introducción
El robot A3 no es un juguete. Puede ser usado por niños y jóvenes bajo la supervisión y
ayuda de un adulto. El uso o abuso del producto es responsabilidad del usuario final. Grupo
Educare no se hace responsable por daños o lesiones que éste pueda causar durante su uso. Este
producto no está diseñado para jugar, no debe usarse fuera de las condiciones de trabajo. A
continuación se indican las precauciones:
• Antes de comenzar por favor lee cuidadosamente el manual.
• Utiliza baterías alcalinas o recargables. En el caso de las alcalinas asegúrate que sean nuevas, y
si compras recargables verifica que tengan suficiente carga, de lo contrario al programar lo
puedes inutilizar para siempre.
• Condiciones de trabajo:
◦ superficie lisa, de preferencia melamina,
◦ interiores con luz controlada.
• No colocar la tarjeta de circuito impreso (PCB) sobre superficies metálicas.
• El robot A3 esta ensamblado y soldado con piezas que contienen plomo y estaño, por lo cual es
necesario lavarse las manos después de manipularlo.
• Los componentes del robot están expuestos, por lo que es importante no tocarlo con las
manos mientras está en funcionamiento. Si tus manos están mojadas se puede causar un
corto circuito y dañar uno o varios componentes.
Primeros pasos de A3
¿Qué necesitas?
• Batería de 9V. Utiliza de preferencia baterías alcalinas o recargables. Si trabajará durante
tiempos prolongados con el robot, te recomendamos usar baterías recargables de
Niquel-Metal Hidruro, NiMH. No olvides comprar el cargador correspondiente.
• Cable A – B, USB a Micro USB. A3 no requiere un programador externo, todo el
hardware electrónico ya se incluye en el robot, pero para la comunicación entre la
computadora y el robot se requiere dicho cable.
• Computadora. Necesitas una computadora para programar el robot. Para ello se utiliza la
interfaz de programación de Arduino, plataforma libre, que funciona en cualquiera de los
siguientes sistemas operativos:
◦ Windows
◦ Mac
◦ Linux
• Material para pruebas. Es necesario que tengas a mano papel, cartulinas, cartoncillo y
cinta aislante negra o blanca, para improvisar pistas y probar el robot.
Conoce más del robot A3
A3 es un robot de morfología móvil de tipo diferencial, es decir se desplaza por medio de dos ruedas
con dos motores, uno para cada una. El cerebro de este robot es un Arduino Nano, y está encargado
de procesar la información que le proveen los sensores para realizar correcciones a través de los
motores, bajo el esquema básico de control.
Hardware de A3
En la figura 1 se muestra el hardware del robot. Observa que se cuenta con varios componentes
y dispositivos electrónicos. ¿Reconoces alguno?, a continuación se explican brevemente.
• Sensores reflectivos de contraste, son los encargados de percibir la información del ambiente,
en este caso el contraste, la diferencia entre lo blanco y lo negro, lo brillante y lo opaco. Este
dispositivo se compone de dos partes: emisor y receptor. Tanto el primero como el segundo
trabajan en el rango infrarrojo de la luz. Ésta no es perceptible por el ojo humano, pero con
ayuda de una cámara digital se observa.
• LEDs. Diodos emisores de luz por sus siglas en inglés, son dispositivos que emiten una luz al
circular una corriente por sus terminales. En A3 se usan como indicadores y son programables
por el usuario por medio del Arduino.
• Driver para motor. Basado en un transistor de potencia NPN, son los que proveen de potencia
al motor, siendo la interfaz entre el microcontrolador y el motor.
• Botones. Son interruptores de encendido al contacto. El robot cuenta con 2, el primero para
reiniciar el microcontrolador (arduino), y el segundo como botón de usuario para propósito
general.
• Motorreductores. Son motores de corriente directa (CD, como el de las baterías), con una caja
de engranes adaptada. Los usados en A3 tienen una reducción de 48:1, esto es, por cada 48
vueltas que gire el motor, el eje del reductor girará 1 vuelta. De este modo se incrementa el
torque, fuerza, y se reduce la velocidad.
• Batería. Es la que provee de energía eléctrica a todo el robot, arduino, sensores, LEDs,
motores, pulsadores. Es tipo rectangular de 9V.
Memoria
El ATmega168 posee 16KB de memoria flash para almacenar el codigo (de los cuales 2KB son
usados por el bootloader); el ATmega 328 posee 32KB, (también con 2 KB usados por el
bootloader). El Atmega168 posee 1KB de SRAM y 512 bytes de EEPROM (la cual puede ser leida
y escrita con la librería EEPROM); el ATmega328 posee 2 KB de SRAM y 1KB de EEPROM.
Entrada y Salida
Cada uno de los 14 pines digitales del Nano puede ser usado como entrada o salida, usando
las funciones pinMode(), digitalWrite(), y digitalRead(). Operan a 5 voltios. Cada pin puede
proveer o recibir un máximo de 40mA y poseen una resistencia de pull-up (desconectada por
defecto) de 20 a 50 kOhms. Además algunos pines poseen funciones especializadas:
• Serial: 0 (RX) y 1 (TX). (RX) usado para recibir y (TX)usado para transmitir datos TTL vía serie.
Estos pines están conectados a los pines correspondientes del chip USB-a-TTL de FTDI.
• Interrupciones Externas: pines 2 y 3. Estos pines pueden ser configurados para activar una
interrupción por paso a nivel bajo, por flanco de bajada o flanco de subida, o por un cambio de
valor. Mira la función attachInterrupt() para más detalles.
• PWM: pines 3, 5, 6, 9, 10, y 11. Proveen de una salida PWM de 8-bits cuando se usa la función
analogWrite().
• SPI: pines 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Estos pines soportan la comunicación SPI, la
cual, a pesar de poseer el hardware, no está actualmente soportada en el lenguaje Arduino.
• LED: Pin 13. Existe un LED conectado al pin digital 13. Cuando el pin se encuentra en nivel alto,
el LED está encendido, cuando el pin está a nivel bajo, el LED estará apagado.
El Nano posee 8 entradas analógicas, cada unas de ellas provee de 10 bits de resolución (1024 valores
diferentes). Por defecto miden entre 5 voltios y masa, sin embargo es posible cambiar el rango
superior usando la función analogReference(). También, algunos de estos pines poseen funciones
especiales:
• I2C: Pines 4 (SDA) y 5 (SCL). Soporta comunicación I2C (TWI) usando la librería Wire
(documentación en la web Wiring).
Hay algunos otros pines en la placa:
• AREF. Tensión de referencia por las entradas analógicas. Se configura con la función
analogReference().
• Reset. Pon esta linea a nivel bajo para resetear el microcontrolador. Normalmente se usa para
añadir un botón de reset que mantiene a nivel alto el pin reset mientras no es pulsado.
Diagrama Pictórico
Estructuras
Las dos estructuras principales son las siguientes:
• setup(), es la estructura donde se configura las entradas, salidas y los módulos. Es llamado
también como “inicialización”. Lo contenido en esta estructura se ejecuta sólamente una vez al
inicio del programa.
• loop(), es la estructura donde se escribe el código, y se repetirá infintas veces.
Valores
Constantes
• HIGH, alto,
• LOW, bajo,
• INPUT, entrada,
• OUTPUT, salida,
• True, verdadero,
• false, falso,
Variables:
• boolean, booleando,
• char, carácter,
• byte, 8 bits
• int, entero,
• unsigned int, entero sin signo,
• long, entero de 32 bits,
• unsigned long, entero 32 bits sin signo,
• float, punto flotante.
Funciones
• pinMode(), configura si el pin digital será salida o entrada,
• digitalWrite(), si el pin ha sido configurado como salida digital, su voltaje de salida será 0 o 5V.
• digitalRead(), lectura del valor digital del pin especificado,
• analogRead(), lectura del valor analógico del pin especificado,
• analogWrite(), configura la modulación por anchura de pulso de un pin (PWM),
• delay(), pausa en milisegundos.
• Serial, librería incluida para el uso y configuración del módulo serial.
Revisa la referencia del lenguaje de arduino para aprender más acerca de las estructuras, variables y
funciones de Arduino.
El primer programa en Arduino para A3
Un sencillo programa de demostración está disponible en los ejemplos de Arduino,
“Archivo/Ejemplos/01.Basics/Blink”.
Movimiento 1 Movimiento 2
Movimiento 3 Movimiento 4
Movimiento 5 Movimiento 6
Movimiento 7 Movimiento 8
Figura 17. Luces del auto increíble.
El código de este programa se encuentra disponible en la página Web:
http://www.grupoeducare.com/dct/index.php/rec/robotopia
void setup()
{
//Configuración de entradas y salidas
pinMode(runled, OUTPUT); //Salida digital en runled = pin 13
pinMode(led0, OUTPUT); //Salida digital en led0 = pin 11
pinMode(led1, OUTPUT); //Salida digital en led1 = pin 6
pinMode(led2, OUTPUT); //Salida digital en led2 = pin 7
pinMode(led3, OUTPUT); //Salida digital en led3 = pin 8
pinMode(led4, OUTPUT); //Salida digital en led4 = pin 9
//Configuración de módulos
}
void loop()
{
//Código que se repetirá infititamente
//Corrimiento de LEDs del B0 al B4
digitalWrite(led0, HIGH); //Puesta en alto de led0, prende
digitalWrite(led1, LOW); //Puesta en bajo de led1, apaga
delay(250);
digitalWrite(led1, HIGH); //Puesta en alto de led1, prende
digitalWrite(led0, LOW); //Puesta en bajo de led0, apaga
delay(250);
digitalWrite(led2, HIGH); //Puesta en alto de led2, prende
digitalWrite(led1, LOW); //Puesta en bajo de led1, apaga
delay(250);
digitalWrite(led3, HIGH); //Puesta en alto de led3, prende
digitalWrite(led2, LOW); //Puesta en bajo de led2, apaga
delay(250);
digitalWrite(led4, HIGH); //Puesta en alto de led4, prende
digitalWrite(led3, LOW); //Puesta en bajo de led3, apaga
delay(250);
Es un ejemplo sencillo pero ayuda a comprender el manejo de los pines digitales como salidas.
Ejemplo 2: Encendido de un LED con un interruptor sin contacto.
La tarjeta del robot A3 cuenta con 5 sensores del tipo reflectivo infrarrojo. Este tipo está
compuesto de dos componentes un emisor y un receptor. El primero es un LED infrarrojo, luz que no
podemos ver los ojos; el segundo es un fototransistor con filtro de luz de día.
El funcionamiento es el siguiente:
Cuando el LED infrarrojo se encuentre emitiendo luz, si la superfice es reflejante, por ejemplo blanca,
se refleja una cantidad de luz que es percebida por el fototransistor, que convierte la señal luminosa
en voltaje, permite un flujo de corriente entre sus terminales y por la configuración de carga de
emisor se obtiene un valor.
Por lo contrario si el la superficie es opaca, por ejemplo negra, se refleja poca luz, la cual es percibida
por el fototransisto, pero se genera poca corriente en sus terminales y por consiguiente poco voltaje.
Este sensor no puede servir como un interruptor sin contacto, y se usa comúnmente en muchos
procesos de la industra y cotidianos, tal es caso de las llaves automáticas de agua usadas en los baños
públicos. La intensión es que cuando coloque su dedo frente al sensor este active el LED.
void setup()
{
//Configuración de entradas y salidas
pinMode(led0, OUTPUT); //Salida digital en led0 = pin 11
//Configuración de módulos
}
void loop()
{
//Código que se repetirá infititamente
sensor4 = analogRead(A4); //Lectura del sensor Izquierdo
if (sensor4 > 512) //Si la superficie es blanca entonces prende LED
{
digitalWrite(led0, HIGH);
}
else //Sino, es decir, es negro, entonces apaga LED
{
digitalWrite(led0, LOW);
}
delay(50);
}
/*--------------------------------Fin del código--------------------------------*/
El funcionamiento de este será el siguiente, cuando coloque su dedo cerca del sensor marcado como
“A4” en el PCB del robot el indicador LED marcado como B0 se encenderá, sino se mantendrá
apagado, como se muestra en la siguiente figura.
Si el sensor 4, A4, detecta, está sobre una Si el sensor 3, A3, detecta, está sobre una
superficie reflejante, entonces prende el LED superficie reflejante, entonces prende el LED
marcado como B0. marcado como B1.
Si el sensor 2, A2, detecta, está sobre una Si el sensor 1, A1, detecta, está sobre una
superficie reflejante, entonces prende el LED superficie reflejante, entonces prende el LED
marcado como B2. marcado como B3.
Si el sensor 0, A0, detecta, está sobre una Cada uno de los sensores debe accionar de
superficie reflejante, entonces prende el LED manera independiente, pudiendo estar varios en
marcado como B4. superficie reflejante y tener funcionamiento.
Ejemplo 3: Accionar de motores.
Para probar los motores tenemos que conectarlos en los terminales (verdes con tornillos), marcados
como “Motor A” y “Motor B”. En la siguiente figura se muestra a manera de ejemplo la conexión.
int MotorA = 3;
int MotorB = 5;
int led1 = 6;
int led2 = 7;
int led3 = 8;
void setup()
{
//Configuración de entradas y salidas
pinMode(MotorA, OUTPUT); //Salida digital en MotorA = pin 5
pinMode(MotorB, OUTPUT); //Salida digital en MotorA = pin 3
pinMode(led1, OUTPUT); //Salida digital en led1 = pin 6
pinMode(led2, OUTPUT); //Salida digital en led2 = pin 7
pinMode(led3, OUTPUT); //Salida digital en led3 = pin 8
//Configuración de módulos
}
void loop()
{
//Código que se repetirá infititamente
//Adelante
digitalWrite(MotorA, HIGH);
digitalWrite(MotorB, HIGH);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
delay(1000);
//Derecha
digitalWrite(MotorA, HIGH);
digitalWrite(MotorB, LOW);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
delay(1000);
//Izquierda
digitalWrite(MotorA, LOW);
digitalWrite(MotorB, HIGH);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
delay(1000);
}
/*--------------------------------Fin del código--------------------------------*/
Funcionamiento
El robot deberá ir hacia adelante, después a la derecha y por último a la izquierda. Se repetirá
infinitamente. Verifique que la secuencia descrita corresponda con el movimiento del robot. Si alguno
de los motores gira en sentido contrario invierta los cables en los terminales de tornillo (verdes).
Ejemplo 4: Visualización del valor de los sensores en monitor serial.
Una de las grandes ventajas de las tarjetas de Arduino es su simplicidad para establecer conexión con
una computadora. Esto se realiza gracias al convertivor USB a serial incluido en la tarjeta. A demás el
entorno de programación cuenta con una aplicación, monitor serial, que sirve para visualizar, recibir y
enviar información.
El siguiente programa obtiene el valor de los sensores reflectivos analógico, los cuantifica y los
despliega. La cuantificación es el proceso por el cual se le asigna un valor en bits a una señal. Los
convertidores CAD, Analógico a Decimal, cuantifican las señales, es decir entregan un valor en número
dependiendo de la resolución que posean. En el caso del microcontrolador que se usa, Atmega328, la
resolución es de 10 bits, es decir 1024 divisiones en la escala del 0 al 5V. Una buen analogía es la
siguiente: Suponga que tiene una escalera de 5 metros con 1024 escalones, cada escalón le hará subir
0.0048 metros. Si otra persona le indica que tiene que pintar una linea a 2.5 metros del piso, ¿Cuántos
escalones tendrá que subir?, esto puede resolverse por una simple regla de tres:
2.5metros∗1024escalones
Dato= =512escalones
5metros
A grosso modo eso es lo que hace un convertidor Analógico a Digital, convierte un voltaje en un dato
que pueda manipular.
Para realizar la calibración los sensores o para obtener información de ellos se puede realizar un
programa que muestre los datos en el monitor serial. A continuación se propone el código para
realizar esta tarea.
void setup()
{
//Configuración de entradas y salidas
//Configuración de módulos
Serial.begin(9600);
}
void loop()
{
//Código que se repetirá infititamente
sensor0 = analogRead(A0); //Lectura del sensor Derecho
sensor1 = analogRead(A1); //Lectura del sensor Centro Derecho
sensor2 = analogRead(A2); //Lectura del sensor Centro
sensor3 = analogRead(A3); //Lectura del sensor Centro Izquierdo
sensor4 = analogRead(A4); //Lectura del sensor Izquierdo
Serial.print("Sensor Derecho = ");
Serial.println(sensor0);
Serial.print("Sensor Centro Derecho = ");
Serial.println(sensor1);
Serial.print("Sensor Centro = ");
Serial.println(sensor2);
Serial.print("Sensor Centro Izquierdo = ");
Serial.println(sensor3);
Serial.print("Sensor Izquierdo = ");
Serial.println(sensor4);
delay(500);
}
/*--------------------------------Fin del código--------------------------------*/
Funcionamiento
Una vez compilado y descargado el código se deberá abrir el monitor serial dentro del IDE de Arduino
para ver los datos.
En la figura se puede observar los valores obtenidos sobre una superficie reflejante, en la parte
superior, y en la posterior sobre una superficie opaca. Estos datos son importantes para la
determinación del umbral para el seguidor de línea.
Ejercicio 2
Desarrolle el código para un programa que muestre por el monitor serial el valor de los sensores en
Voltaje.
Ejemplo 5: Seguidor de línea – Básico
El seguimiento de una línea es una buena introducción en la programación de robots.
Para hacer pruebas dibuje con la cita de aislar una pista sencilla, tal vez sea suficiente con un
rectángulo con las esquinas redondeadas o una elipse. No se recomienda vueltas con ángulos rectos,
90 grados.
Se propone el siguiente código, copie y pegue en el área de código del IDE de Arduino.
void setup()
{
//Configuración de entradas y salidas
pinMode(runled, OUTPUT); //Salida digital en runled = pin 13
pinMode(led0, OUTPUT); //Salida digital en led0 = pin 11
pinMode(led1, OUTPUT); //Salida digital en led1 = pin 6
pinMode(led2, OUTPUT); //Salida digital en led2 = pin 7
pinMode(led3, OUTPUT); //Salida digital en led3 = pin 8
pinMode(led4, OUTPUT); //Salida digital en led4 = pin 9
//Configuración de módulos
}
void loop()
{
//Código que se repetirá infititamente
sensor0 = analogRead(A0);
sensor1 = analogRead(A1); //Lectura del sensor Centro Derecho
sensor2 = analogRead(A2); //Lectura del sensor Centro
sensor3 = analogRead(A3); //Lectura del sensor Centro Izquierdo
sensor4 = analogRead(A4);
if (sensor0 > umbral && sensor1 > umbral && sensor2 < umbral && sensor3 > umbral && sensor4 >
umbral) //Si la superficie es blanca entonces prende LED
{
analogWrite(5, velocidad);
analogWrite(3, velocidad);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
}
//Centro y derecho
if (sensor0 > umbral && sensor1 < umbral && sensor2 > umbral && sensor3 > umbral && sensor4 >
umbral) //Si la superficie es blanca entonces prende LED
{
analogWrite(5, 50);
analogWrite(3, velocidad);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
}
//derecho
if (sensor0 < umbral && sensor1 > umbral && sensor2 > umbral && sensor3 > umbral && sensor4 >
umbral) //Si la superficie es blanca entonces prende LED
{
analogWrite(5, 20);
analogWrite(3, velocidad);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
}
//Centro Izquierdo
if (sensor0 > umbral && sensor1 > umbral && sensor2 > umbral && sensor3 < umbral && sensor4 >
umbral) //Si la superficie es blanca entonces prende LED
{
analogWrite(5, velocidad);
analogWrite(3, 50);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
}
//Izquierdo
if (sensor0 > umbral && sensor1 > umbral && sensor2 > umbral && sensor3 > umbral && sensor4 <
umbral) //Si la superficie es blanca entonces prende LED
{
analogWrite(5, velocidad);
analogWrite(3, 20);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
}
}
/*--------------------------------Fin del código--------------------------------*/
Funcionamiento
Son cinco las entradas que se toman en cuenta para hacer la corrección en los motores y de esta
forma seguir la línea. Si ya probó el código se dará cuenta que el robot sigue la línea de la siguiente
manera.
Ajuste y determine las acciones a tomar con respecto a la velocidad de cada uno de los motores.
Ejemplo 6: Seguidor de línea con Control PID
Para seguir la línea con precisión es necesario aplicar métodos de control. La técnica usada en este
ejemplo es el control PID.
• Proporcional, es un valor propocional a la posición del robot sobre la línea. Si el robot está
centrado sobre la línea el error será 0, pero si se encuentra a la derecho o izquierda el valor del
error será positivo o negativo.
• Integral, es una memoria de todos los eventos anteriores. Una integral en sistemas discretos,
generalmente usados por micro-controladores y microprocesadores, se pude expresar como la
sumatoria de todos los puntos anteriores, lo que en sistemas continuos es el área debajo de la
curva.
• Derivativo, es la razón de cambio, la tendencia, el diferencia de los valores actuales y
anteriores.
El código propuesto
/*--------------------------------Inicio código-------------------------------------*/
#include <QTRSensors.h> //Biblioteca para la lectura y calibración de los sensores de contraste
//Declaración de constantes
#define NUM_SENSORS 5 // Número de sensores
#define NUM_SAMPLES_PER_SENSOR 4 // Número de muestras por sensor
#define EMITTER_PIN 2 // Controlador de emisores LED's infrarrojos
//Los sensores reflectivos para detectar contraste de encuentran conectados en las entradas
//Analógicas A0 a A4
QTRSensorsAnalog qtra((unsigned char[]) {0, 1, 2, 3, 4, 5}, NUM_SENSORS,
NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS]; //Vector para almacenar señal de sensores
//Declaración de variables
int total = 0;
float average = 0;
int index = 0;
int last_proportional;
int integral;
void setup(){
//Configuración de entradas y salidas digitales
delay(500);
pinMode(13, OUTPUT);
//Se prende el indicador LED conectado en el pin 13, para indicar que se
//inicia la calibración
digitalWrite(13, HIGH);
//Rotación del robot para calibración
analogWrite(MotorA, 90);
analogWrite(MotorB, 0);
analogWrite(MotorA, 0);
analogWrite(MotorB, 0);
delay(1000);
void loop(){
while(1){
//Se obtiene el valor de cada uno de los sensores mediante la función qtra.readline();
unsigned int position = qtra.readLine(sensorValues);
/*--------------------------------Fin de código-------------------------------------*/
Para la compilación de este programa es necesario descargar e instalar la librería “QTRSensors” para
Arduino.
Funcionamiento
El robot seguirá una línea blanca sobre fondo negro, deslizándose de la mejor manera posible, debido
al método de contro usado, PID.
Ejercicio 4:
Modifique el código para que el robot siga una línea negra con fondo blanco.