You are on page 1of 7

Robot seguidor de línea (ARJ)

Grupo: Alfredo Hugueth Polo, Roberto Sánchez Castro y Jesus Yepez Ricaurte.
Universidad del Norte - Ingeniería eléctrica y electrónica.
huguethm@uninorte.edu.co, rsanchezm@uninorte.edu.co,
jesusy@uninorte.edu.co

Febrero 2018

Resumen — En este documento se explica de forma detallada 7. Adaptador para cuatro baterías AA 1.5V.
el proceso de diseño y construcción, de un robot seguidor de línea 8. Tres sensores de infrarrojos IR FC-51.
con arduino; presentando aspectos y problemas a tener en cuenta
antes y durante su ensamblaje.

Palabra clave — arduino; seguidor de línea; robot. IV. RECOMENDACIONES Y BOCETOS INICIALES
Abstract— This document explains in detail the design and Primeramente, se dictaron recomendaciones para la
construction process of a line follower robot with Arduino; realización del proyecto por parte de los profesores; estas
presenting aspects and problems to consider before and during fueron:
their assembly.
Keywords— arduino; line follower; robot. ● Usar servomotores en vez de motores DC.
● Tener dos fuentes de alimentación, una para los
I. INTRODUCCIÓN servomotores y otra para la alimentación del arduino
La robótica es una de las áreas más importantes dentro del y los circuitos.
campo de acción de los Ingenieros Electricista y Electrónicos, ● Hacer uso de por lo menos dos sensores infrarrojos
todo con el fin de mejorar la calidad de vida del ser humano. (CNY70) en los costados del carro
En este curso y más concisamente en este corte, aplicamos ● Comprar el chasis “Chasis Rover Mini MEC_0537”
técnicas aprendidas en clase e investigadas por cuenta propia, de la tienda en línea [http://tdrobotica.co/].
para diseñar el Software y Hardware de nuestro robot. Qué,
aun siguiendo una instrucción simple como lo es seguir una Siguiendo todas las recomendaciones, ya armado el chasis en
línea, es la oportunidad perfecta para empezar una incursión la clase se realizó una lluvia de ideas para decidir cuál será el
dentro del vasto y complejo mundo de la Robótica y sus diseño final y donde iba a estar ubicado cada componente;
aplicaciones. teniendo en cuenta las dimensiones, el peso y la funcionalidad
de estos, además de accesibilidad en caso de que se requiriese
II. OBJETIVOS realizar modificaciones al diseño.
● Entender y aplicar los conocimientos adquiridos en la
clase e investigados acerca de la robótica usando
arduino.
● Diseñar un robot autónomo que sea capaz de seguir
una línea negra en el piso, hecha de cinta aislante.
● Participar en la competencia del curso, cuya finalidad
es tener ser el robot más veloz, en terminar el
recorrido.

III. LISTA DE COMPONENTES


Estas son las partes individuales del robot con sus respectivas
referencias:

1. Chasis Rover Mini MEC_0537.


2. Dos mini servomotores de rotación continua FS90R.
3. Dos ruedas para los motores, y una rueda loca
Ilustración 1. Imagen donde los componentes están solamente
(incluidas con la compra del chasis).
posicionados antes de hacer el ensamblaje.
4. Power bank de 1500 mA/h
5. Protoboard pequeño SYB-46.
6. Arduino UNO.
Para comenzar, imaginando como sería la mejor manera de velocidad, corroboramos que, en efecto, estos eran
ubicar la parte, se probó colocando el power bank y la aquellos que se necesitaban.
protoboard encima del chasis, cuya parte superior tiene el
espacio suficiente para alojar a ambos componentes.
Siguiendo la recomendación del profesor, se planeó utilizar
dos fuentes de alimentación independientes, una para los
servomotores y otra para la alimentación del arduino y los
circuitos. Se situó el adaptador de baterías AA en la parte
inferior del chasis de modo que no interfiriera con el
movimiento de las ruedas. Por último, el arduino iría encima
del power bank y los sensores infrarrojos en los lados del
chasis apuntando hacia abajo.

V. ANÁLISIS DE COMPONENTES Y PROBLEMAS


Ilustración 2. Imagen de los servomotores de rotación continua.
ENCONTRADOS
Para validar el avance de nuestro robot se realizaron diferentes
ensayos, probando por separado cada componente y luego,
todos integrados. VI. PRUEBAS Y PROCESO DE MONTAJE
● Sensores: Inicialmente, se usaron sensores El primer paso fue armar el chasis del robot atornillando las
analógicos de referencia “CNY70”, los datos ruedas y ubicando los nuevos motores.
arrojados por estos mismos eran en un principio,
valores entre 10 y 30 cuando el sensor estaba en una
superficie blanca y entre 80 y 100 al estar sobre una
línea negra, valores que no serían eficientes al
momento de enviar una señal de entrada al arduino,
ya que son demasiado cercanos entre sí. Los sensores
fueron ajustados y se obtuvo que las mediciones para
superficie blanca eran valores negativos mayores a
1000 y sobre la línea negra positivos mayores a 1000,
lo cual fue una buena señal para su implementación
en el robot, sin embargo, con cada prueba sus valores
cambiaban, por lo que se decidió dejarlos de lado.
Tras una discusión entre los integrantes del grupo, se
acordó que se usarían “Sensor de Infrarrojos IR FC- Ilustración 3. Chasis armado.
51”. Este modelo corresponde a un sensor digital, que
puede ser ajustado mediante un potenciómetro, de
este modo se configuró para arrojar valores de 1 El siguiente paso fue unir el power bank, el protoboard y por
cuando el sensor estuviese sobre la línea negra, y último el adaptador de baterías AA al chasis, para esto se
valores de 0 al estar en superficie blanca. utilizó silicona caliente, cubriendo antes la superficie del
chasis con cinta aislante para no dañar o desgastar la pintura
de este; y cable UTP para atar el protoboard, desde 4 agujeros
● Motores: Los motores que acompañaban al chasis preexistentes al chasis.
usado, eran del modelo “SG-90”, estos motores
resultaron poco prácticos para nuestro robot, ya que
solo presentaban un giro de 180°, y su programación
radica en colocar una posición deseada para su giro.
El mayor problema de estos motores estaba en que
ajustar el robot a su especificación daría como
resultado un código de programación mucho más
complicado para nuestro propósito, por lo anterior se
decidió buscar Servomotores que se movieran en un
ángulo de 360° y que, además, fuesen de giro
continuo, por ende, en el diseño final se utilizaron los
Servos de referencia “FS90R”. Su funcionamiento
básico consiste en poder ajustar la velocidad de giro, Ilustración 4. Vista superior antes de poner el adaptador de
tras un par de pruebas, con distintos valores de baterías AA.
Ilustración 5. Vista inferior antes de poner el adaptador
de baterías AA.
Ilustración 8. Vista superior con el arduino atado con
bridas.

Recordando que en primera instancia se planeó usar solo 2


sensores CNY70, se armó un circuito con estos sensores que
más tarde fue reemplazado por el inconveniente expresado
anteriormente en el documento.

Ilustración 6. Vista inferior con el adaptador


posicionada.

Con el objetivo de ubicar el arduino en la parte superior del


power bank, se requirió hacer que la superficie del power bank
fuese un poco rugosa con ayuda de papel de lija, para que
Ilustración 9. Circuito con sensores CNY70.
fuese posible pegar un trozo de icopor recortado de un plato
desechable, de esta forma el arduino no tendría mayor firmeza,
no se resbalara de su lugar y también que funcionase como un
aislante eléctrico, sin embargo esta última característica es Al fin de cuentas, se usaron 3 sensores, ubicados en la parte
solo un añadido ya que la cubierta del power bank está hecha delantera de nuestro chasis, el código estuvo diseñado para
de plástico. que el Arduino les enviase diferentes instrucciones a los
motores dependiendo de los valores arrojados por los sensores,
considerando dentro del código las diferentes combinaciones
de 1 y 0 arrojados por los 3 sensores en conjunto. Las primeras
pruebas eran de movimiento, observando si los motores
respondían de manera correcta al ser los sensores colocados
sobre superficie blanca o sobre la línea negra; después de
hacer las primeras pruebas y observar que el movimiento de
los motores no era el esperado, se rectificó si el
posicionamiento de estos estaba correcto, lo cual resultó ser la
solución ya que estaban al revés. Después de esto, se nota que
por lo general la rotación de los motores, ya sea de manera
individual o en conjunto estaba dentro del rango previsto. Tras
Ilustración 7. Vista superior con pieza de icopor pegada. esto se procedió a probar el comportamiento del robot en un
estado de movimiento libre, obteniendo en las primeras
pruebas que un movimiento a velocidad máxima provocaba
demasiada inestabilidad, que se veía reflejada en desviaciones
con respecto a la trayectoria planteada, por lo cual decidimos
disminuir la velocidad de rotación. Mediante se avanzaba en
los ensayos, se realizaban modificaciones en el código,
pasando de tener un robot que no podía cambiar de dirección a
uno perfectamente capaz de hacerlo. El giro final para volver a
la trayectoria demandó la inclusión de un bucle dentro de
nuestro código (while), ya que durante las primeras pruebas el
robot solo giraba sobre sí mismo indefinidamente, con la
adición de esta instrucción el robot fue perfectamente capaz de
volver a la ruta requerida. guiada ahora por los sensores
infrarrojos digitales.

Ilustración 10. Vista superior del robot terminado.

Ilustración 11. Vista lateral del robot terminado.

«El video del robot funcionando en todas sus capacidades se


puede ver en el siguiente enlace:»
[https://youtu.be/9HM7wIztPrU]
VII. CÓDIGO motor_de.write(90);
motor_iz.write(90);
#include <Servo.h> }
// Codigo para robotica- Seguidor de linea int leer_sensor1(){
Servo motor_de; int lectura;
Servo motor_iz; lectura = digitalRead(4);
unsigned long contador_viejo = 0; return lectura; // leemos el sensor que se
void setup() { posiciona en la parte izquierda de nuestro chasis

// put your setup code here, to run once: }

Serial.begin(9600); int leer_sensor2(){

pinMode(5,INPUT); int lectura;

pinMode(3,INPUT); lectura = digitalRead(5);

pinMode(4,INPUT); return lectura; // leemos el sensor que se


posiciona en el centro del chasis
motor_de.attach(9);
}
motor_iz.attach(10);
int leer_sensor3(){
}
int lectura;
void mover_adelante(){
lectura = digitalRead(3);
motor_de.write(120);// De esta forma
movemos el servomotor derecho en sentido return lectura; // leemos el sensor que se
horario a maxima velocidad posiciona en la parte derecha del chasis

motor_iz.write(55);// De esta forma movemos }


el servomotor izquierdo en sentido anti horario a void mover_atras(){
maxima velocidad( es necesario ya que este está
alrevez) motor_de.write(180);

} motor_iz.write(0);

void mover_derecha(){ }

motor_iz.write(90); // detenemos el servo void loop() {


motor izquierdo int valoriz = leer_sensor1(); // leemos los
motor_de.write(103); // Seguimos moviendo el sensores
servo derecho con el objetivo de que este de la int valorce = leer_sensor2(); // valores 0
vuelta a la izquierda indican linea blanca
} int valorde = leer_sensor3(); // valores 1
void mover_izquierda(){ indican linea negra

motor_de.write(90); // detenemos el servo if(valoriz == 0 && valorde == 0 && valorce ==


motor derecho 1){

motor_iz.write(78); // movemos el servo mover_adelante();


izquierdo a maxima velocidad para que este rote }
a la derecha
if(valoriz == 1 && valorde == 0 && valorce ==
} 0){
void detener(){ int b = leer_sensor2();
int c = leer_sensor3(); if (valoriz == 0 && valorce == 1 && valorde ==
1){
while(b==0 && c == 0 ){
mover_izquierda();
mover_izquierda();
}
b=leer_sensor2();
}
c = leer_sensor3();
}
mover_derecha();
}

if(valoriz == 0 && valorde == 1 && valorce ==


0){
int a = leer_sensor2();
int b = leer_sensor1();
while(a == 0 && b == 0){
mover_derecha();
a=leer_sensor2();
b = leer_sensor1();
}
mover_izquierda;
}
if (valoriz == 0 && valorce == 0 && valorde ==
0){
int c =leer_sensor2();
int a = leer_sensor1();
int b = leer_sensor3();
while(c==0 && a==0 && b==0){
mover_derecha();
c = leer_sensor2();
a = leer_sensor1();
b = leer_sensor3();
}
detener();
}
if (valoriz == 1 && valorce == 1 && valorde
==0){
mover_derecha();
}
VIII. EXPLICACIÓN DEL CÓDIGO que estos actúan como los ojos de nuestro robot y en general
La mayor parte del código está dedicada a leer las señales de lo dejan cumplir con su valor de manera satisfactoria.
entrada de los sensores, y con respecto a estas entradas,
enviarle una señal a los Servomotores para desplazar nuestro
robot. “mover_adelante”, “mover_derecha” y IX. LIMITACIONES
“mover_izquierda”, son las 3 funciones de movimiento Con respecto al diseño final, el robot presenta ciertas
posibles para nuestro robot (Cabe destacar que nuestros complicaciones al tomar una curva con un ángulo demasiado
Servos están conectados al revés) , siendo la primera el agudo, esto por la ubicación de los sensores. Esto se pudo ver
movimiento de las 2 ruedas, la segunda el movimiento a la evidenciado a la hora de la presentación, ya que requirió
izquierda y la tercera el movimiento a la derecha. Los “If” varios intentos antes de que pudiese seguir la línea en el
están hechos para llamar a cualquiera de las 3 funciones camino presentado. Adicionalmente Teniendo en cuenta el
anteriores, en virtud de la posición de los sensores, código, y los sensores usados, el robot es incapaz de eludir
“if(valoriz == 0 && valorde == 0 && valorce == cualquier obstáculo colocado en su camino, en adición, un
1)”, indica que los sensores de la izquierda y de la derecha desperfecto en el camino puede generar que el robot cambie su
están sobre la superficie blanca (Obteniendo valores de 0) y el trayectoria drásticamente.
sensor del centro está sobre la línea negra (Obteniendo valores
de 1), por lo tanto llama a la función “mover_adelante”, que Los sensores están ajustados para tomar valores en una
indica un movimiento recto sobre nuestra línea. Las siguientes superficie blanca de una tonalidad específica, que si es
dos funciones contemplan los casos en los que el robot llegue cambiada puede producir una toma de datos errónea y por
ende problemas en el movimiento del robot, este problema se
a una curva, siendo primero, “if(valoriz == 1 &&
hizo ver también a la hora de presentar el robot ya que el suelo
valorde == 0 && valorce == 0)”, esto indica que el
del salón de clases, no tenía un color tan blanco en
sensor de la izquierda tocó la línea negra y los otros dos
comparación con el piso que aparece en el video de las
sensores se encuentran sobre la superficie blanca, en este caso
pruebas, incluso tenía irregularidades en si color; esto requirió
se llama a la función “mover_izquierda”, con la cual nuestro
una cuidadosa y tediosa calibración de la sensibilidad de los
robot detendrá el Servo derecho y moverá el izquierdo a
sensores infrarrojos, para que el robot completar el recorrido
máxima velocidad, generando así un giro hacia la izquierda
en la competencia.
(Como ya se mencionó, los servos están conectados al revés),
y esto lo hará hasta que el sensor del centro obtenga un 1 (Es
decir, que toque la línea negra), interrumpiendo así nuestro
condicional y retomando el movimiento “mover_adelante”. El X. RECOMENDACIONES Y SUGERENCIAS
siguiente condicional es “if(valoriz == 0 && valor de Para mejorar el desempeño del robot, se podría experimentar
== 1 && valorce == 0)”, en el cual, nuestro sensor con diferentes posiciones para los sensores, con el fin de que
derecho está sobre la línea negra (1) y el izquierdo y del centro se puedan manejar mejor las curvas. Con un mayor
están sobre la superficie blanca (0), llamando así a la función conocimiento acerca de programación en Arduino, se podría
“mover_derecha”, que detendrá el Servomotor izquierdo y tener un código más sencillo, que realizará una toma de datos
moverá a máxima velocidad el derecho, moviendo así nuestro más rápida y por tanto brindaría mayor precisión y rapidez con
robot a la derecha, hasta que el sensor del centro arroje un 1, respecto al movimiento del robot.
en este caso se interrumpirá nuestro condicional y volveremos
al estado de “mover_adelante”. Nuestro último condicional
presenta el caso en el cual el robot ya ha terminado la Referencias
trayectoria, es decir que los 3 sensores están sobre la
superficie blanca (0), en este caso se decidió llamar a la [1] santravis, “Robot Seguidor de linea Negra,” 2016.
función “mover_derecha”, esto con el fin de que nuestro robot [Online]. Disponible:
rote sobre sí mismo buscando que los sensores vuelvan a estar http://forum.arduino.cc/index.php?topic=403327.0.
sobre la línea negra (1), el estado detener se toma únicamente [Accedido: 28-Feb-2019].
si no se cumple ninguna de las condiciones, esto con el fin de
dar paso a la ejecución de cualquiera de los siguientes [2] aaronarduino, “Vario sensores infrarrojos en diferentes
localizaciones,” 2017. [Online]. Disponible:
condicionales, siendo “if (valoriz == 1 && valorce ==
https://forum.arduino.cc/index.php?topic=477975.0.
1 && valorde ==0)”, caso en el cual se debe mover más
[Accedido: 28-Feb-2019].
hacia la derecha para que el sensor del centro sea el único con
valor de 1 y “if (valoriz == 0 && valorce == 1 && [3] dharem, “¿Cómo conecto mis servomotores a la
valorde == 1)”, caso en el cual se debe mover más hacia la arduino usando fuente externa?,” 2012. [Online].
izquierda para que el único sensor con valor de 1 sea el del Disponible:
centro. Cabe destacar que el éxito de nuestro robot se debe en https://forum.arduino.cc/index.php?topic=117379.0.
mayor medida a la validación constante de los sensores, ya [Accedido: 28-Feb-2019].

You might also like