SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
ROBOT AUTÓNOMO PARA RECORRER UN LABERINTO
Autores:
Moguel Jiménez, Luis Fernando luisfermj@hotmail.com; Pérez Nango, Manuel de Jesús
manuelpereznango@hotmail.com; Reyes Palacios, Shanel Daniela isc_shanel_reyes@hotmail.com;
Molina Sosa, Benjamín molinasb.94@gmail.com.
Instituto Tecnológico de Tuxtla Gutiérrez, Carretera Panamericana Km. 1080, C.P. 29050, Apartado
Postal: 599, Tuxtla Gutiérrez, Chiapas.
Resumen--- El objetivo de este trabajo es presentar los detalles principales del diseño del
hardware y software de un robot autónomo que es capaz de desplazarse a través de un
laberinto prediseñado, siguiendo trayectorias rectilíneas con desviaciones a 90 o 180º ante
la detección de un borde o pared del laberinto, cuando se interpone en su camino recto.
El robot integra sensores de línea, con los cuales será capaz de seguir con autonomía un
laberinto de líneas negras sobre una superficie blanca, en este se mostrarán caminos
correctos e incorrectos, por eso mismo el robot debe corregirlo.
El diseño y la construcción de un prototipo de este robot se realizaron como parte del
proyecto de grado de la materia “Lenguaje de Interfaz” correspondiente al sexto semestre
de la carrera de Ingeniería en Sistemas Computacionales del Instituto Tecnológico de Tuxtla
Gutiérrez.
-----------------------------------------------------------------------------------------------------------------------------------
Palabras clave: Robot autónomo, laberinto, sensores ultrasónicos, sensor de linea, placa
Arduino.
Abstract--- The objective of this document is to present the main details about the design of
hardware and software of an autonomous robot that is able to go over a predesign maze,
following rectilineals ways with 90 or 180° deflections, detecting edges and maze walls.
The prototype includes several line sensors in order to be able to follow with autonomy the
black lines in a maze with a white surface. Obviously there gonna be corrects an incorrects
ways that the robot should analyze.
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
The design and build of this prototype was a part of a final project in “Lenguaje de interfaz”,
that is a school subject in the sixth semester of Engineering on Computerized Systems in the
Tuxtla Gutierrez Institute of Technology.
------------------------------------------------------------------------------------------------------------------------------------
Keywords: Autonomous Robot, maze, ultrasonic sensors, line sensors, arduino board
I.- INTRODUCCIÓN
El proyecto para la creación de un robot
autónomo capaz de recorrer los pasillos
de un laberinto surgió como el desafío de
presentar un trabajo de desarrollo
novedoso y ambicioso para lo que es un
proyecto de una materia de semestre.
Se diseñó un prototipo basado en
“Arduino”, plataforma electrónica abierta
(código y hardware abiertos) que permite
la creación de prototipos basados en
software y hardware flexibles. (Arduino,
2016)
En particular, para la construcción del
sistema de control del robot se utilizó una
placa Arduino Uno, sensores de linea y
servomotores para lograr el
desplazamiento del robot dentro del
laberinto.
El prototipo emplea una serie de sensores
de luminosidad con los cuales es capaz
de seguir una línea. El sensor de luz emite
permanentemente una luz y recibe su
reflejo, con el cual midiendo la
luminosidad del reflejo, es capaz de
interpretar la luminosidad de la superficie
que está recibiendo, aquí el concepto
físico a resaltar es que los colores claros
reflejan más luz que los colores oscuros.
Siguiendo esta idea principal, nuestra
estrategia será que el robot sea capaz de
detectar contrastes, así cuando este
detecte zonas blancas no realizara
ninguna acción de corrección y así mismo
al toparse con la línea negra, sea capaz
de corregir su dirección y seguir con su
camino.
II.- DESARROLLO Y DISEÑO
Al momento del diseño del prototipo se
tuvieron en cuenta varias características
que afectarían a la implementación
exitosa del mismo. Entre las cuestiones
que se analizaron en la etapa de diseño
se pueden mencionar: el chasis, los
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
movimientos a realizar por el robot, los
tipos de sensores, y la alimentación
necesaria para el funcionamiento de los
componentes electrónicos.
A. Chasis
Para este caso se diseñó un chasis pre-
fabricado de forma alargada en forma de
“T”, acompañado con otras características
de implementación, que nos permitiría
realizar mejores movimientos.
B. Movimientos
La trayectoria que realiza el robot es en
línea recta con giros de 90º o 180°
cuando detecta un obstáculo.
La tracción (fig. 1) utilizada es diferencial
(se usan dos servomotores
independientes), lo que hace que los giros
sean más sencillos y además permite
realizar los movimientos sin más espacio
que el que está ocupando (gira sobre su
propio eje).
Fig. 1 Tracción diferencial
Otro aspecto del diseño que se definió fue
la ubicación de las ruedas, dado que esto
también impacta, en el prototipo se
ubicaron en la parte de adelante para una
mayor tracción.
Para las ruedas se utilizaron un par de
ruedas de plástico para servomotor y
como eje se le añadió uno de los brazos
que viene con el servo.
C. Sensores
Debido a que este sensor capta grados de
luminosidad, no es capaz de distinguir
colores, sólo captando la existencia del
blanco (claridad), negro (oscuridad) y los
tonos de grises que corresponden a los
distintos porcentajes de luz existentes en
el medio.
Para los sensores de línea (fig. 2), por
cada se sensor (en este caso se usaron
4), se usaron un LED ultra brillante verde
+ una fotorresistencia + 1 resistencias de
330 ohms + 1 resistencia de 10k.
Fig. 2 Sensores de línea
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
El diodo emisor de luz (LED) envía un
constante haz de luz (fig. 3) hacia el suelo.
Esta luz se refleja de nuevo a la LDR.
Dependiendo del color, la fotorresistencia
recibe cantidades variables de luz
reflejada.
Fig. 3 Reflejo de la luz
D. Motores
Para el movimiento de las ruedas se
usaron servomotores. El tamaño reducido
del servo MG90 (fig. 4) lo hace ideal para
la construcción del prototipo (Arduino,
2016)
Fig. 4 Servomotor MG90
Los servomotores hacen uso de la
modulación por ancho de pulsos (PWM)
para controlar la dirección o posición de
los motores de corriente continua. La
mayoría trabaja en la frecuencia de los
cincuenta hercios, así las señales PWM
tendrán un periodo de veinte
milisegundos.
E. Alimentación
Para lograr un prototipo autónomo se
utilizó una fuente de alimentación, en este
caso, se usó una batería LI-PO de 7.4v a
4500 mAh (fig. 5), la cual alimentaba a la
placa Arduino, los servos y los sensores
de línea.
Fig. 5 Batería LI-PO
La batería se ubicó en la parte de enfrente
del robot para que las llantas se acercaran
lo más posible al suelo, logrando así gran
estabilidad y mayor tracción.
III.- CONEXIONES
Se hicieron las conexiones
correspondientes de todos los elementos
anteriormente mencionados para el buen
funcionamiento del robot. Primeramente
hicimos las conexiones del puente H
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
(L298N) y de los servomotores con el
Arduino uno (fig. 6).
Fig. 6 Conexión de los motores y puente
H
Tabla 1. Pines usados en el Arduino
para la conexión del puente H
Tabla 2. Conexión de los Servos al
puente H
Después de hacer las conexiones del
puente H, procedimos a hacer las
conexiones de los sensores de línea al
Arduino, en este caso, fueron hechas con
LED´s ultrabrillantes y fotorresistencias
(fig. 7).
Fig. 7 Conexión de los sensores de línea
Tabla 3. Conexión de los Servos al
puente H
Una vez tenido todos las conexiones
hechas de nuestros componentes
pasamos a agregar la fuente de
Pines Arduino Pines Puente H
11 ENA
12 IN1
13 IN2
2 IN3
4 IN4
3 ENB
Salida Puente H Servomotores
OUT2 Servo Izquierdo
OUT3 Servo Derecho
Pines
Arduino
Salida de las
Fotorresistencias
A0 Salida
Fotorresistencias 1
A1 Salida
Fotorresistencias 2
A2 Salida
Fotorresistencias 3
A3 Salida
Fotorresistencias 4
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
alimentación que fue una batería LIPO de
7.4v a 450mAh (fig. 8) con su interruptor
correspondiente, y todo esto fue montado
al chasis de nuestro robot (fig. 9)
Fig. 8 Conexión completa del circuito
Fig. 9 Circuito montado al Chasis del
robot
Descripción de la lógica utilizada
Se añadió a nuestro código, una función
“calibrar” que se utilizaría para poder
obtener ciertos valores (muestreo) que
nos servirían para referencia a nuestros
sensores de línea y así poder tener un
mejor control en el robot, ya que en
algunas ocasiones, el color varía por la
cantidad de luz que incide en la superficie
en un momento determinado. Todos estos
valores de referencia se guardan en la
EEPROM para hacer uso de ellas cuando
el robot entre en funcionamiento.
Primeramente se colocó en el código
instrucciones para que el robot camine
hacia adelante mientras se encuentra
dentro de la zona de salida.
Tomamos de forma obvia, que el robot al
ser colocado correctamente, ira hacia
adelante sin ninguna desviación.
Después de ello, el robot se guiara por las
líneas del fondo del laberinto al igual que
los cruces.
Se consultó detalladamente el reglamento
de este concurso, y se observó que en
ninguno de sus puntos se prohibía la
programación de los cruces para que el
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
robot se guiara y llegara rápidamente a la
meta, es por ello que como equipo,
decidimos irnos por esta vía, y se le
programa al robot con números de cruces
y sentidos (derecha o izquierda).
Por lo anteriormente mencionado, se le
ingresa al código dos vectores, uno para
llevar el control de cruces y el otro para los
sentidos. Después de haber llegado a un
cruce, el robot se detiene y verifica en el
vector, si el número de cruce en el cual
esta, es igual al dato que esta contenido
dentro de esta fila el robot girara en el
sentido del dato correspondiente a su
vector.
Al llegar al número total de datos en el
vector, se le informa al robot para que este
se encuentre preparado para localizar la
meta y no seguir buscando cruces.
Aplicación en la vida real.
El prototipo que hemos desarrollado como
un robot de laberinto puede ser aplicado
en la vida real, con apenas algunas
modificaciones.
Un uso que podemos darle seria usarlo
como un detector de explosivos mediante
alguna situación de suma importancia o
que ponga en peligro vidas humanas.
Como ejemplo podemos mencionar las
minas, nuestro robot sería capaz de
detectar si hay explosivos dentro
mediante el uso de tecnologías como el
rayo X, que calcula la densidad de los
objetos que se encuentren dentro de la
mina, y leerá la radiación gama para
determinar la composición química
(MsRobotics, 2016) y de esta manera
identificar si existen o no explosivos y
enviará toda la información recabada al
encargado de la operación.
Código
Se declaran todas las variables que se
utilizaran y la librería correspondiente
para el uso de la EEPROM.
#include <EEPROM.h>
// pines del puente H
#define IN1 12
#define IN2 13
#define motorIzq 11
// viendo de frente al robot
#define IN3 2
#define IN4 4
#define motorDer 3
#define minVelocidadIzq 38
// velocidad minima (pwm)
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
#define minVelocidadDer 38
// velocidad minima (pwm)
#define velGiroIzq_Der 40
// velocidad GiroIzquierda (pwm)
#define velGiroIzq_Izq 40
// velocidad GiroIzquierda (pwm)
#define velGiroDer_Der 40
// velocidad GiroDerecha (pwm)
#define velGiroDer_Izq 40
// velocidad GiroDerecha (pwm)
#define velAtras 33
// velocidad atras (pwm)
// pines de los sensores de line
#define sensorLineaDer A0
// viendo de frente al robot
#define sensorLineaIzq A1
#define sensorCruceDer A2
#define sensorCruceIzq A3
#define izquierda 1
#define derecha 0
#define timeInterrup 49535 //
interrupcion cada 1ms
int umb_crucemeta_Der,
umb_crucemeta_Izq;
int lineaDer, lineaIzq,
promedioDer, promedioIzq;
int sp_linea_Der, sp_linea_Izq,
umb_linea_Der, umb_linea_Izq;
int lineaCruceDer, lineaCruceIzq,
promedioCruceDer, promedioCruceIzq;
int sp_cruce_Der, sp_cruce_Izq,
umb_cruce_Der, umb_cruce_Izq;
int errorDer = 0, last_errorDer =
0, derivativoDer = 0, salida_pwm;
int errorIzq = 0, last_errorIzq =
0, derivativoIzq = 0;
float kpDer = 10.6, kdDer = 40.5
, kpIzq = 10.6, kdIzq = 40.5;
byte i, muestras, cruce
,numeroCruces;
char c;
unsigned long duracion, timeout;
// lectura max 30cm (1740us)
unsigned int distanciaIzq;
unsigned int distanciaCentro;
unsigned int distanciaDer;
byte lineaCruces[] = {1,2};
byte lineaSentido[] =
{izquierda,derecha}; // viendo de
frente al robot
Después tenemos la función calibrar, que
nos sirve para realizar un muestreo de los
colores de la superficie y tener menos
probabilidad de error al momento de
analizar nuestro piso. También tenemos
la función sensores de líneas que nos va
tomando los valores actuales de la
superficie del robot. Y la función control
para hacer ciertos movimientos si se
detecta un cruce.
/**********************************
***********************************
**********************/
/*** CALIBRAR ***/
void calibrar(void)
{
while(c != 's')
{
Serial.println("1.-Calibrar
linea (l)");
Serial.println("2.-Calibrar
pista (p)");
Serial.println("3.-Calibrar
inicio (i)");
Serial.println("4.-Calibrar
meta (m)");
Serial.println("5.-Leer
EEPROM (r)");
Serial.println("6.-Salir
(s)");
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
while(!Serial.available());
c = 0; c = Serial.read();
if(c == 'l' || c == 'p' || c
== 'i' || c == 'm' )
{
promedioDer = 0;
promedioIzq = 0; promedioCruceDer =
0; promedioCruceIzq = 0;
for(i = 0; i < muestras;
i++)
{
lineaDer =
(analogRead(sensorLineaDer))/4;
// valores de 0 - 255
lineaIzq =
(analogRead(sensorLineaIzq))/4;
// valores de 0 - 255
lineaCruceDer =
(analogRead(sensorCruceDer))/4;
lineaCruceIzq =
(analogRead(sensorCruceIzq))/4;
promedioDer += lineaDer;
promedioIzq += lineaIzq;
promedioCruceDer +=
lineaCruceDer; promedioCruceIzq +=
lineaCruceIzq;
Serial.print("linea ");
Serial.print(lineaIzq);
Serial.print('t');
Serial.println(lineaDer);
Serial.print("cruce ");
Serial.print(lineaCruceIzq);
Serial.print('t');
Serial.println(lineaCruceDer);
delay(500);
}
Serial.print("promedioLinea
");
Serial.print(promedioIzq/muestras);
Serial.print('t');
Serial.println(promedioDer/muestras
);
Serial.print("promedioCruce
");
Serial.print(promedioCruceIzq/muest
ras); Serial.print('t');
Serial.println(promedioCruceDer/mue
stras);
if(c == 'l')
{
EEPROM.write(0, (byte)
(promedioDer/muestras) );
EEPROM.write(1, (byte)
(promedioIzq/muestras) );
EEPROM.write(4, (byte)
(promedioCruceDer/muestras) );
EEPROM.write(5, (byte)
(promedioCruceIzq/muestras) );
}
if(c == 'p')
{
EEPROM.write(2, (byte)
(promedioDer/muestras) );
EEPROM.write(3, (byte)
(promedioIzq/muestras) );
EEPROM.write(6, (byte)
(promedioCruceDer/muestras) );
EEPROM.write(7, (byte)
(promedioCruceIzq/muestras) );
}
if(c == 'm')
{
EEPROM.write(8, (byte)
(promedioDer/muestras) );
EEPROM.write(9, (byte)
(promedioIzq/muestras) );
EEPROM.write(10, (byte)
(promedioCruceDer/muestras) );
EEPROM.write(11, (byte)
(promedioCruceIzq/muestras) );
}
Serial.println("*** echo
***");
}
if(c == 'r')
{
Serial.println("Izquierda
Derecha");
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
Serial.println("--- Linea -
--");
Serial.print(EEPROM.read(1));
Serial.print('t');
Serial.println(EEPROM.read(0));
Serial.println("--- Linea
Cruce ---");
Serial.print(EEPROM.read(5));
Serial.print('t');
Serial.println(EEPROM.read(4));
Serial.println("--- Pista -
--");
Serial.print(EEPROM.read(3));
Serial.print('t');
Serial.println(EEPROM.read(2));
Serial.println("--- Pista
Cruce---");
Serial.print(EEPROM.read(7));
Serial.print('t');
Serial.println(EEPROM.read(6));
Serial.println("--- Meta --
-");
Serial.print(EEPROM.read(9));
Serial.print('t');
Serial.println(EEPROM.read(8));
Serial.println("--- Meta
Cruce---");
Serial.print(EEPROM.read(11));
Serial.print('t');
Serial.println(EEPROM.read(10));
}
}
}
/**********************************
***********************************
**********************/
/*** SENSORES LINEA ***/
void sensoresLinea(void)
{
lineaDer =
analogRead(sensorLineaDer);
lineaIzq =
analogRead(sensorLineaIzq);
lineaCruceDer =
analogRead(sensorCruceDer);
lineaCruceIzq =
analogRead(sensorCruceIzq);
}
/*******************************
********************************
****************************/
/*** CONTROL ***/
void control(void)
{
sensoresLinea();
if( lineaDer < umb_linea_Der &&
lineaIzq < umb_linea_Izq ) // sin
linea
{
errorDer = 0; last_errorDer =
0; derivativoDer = 0;
errorIzq = 0; last_errorIzq =
0; derivativoIzq = 0;
adelante();
analogWrite(motorDer,minVelocidadDe
r);
analogWrite(motorIzq,minVelocidadIz
q);
c = 'y'; // habilitar
deteccion de cruce, despues de cada
giro y deteccion sin linea linea
do
{
lineaDer =
analogRead(sensorLineaDer);
lineaIzq =
analogRead(sensorLineaIzq);
}while(lineaDer <
umb_linea_Der && lineaIzq <
umb_linea_Izq);
}
else
{
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
if( lineaDer < umb_linea_Der)
controlDer(); // se inclina a la
derecha
if( lineaIzq < umb_linea_Izq)
controlIzq(); // se inclina a la
izquierda
if( lineaDer > umb_linea_Der
&& lineaIzq > umb_linea_Izq ) //
sobre la linea
{
errorDer = 0; last_errorDer
= 0; derivativoDer = 0;
errorIzq = 0; last_errorIzq
= 0; derivativoIzq = 0;
analogWrite(motorDer,minVelocidadDe
r);
analogWrite(motorIzq,minVelocidadIz
q);
}
if( (lineaCruceDer >
umb_cruce_Der) && (lineaCruceIzq >
umb_cruce_Izq) && (c == 'y') ) //
cruce de linea
{
do // permitir k salga un
tanto del cruce
{
lineaCruceDer =
analogRead(sensorCruceDer);
lineaCruceIzq =
analogRead(sensorCruceIzq);
}while( !(lineaCruceDer <
umb_cruce_Der && lineaCruceIzq <
umb_cruce_Izq) );
motoresApagados();cruce =
1; c = 'x';
}
else { cruce = 0;}
}
}
Después de ello tenemos dos funciones
que hacen lo posible por corregir la mala
posición del prototipo.
/*** CONTROL DERECHA ***/
void controlDer()
{
lineaDer =
analogRead(sensorLineaDer);
errorDer = sp_linea_Der -
lineaDer;
derivativoDer = errorDer -
last_errorDer;
salida_pwm = (kpDer * errorDer)
+ ( kdDer * derivativoDer);
last_errorDer = errorDer;
if( salida_pwm >
minVelocidadDer ) salida_pwm =
minVelocidadDer; //limitamos la
salida de pwm
if( salida_pwm < -
minVelocidadDer ) salida_pwm = -
minVelocidadDer;
if (salida_pwm > 0)
{
analogWrite(motorDer,salida_pwm);
analogWrite(motorIzq,minVelocidadDe
r-salida_pwm);
}
if (salida_pwm < 0)
{
analogWrite(motorDer,minVelocidadDe
r+salida_pwm);
analogWrite(motorIzq,-
salida_pwm);
}
}
/**********************************
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
***********************************
**********************/
/*** CONTROL IZQUIERDA ***/
void controlIzq()
{
lineaIzq =
analogRead(sensorLineaIzq);
errorIzq = sp_linea_Izq -
lineaIzq;
derivativoIzq = errorIzq -
last_errorIzq;
salida_pwm = (kpIzq * errorIzq)
+ ( kdIzq * derivativoIzq);
last_errorIzq = errorIzq;
if( salida_pwm >
minVelocidadIzq ) salida_pwm =
minVelocidadIzq;
if( salida_pwm < -
minVelocidadIzq ) salida_pwm = -
minVelocidadIzq;
if (salida_pwm > 0)
{
analogWrite(motorDer,minVelocidadIz
q-salida_pwm);
analogWrite(motorIzq,salida_pwm);
}
if (salida_pwm < 0)
{
analogWrite(motorDer,-
salida_pwm);
analogWrite(motorIzq,minVelocidadIz
q+salida_pwm);
}
}
También se programó una función
denominada giro, la cual nos sirve para
controlar nuestro robot al momento del
cruce determinado para poder hacer
girarlo sobre su propio eje.
/*** GIRO ***/
void giro(byte sentido)
{
if(sentido == izquierda)
{
giroIzquierda();
analogWrite(motorDer,
velGiroIzq_Der); // velocidades
diferentes para
analogWrite(motorIzq,
velGiroIzq_Izq); // compensar el
giro
delay(500);
do // permitir que los
sensores salgan de la linea
{
lineaDer =
analogRead(sensorLineaDer);
}while(lineaDer >
umb_linea_Der);
// cruce de linea
do
{
lineaIzq =
analogRead(sensorLineaIzq);
}while(lineaIzq <
(umb_linea_Izq+10));
do
{
lineaDer =
analogRead(sensorLineaDer);
}while(lineaDer <
(umb_linea_Der+10));
}
if(sentido == derecha)
{
giroDerecha();
analogWrite(motorDer,
velGiroDer_Der); // velocidades
diferentes para
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
analogWrite(motorIzq,
velGiroDer_Izq); // compensar el
giro
delay(500);
do // permitir que los
sensores salgan de la linea
{
lineaIzq =
analogRead(sensorLineaIzq);
}while(lineaIzq >
umb_linea_Izq);
// cruce de linea
do
{
lineaDer =
analogRead(sensorLineaDer);
}while(lineaDer <
(umb_linea_Der+10));
do
{
lineaIzq =
analogRead(sensorLineaIzq);
}while(lineaIzq <
(umb_linea_Izq+10));
/*
do // caso especial del giro
a la derecha
{
lineaCruceDer =
analogRead(sensorCruceDer);
}while(lineaCruceDer <
umb_cruce_Der);
*/
delay(200);
}
motoresApagados();
delay(500);
}
La siguiente función es la que verifica si el
robot esta fuera de posición para mandar
a llamar a las funciones correspondientes
y corregirlo.
/*** CENTRAR SENSORES LINEA***/
void centrarSensoresLinea(void)
{
sensoresLinea();
if( !(lineaDer > umb_linea_Der
&& lineaIzq > umb_linea_Izq) )
{
if( lineaDer < umb_linea_Der)
{
giroIzquierda();
delay(500);
analogWrite(motorDer,
velGiroIzq_Der);
analogWrite(motorIzq,
velGiroIzq_Izq);
do
{
lineaDer =
analogRead(sensorLineaDer);
}while(lineaDer <
umb_linea_Der);
}
else if( lineaIzq <
umb_linea_Izq)
{
giroDerecha();
delay(500);
analogWrite(motorDer,
velGiroIzq_Der);
analogWrite(motorIzq,
velGiroIzq_Izq);
do
{
lineaIzq =
analogRead(sensorLineaIzq);
}while(lineaIzq <
umb_linea_Izq);
}
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
motoresApagados();
delay(500);
}
}
/**********************************
***********************************
**********************/
/*** CENTRAR SENSORES CRUCE***/
void centrarSensoresCruce(void)
{
sensoresLinea();
if( (lineaCruceDer <
umb_cruce_Der) && (lineaCruceIzq <
umb_cruce_Izq) )
{
atras();
do
{
sensoresLinea();
}while( !(lineaCruceDer >
umb_cruce_Der && lineaCruceIzq >
umb_cruce_Izq) );
motoresApagados();
delay(500);
}
}
/**********************************
***********************************
**********************/
/*** GIRO IZQUIERDA ***/
void giroIzquierda()
{
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
}
/**********************************
***********************************
**********************/
/*** GIRO DERECHA ***/
void giroDerecha()
{
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
}
/**********************************
***********************************
**********************/
/*** ADELANTE ***/
void adelante()
{
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
}
/**********************************
***********************************
**********************/
/*** ATRAS ***/
void atras()
{
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
delay(300);
analogWrite(motorDer,
velAtras); analogWrite(motorIzq,
velAtras);
}
/**********************************
***********************************
**********************/ /***
MOTORES APAGADOS ***/
void motoresApagados(void)
{
// Motores apagados
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
analogWrite (motorIzq, 0);
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
analogWrite (motorDer, 0);
}
Hay ciertas funciones en la parte anterior
que se usan para diversos objetivos
específicos ya que se desgloso
demasiado las partes de nuestra lógica
para tener un mejor control de
programación.
Aquí tenemos por fin la parte principal de
nuestro código.
void setup()
{
// PinMode para los
ULtrasonicos
pinMode(trigIzq,OUTPUT);
pinMode(trigCentro,OUTPUT);
pinMode(trigDer,OUTPUT);
pinMode(echoIzq,INPUT);
pinMode(echoCentro,INPUT);
pinMode(echoDer,INPUT);
// PinMode control Puente H
motores
pinMode (IN4, OUTPUT); pinMode
(IN3, OUTPUT);
pinMode (IN2, OUTPUT); pinMode
(IN1, OUTPUT);
muestras = 20;
cruce = 0;
numeroCruces = 0;
c = 0;
duracion = 0;
timeout = 1740; // lectura
max ultrasonicos 30cm (1740us)
distanciaIzq = 0;
distanciaCentro = 0;
distanciaDer = 0;
motoresApagados();
Serial.begin(9600);
}
void loop()
{
//calibrar();
//Serial.println("*** Preparado
***");
// valores de 0 - 1023
sp_linea_Der = EEPROM.read(0) *
4; //
setpoint valor calibrado linea
sp_linea_Izq = EEPROM.read(1) *
4;
umb_linea_Der = ( sp_linea_Der
+ (EEPROM.read(2) * 4) )/2; //
umbral de la linea lado derecho
umb_linea_Izq = ( sp_linea_Izq
+ (EEPROM.read(3) * 4) )/2;
sp_cruce_Der = EEPROM.read(4) *
4; //
setpoint valor calibrado linea
sp_cruce_Izq = EEPROM.read(5) *
4;
umb_cruce_Der = ( sp_cruce_Der
+ (EEPROM.read(6) * 4) )/2; //
umbral cruce linea lado derecho
umb_cruce_Izq = ( sp_cruce_Izq
+ (EEPROM.read(7) * 4) )/2;
umb_crucemeta_Der = (
EEPROM.read(10) + EEPROM.read(6) )
* 2 ; // umbral meta cruce /
pista cruce
umb_crucemeta_Izq = (
EEPROM.read(11) + EEPROM.read(7) )
* 2 ;
for(i = 0; i < 5; i++)
delay(1000);
cruce = 0; muestras = 0;
numeroCruces = 0;
adelante();
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
while(1)
{
if(cruce == 1)
{
motoresApagados(); cruce =
0; numeroCruces++;
delay(300);
centrarSensoresLinea();
delay(300);
if( lineaCruces[muestras]
== numeroCruces)
{
if(
lineaSentido[muestras] ==
izquierda)
{
centrarSensoresCruce();
for(i = 0; i < 2; i++)
// pausas
{
digitalWrite(IN2,!digitalRead(IN2))
; delay(500);}
giro(izquierda);
}
else if(
lineaSentido[muestras] == derecha )
{
centrarSensoresCruce();
for(i = 0; i < 2; i++)
// pausas
{
digitalWrite(IN2,!digitalRead(IN2))
; delay(500);}
giro(derecha);
}
for(i = 0; i < 2; i++)
// pausas
{
digitalWrite(IN2,!digitalRead(IN2))
; delay(500);}
centrarSensoresLinea();
delay(300);
muestras++; numeroCruces
= 0;
}
adelante();
control();
}
else control();
if( muestras ==
sizeof(lineaCruces)) // buscando
la meta
{
sensoresLinea();
// la condicional cambia
segun el color meta / pista
if( lineaCruceDer <
umb_crucemeta_Der && lineaCruceIzq
< umb_crucemeta_Izq )
{
motoresApagados();
for(i = 0; i < 10; i++)
// pausas
{
digitalWrite(IN2,!digitalRead(IN2))
; delay(500);}
}
}
}
}
Resultados obtenidos
En la etapa final del proyecto, en la
creación de un robot autónomo capaz de
descifrar laberintos, se suscitaron
demasiados contratiempos para las
pruebas finales y el ir experimentando que
tanta inteligencia adquiría el robot de
acuerdo a las correcciones que
constantemente se le realizaban después
de cada prueba hecha en laberintos
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
provisionales ya que el final aún no estaba
disponible.
Existieron detalles como las pruebas en
laberintos no idóneos, es decir, se
hicieron pruebas en materiales como
azulejo, piso firme y terracería lo cual no
beneficio la adherencia de nuestras
llantas al piso por lo que por cada tipo de
piso, el robot se comportaba con distintas
velocidades lo cual nos causó
contratiempos.
Otro inconveniente fue lo de la
arquitectura del robot, al ser un poco
grande, necesitaba un poco más de
espacio que las distancias entre paredes
del laberinto, así que se tuvieron que
implementar nuevas llantas y motores
para un giro más rápido.
En algunas ocasiones los problemas eran
más técnicos, por ejemplo cuando se
prendía el robot a veces un motor prendía
y el otro no o viceversa, pero causaba
problemas ya que hacía falta una
coordinación para iniciar al mismo tiempo.
El problema más grande y grave al que
nuestro equipo se enfrentó fue a la
pérdida del robot dentro de la superficie
(en el cruce) cuando tenía cierta
desviación que ponía en riesgo muy alto
la lógica pensada para que el robot
pudiera resolver el laberinto, ya que al
salirse de las líneas, perdida totalmente el
control que se tenía sobre él.
Conclusión
Una de las mejores experiencias que
hemos tenido fue la realización de este
proyecto, ya que demando una exhausta
búsqueda de información acerca de cómo
armar y programar nuestro prototipo,
además de ser la primera vez en
adentrarnos en esta área.
Otro aspecto importante es que aunque
se tenga la mejor arquitectura, no
garantiza un óptimo funcionamiento del
robot, ya que el componente más
importante es el código lo que en realidad
controla a la parte mecánica.
Para finalizar, la placa arduino es un
componente muy básico pero con muchas
utilidades dentro de todos los ámbitos ya
que como vimos anteriormente tiene
aplicaciones prácticas que ayudan a
solucionar o servir como apoyo a una
necesidad que se tenga.
Instituto Tecnológico de Tuxtla Gutiérrez
Ciencia y Tecnología con sentido Humano
Ingeniería en Sistemas Computacionales
Referencias
Arduino. (2016). Obtenido de https://www.arduino.cc/en/main/arduinoBoardUno
Arduino. (2016). Obtenido de Arduino: http://forum.arduino.cc/index.php?topic=157831.0
MsRobotics. (2016). Obtenido de http://msrobotics.net/index.php/laboratorio-ard/87-control-
remoto-infrarrojo-con-arduino

Más contenido relacionado

La actualidad más candente

Instrumentación Industrial
Instrumentación IndustrialInstrumentación Industrial
Instrumentación IndustrialCEMEX
 
Robot controlled car using Wireless Module
 Robot controlled car using Wireless Module Robot controlled car using Wireless Module
Robot controlled car using Wireless Moduleshreyaseksambe
 
Diseño y configuración de una red device net manual del estudiante
Diseño y configuración de una red device net manual del estudianteDiseño y configuración de una red device net manual del estudiante
Diseño y configuración de una red device net manual del estudianteNilo Ruddy
 
Morfologia de los Robot
Morfologia de los RobotMorfologia de los Robot
Morfologia de los RobotCesarAlonso31
 
Actuadores mecanicos
Actuadores mecanicosActuadores mecanicos
Actuadores mecanicosgarzilla
 
Informe 1 robotica industrial
Informe 1 robotica industrialInforme 1 robotica industrial
Informe 1 robotica industrialJose Toro
 
Pasos para la construcción de una máquina de turing
Pasos para la construcción de una máquina de turingPasos para la construcción de una máquina de turing
Pasos para la construcción de una máquina de turingJonathan Bastidas
 
Proyecto mecatronica industrial control de servomotores
Proyecto mecatronica industrial control de servomotoresProyecto mecatronica industrial control de servomotores
Proyecto mecatronica industrial control de servomotoresAdrián Fernández Samalea
 
Lenguajes de programacion de plc
Lenguajes de programacion de plcLenguajes de programacion de plc
Lenguajes de programacion de plcschool
 
Morfologia de un robot
Morfologia de un robotMorfologia de un robot
Morfologia de un robotLeo Nardo
 
Fallas comunes y soluciones de una computadora
Fallas comunes y soluciones de una computadoraFallas comunes y soluciones de una computadora
Fallas comunes y soluciones de una computadora9606241890428122010
 
16 teórico de sistemas automáticos
16 teórico de sistemas automáticos16 teórico de sistemas automáticos
16 teórico de sistemas automáticosLuz Torres Saavedra
 

La actualidad más candente (20)

Instrumentación Industrial
Instrumentación IndustrialInstrumentación Industrial
Instrumentación Industrial
 
El mouse
El mouseEl mouse
El mouse
 
Arquitectura Integrada
Arquitectura IntegradaArquitectura Integrada
Arquitectura Integrada
 
Robot controlled car using Wireless Module
 Robot controlled car using Wireless Module Robot controlled car using Wireless Module
Robot controlled car using Wireless Module
 
Diseño y configuración de una red device net manual del estudiante
Diseño y configuración de una red device net manual del estudianteDiseño y configuración de una red device net manual del estudiante
Diseño y configuración de una red device net manual del estudiante
 
Morfologia de los Robot
Morfologia de los RobotMorfologia de los Robot
Morfologia de los Robot
 
computación paralela
computación paralelacomputación paralela
computación paralela
 
Aplicaciones de los lenguajes y autómatas
Aplicaciones de los lenguajes y autómatas Aplicaciones de los lenguajes y autómatas
Aplicaciones de los lenguajes y autómatas
 
Actuadores mecanicos
Actuadores mecanicosActuadores mecanicos
Actuadores mecanicos
 
Comutação de lustre
Comutação de lustreComutação de lustre
Comutação de lustre
 
Informe 1 robotica industrial
Informe 1 robotica industrialInforme 1 robotica industrial
Informe 1 robotica industrial
 
Pasos para la construcción de una máquina de turing
Pasos para la construcción de una máquina de turingPasos para la construcción de una máquina de turing
Pasos para la construcción de una máquina de turing
 
Proyecto mecatronica industrial control de servomotores
Proyecto mecatronica industrial control de servomotoresProyecto mecatronica industrial control de servomotores
Proyecto mecatronica industrial control de servomotores
 
Lenguajes de programacion de plc
Lenguajes de programacion de plcLenguajes de programacion de plc
Lenguajes de programacion de plc
 
Morfologia de un robot
Morfologia de un robotMorfologia de un robot
Morfologia de un robot
 
Fallas comunes y soluciones de una computadora
Fallas comunes y soluciones de una computadoraFallas comunes y soluciones de una computadora
Fallas comunes y soluciones de una computadora
 
Informe ieee de robot sumo(cronos)
Informe ieee de robot sumo(cronos)Informe ieee de robot sumo(cronos)
Informe ieee de robot sumo(cronos)
 
Robotica 2 (1)
Robotica 2 (1)Robotica 2 (1)
Robotica 2 (1)
 
Programación GRAFCET
Programación GRAFCETProgramación GRAFCET
Programación GRAFCET
 
16 teórico de sistemas automáticos
16 teórico de sistemas automáticos16 teórico de sistemas automáticos
16 teórico de sistemas automáticos
 

Destacado (20)

Recortes de prensa
Recortes de prensaRecortes de prensa
Recortes de prensa
 
Practica clase IMSI
Practica clase IMSIPractica clase IMSI
Practica clase IMSI
 
Poblacion 2007
Poblacion 2007Poblacion 2007
Poblacion 2007
 
Correos2
Correos2Correos2
Correos2
 
Trabajo Desert De Les Palmes
Trabajo Desert De Les PalmesTrabajo Desert De Les Palmes
Trabajo Desert De Les Palmes
 
Sesion 4
Sesion 4Sesion 4
Sesion 4
 
Juanita Reina
Juanita ReinaJuanita Reina
Juanita Reina
 
Sessió 3
Sessió 3Sessió 3
Sessió 3
 
Com tenir tenir cura d'un mateix: la potenciació de la resiliència dia a dia....
Com tenir tenir cura d'un mateix: la potenciació de la resiliència dia a dia....Com tenir tenir cura d'un mateix: la potenciació de la resiliència dia a dia....
Com tenir tenir cura d'un mateix: la potenciació de la resiliència dia a dia....
 
15buenasrazones
15buenasrazones15buenasrazones
15buenasrazones
 
10 Sessions Web (2005 2007)
10 Sessions Web (2005 2007)10 Sessions Web (2005 2007)
10 Sessions Web (2005 2007)
 
Post Europ 3ª Directiva Postal Dic 2006
Post Europ 3ª Directiva Postal Dic 2006Post Europ 3ª Directiva Postal Dic 2006
Post Europ 3ª Directiva Postal Dic 2006
 
Ayudas FormacióN
Ayudas FormacióNAyudas FormacióN
Ayudas FormacióN
 
Desperdicios Humanos
Desperdicios HumanosDesperdicios Humanos
Desperdicios Humanos
 
Herramientas de software educativo
Herramientas de software educativoHerramientas de software educativo
Herramientas de software educativo
 
Carnaval 08
Carnaval 08Carnaval 08
Carnaval 08
 
Transportes
TransportesTransportes
Transportes
 
El vibrador
El vibradorEl vibrador
El vibrador
 
Concepto de información
Concepto de informaciónConcepto de información
Concepto de información
 
LIGHT VER FINAL
LIGHT VER FINALLIGHT VER FINAL
LIGHT VER FINAL
 

Similar a Robot autónomo para recorrer un laberinto

Evaluacion epu
Evaluacion epuEvaluacion epu
Evaluacion epucscshshs
 
Robot móvil de tracción diferencial con plataforma de control
Robot móvil de tracción diferencial con plataforma de controlRobot móvil de tracción diferencial con plataforma de control
Robot móvil de tracción diferencial con plataforma de controlBryan Garcia
 
Corrección de la evaluación
Corrección de la evaluaciónCorrección de la evaluación
Corrección de la evaluaciónSergio Varon
 
Corrección de la evaluacióng
Corrección de la evaluacióngCorrección de la evaluacióng
Corrección de la evaluacióngdarwlu
 
Manipulador de 2 grados de libertad
Manipulador de 2 grados de libertadManipulador de 2 grados de libertad
Manipulador de 2 grados de libertadMiguel Montero
 
informe seguidor de linea
informe seguidor de linea informe seguidor de linea
informe seguidor de linea cristi9908
 
Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9 Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9 Alejito Parrado
 
Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9 Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9 Alejito Parrado
 
Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9fabian9911
 
Proyecto robot tracker/seguidor de linea negra
Proyecto robot tracker/seguidor de linea negraProyecto robot tracker/seguidor de linea negra
Proyecto robot tracker/seguidor de linea negraLino Andres Copa
 
Robot seguidor de línea con software y hardware
Robot seguidor de línea con software y hardwareRobot seguidor de línea con software y hardware
Robot seguidor de línea con software y hardwareNamsohj Ozarazil
 
Automóvil con sensor
Automóvil con sensorAutomóvil con sensor
Automóvil con sensorjuliorovira96
 
Proyecto seguidor de linea
Proyecto seguidor de linea Proyecto seguidor de linea
Proyecto seguidor de linea DL3004
 

Similar a Robot autónomo para recorrer un laberinto (20)

Robot Seguidor de Lineas
Robot Seguidor de LineasRobot Seguidor de Lineas
Robot Seguidor de Lineas
 
Robot seguidor de linea
Robot seguidor de lineaRobot seguidor de linea
Robot seguidor de linea
 
Evaluación.
Evaluación.Evaluación.
Evaluación.
 
Evaluacion epu
Evaluacion epuEvaluacion epu
Evaluacion epu
 
Robot móvil de tracción diferencial con plataforma de control
Robot móvil de tracción diferencial con plataforma de controlRobot móvil de tracción diferencial con plataforma de control
Robot móvil de tracción diferencial con plataforma de control
 
Corrección de la evaluación
Corrección de la evaluaciónCorrección de la evaluación
Corrección de la evaluación
 
Corrección de la evaluacióng
Corrección de la evaluacióngCorrección de la evaluacióng
Corrección de la evaluacióng
 
Robotica
RoboticaRobotica
Robotica
 
Manipulador de 2 grados de libertad
Manipulador de 2 grados de libertadManipulador de 2 grados de libertad
Manipulador de 2 grados de libertad
 
informe seguidor de linea
informe seguidor de linea informe seguidor de linea
informe seguidor de linea
 
Semaforo inteligente implementado en vhdl
Semaforo inteligente implementado en vhdlSemaforo inteligente implementado en vhdl
Semaforo inteligente implementado en vhdl
 
Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9 Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9
 
Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9 Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9
 
Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9Preguntas robotica nxt grado 9
Preguntas robotica nxt grado 9
 
Proyecto robot tracker/seguidor de linea negra
Proyecto robot tracker/seguidor de linea negraProyecto robot tracker/seguidor de linea negra
Proyecto robot tracker/seguidor de linea negra
 
Robot seguidor de línea con software y hardware
Robot seguidor de línea con software y hardwareRobot seguidor de línea con software y hardware
Robot seguidor de línea con software y hardware
 
Automóvil con sensor
Automóvil con sensorAutomóvil con sensor
Automóvil con sensor
 
Proyecto seguidor de linea
Proyecto seguidor de linea Proyecto seguidor de linea
Proyecto seguidor de linea
 
Seguidor de linea con arduino
Seguidor de linea con arduinoSeguidor de linea con arduino
Seguidor de linea con arduino
 
Seguidor de linea
Seguidor de lineaSeguidor de linea
Seguidor de linea
 

Más de Extensión del Instituto Tecnológico de Tuxtla Gutiérrez sede Bochil

Más de Extensión del Instituto Tecnológico de Tuxtla Gutiérrez sede Bochil (20)

1.3 La memoria principal ram
1.3 La memoria principal ram1.3 La memoria principal ram
1.3 La memoria principal ram
 
Sistema de Información Geográfica
Sistema de Información GeográficaSistema de Información Geográfica
Sistema de Información Geográfica
 
2o torneo estatal interuniversitario de robótica 2015
2o torneo estatal interuniversitario de robótica 20152o torneo estatal interuniversitario de robótica 2015
2o torneo estatal interuniversitario de robótica 2015
 
1.2. El procesador y sus registros internos
1.2. El procesador y sus registros internos1.2. El procesador y sus registros internos
1.2. El procesador y sus registros internos
 
TORMENTA TROPICAL “LARRY”
TORMENTA TROPICAL “LARRY”TORMENTA TROPICAL “LARRY”
TORMENTA TROPICAL “LARRY”
 
Triangulation based mapping. Digital terrain models
Triangulation based mapping. Digital terrain modelsTriangulation based mapping. Digital terrain models
Triangulation based mapping. Digital terrain models
 
Triangular Trregular Network
Triangular Trregular NetworkTriangular Trregular Network
Triangular Trregular Network
 
Tim Telcik contour TIN
Tim Telcik contour TINTim Telcik contour TIN
Tim Telcik contour TIN
 
Three dimensional surfaces
Three dimensional surfacesThree dimensional surfaces
Three dimensional surfaces
 
The history of geographic information systems invention and re invention of t...
The history of geographic information systems invention and re invention of t...The history of geographic information systems invention and re invention of t...
The history of geographic information systems invention and re invention of t...
 
Cartographic data structures
Cartographic data structuresCartographic data structures
Cartographic data structures
 
A step towards interactive displays of digital elevation models
A step towards interactive displays of digital elevation modelsA step towards interactive displays of digital elevation models
A step towards interactive displays of digital elevation models
 
Seguridad en redes de computadoras
Seguridad en redes de computadorasSeguridad en redes de computadoras
Seguridad en redes de computadoras
 
Diagramas Entidad Relacion
Diagramas Entidad RelacionDiagramas Entidad Relacion
Diagramas Entidad Relacion
 
Seguridad en redes informaticas
Seguridad en redes informaticasSeguridad en redes informaticas
Seguridad en redes informaticas
 
Modelo Entidad Relacion
Modelo Entidad RelacionModelo Entidad Relacion
Modelo Entidad Relacion
 
Modelo de datos
Modelo de datosModelo de datos
Modelo de datos
 
Informatica forense
Informatica forenseInformatica forense
Informatica forense
 
¿Que es una startup?
¿Que es una startup?¿Que es una startup?
¿Que es una startup?
 
Lineamiento integracion operacion academias
Lineamiento integracion operacion academiasLineamiento integracion operacion academias
Lineamiento integracion operacion academias
 

Último

Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)ssuser563c56
 
CONCEPTOS EN HIDROGEOLOGIA-diapositivas varias.pptx
CONCEPTOS EN HIDROGEOLOGIA-diapositivas varias.pptxCONCEPTOS EN HIDROGEOLOGIA-diapositivas varias.pptx
CONCEPTOS EN HIDROGEOLOGIA-diapositivas varias.pptxBrayanJavierCalle2
 
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaSesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaXimenaFallaLecca1
 
Controladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y VentajasControladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y Ventajasjuanprv
 
clasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesclasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesMIGUELANGEL2658
 
Base de Datos en Microsoft SQL Server 2024
Base de Datos en Microsoft SQL Server 2024Base de Datos en Microsoft SQL Server 2024
Base de Datos en Microsoft SQL Server 2024CESARHERNANPATRICIOP2
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfKEVINYOICIAQUINOSORI
 
ECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfmatepura
 
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdfCristhianZetaNima
 
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICAINTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICAJOSLUISCALLATAENRIQU
 
Mapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMONICADELROCIOMUNZON1
 
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdfLA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdfbcondort
 
clases de porcinos generales de porcinos
clases de porcinos generales de porcinosclases de porcinos generales de porcinos
clases de porcinos generales de porcinosDayanaCarolinaAP
 
Ingeniería clínica 1 Ingeniería biomedica
Ingeniería clínica 1 Ingeniería biomedicaIngeniería clínica 1 Ingeniería biomedica
Ingeniería clínica 1 Ingeniería biomedicaANACENIMENDEZ1
 
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILClase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILProblemSolved
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALKATHIAMILAGRITOSSANC
 
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptx
NTP- Determinación de Cloruros  en suelos y agregados (1) (1).pptxNTP- Determinación de Cloruros  en suelos y agregados (1) (1).pptx
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptxBRAYANJOSEPTSANJINEZ
 
tema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdftema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdfvictoralejandroayala2
 
Manual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfManual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfedsonzav8
 
Propuesta para la creación de un Centro de Innovación para la Refundación ...
Propuesta para la creación de un Centro de Innovación para la Refundación ...Propuesta para la creación de un Centro de Innovación para la Refundación ...
Propuesta para la creación de un Centro de Innovación para la Refundación ...Dr. Edwin Hernandez
 

Último (20)

Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
 
CONCEPTOS EN HIDROGEOLOGIA-diapositivas varias.pptx
CONCEPTOS EN HIDROGEOLOGIA-diapositivas varias.pptxCONCEPTOS EN HIDROGEOLOGIA-diapositivas varias.pptx
CONCEPTOS EN HIDROGEOLOGIA-diapositivas varias.pptx
 
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaSesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
 
Controladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y VentajasControladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y Ventajas
 
clasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesclasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias locales
 
Base de Datos en Microsoft SQL Server 2024
Base de Datos en Microsoft SQL Server 2024Base de Datos en Microsoft SQL Server 2024
Base de Datos en Microsoft SQL Server 2024
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdf
 
ECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdf
 
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
 
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICAINTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
 
Mapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptx
 
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdfLA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
 
clases de porcinos generales de porcinos
clases de porcinos generales de porcinosclases de porcinos generales de porcinos
clases de porcinos generales de porcinos
 
Ingeniería clínica 1 Ingeniería biomedica
Ingeniería clínica 1 Ingeniería biomedicaIngeniería clínica 1 Ingeniería biomedica
Ingeniería clínica 1 Ingeniería biomedica
 
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILClase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
 
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptx
NTP- Determinación de Cloruros  en suelos y agregados (1) (1).pptxNTP- Determinación de Cloruros  en suelos y agregados (1) (1).pptx
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptx
 
tema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdftema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdf
 
Manual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfManual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdf
 
Propuesta para la creación de un Centro de Innovación para la Refundación ...
Propuesta para la creación de un Centro de Innovación para la Refundación ...Propuesta para la creación de un Centro de Innovación para la Refundación ...
Propuesta para la creación de un Centro de Innovación para la Refundación ...
 

Robot autónomo para recorrer un laberinto

  • 1. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales ROBOT AUTÓNOMO PARA RECORRER UN LABERINTO Autores: Moguel Jiménez, Luis Fernando luisfermj@hotmail.com; Pérez Nango, Manuel de Jesús manuelpereznango@hotmail.com; Reyes Palacios, Shanel Daniela isc_shanel_reyes@hotmail.com; Molina Sosa, Benjamín molinasb.94@gmail.com. Instituto Tecnológico de Tuxtla Gutiérrez, Carretera Panamericana Km. 1080, C.P. 29050, Apartado Postal: 599, Tuxtla Gutiérrez, Chiapas. Resumen--- El objetivo de este trabajo es presentar los detalles principales del diseño del hardware y software de un robot autónomo que es capaz de desplazarse a través de un laberinto prediseñado, siguiendo trayectorias rectilíneas con desviaciones a 90 o 180º ante la detección de un borde o pared del laberinto, cuando se interpone en su camino recto. El robot integra sensores de línea, con los cuales será capaz de seguir con autonomía un laberinto de líneas negras sobre una superficie blanca, en este se mostrarán caminos correctos e incorrectos, por eso mismo el robot debe corregirlo. El diseño y la construcción de un prototipo de este robot se realizaron como parte del proyecto de grado de la materia “Lenguaje de Interfaz” correspondiente al sexto semestre de la carrera de Ingeniería en Sistemas Computacionales del Instituto Tecnológico de Tuxtla Gutiérrez. ----------------------------------------------------------------------------------------------------------------------------------- Palabras clave: Robot autónomo, laberinto, sensores ultrasónicos, sensor de linea, placa Arduino. Abstract--- The objective of this document is to present the main details about the design of hardware and software of an autonomous robot that is able to go over a predesign maze, following rectilineals ways with 90 or 180° deflections, detecting edges and maze walls. The prototype includes several line sensors in order to be able to follow with autonomy the black lines in a maze with a white surface. Obviously there gonna be corrects an incorrects ways that the robot should analyze.
  • 2. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales The design and build of this prototype was a part of a final project in “Lenguaje de interfaz”, that is a school subject in the sixth semester of Engineering on Computerized Systems in the Tuxtla Gutierrez Institute of Technology. ------------------------------------------------------------------------------------------------------------------------------------ Keywords: Autonomous Robot, maze, ultrasonic sensors, line sensors, arduino board I.- INTRODUCCIÓN El proyecto para la creación de un robot autónomo capaz de recorrer los pasillos de un laberinto surgió como el desafío de presentar un trabajo de desarrollo novedoso y ambicioso para lo que es un proyecto de una materia de semestre. Se diseñó un prototipo basado en “Arduino”, plataforma electrónica abierta (código y hardware abiertos) que permite la creación de prototipos basados en software y hardware flexibles. (Arduino, 2016) En particular, para la construcción del sistema de control del robot se utilizó una placa Arduino Uno, sensores de linea y servomotores para lograr el desplazamiento del robot dentro del laberinto. El prototipo emplea una serie de sensores de luminosidad con los cuales es capaz de seguir una línea. El sensor de luz emite permanentemente una luz y recibe su reflejo, con el cual midiendo la luminosidad del reflejo, es capaz de interpretar la luminosidad de la superficie que está recibiendo, aquí el concepto físico a resaltar es que los colores claros reflejan más luz que los colores oscuros. Siguiendo esta idea principal, nuestra estrategia será que el robot sea capaz de detectar contrastes, así cuando este detecte zonas blancas no realizara ninguna acción de corrección y así mismo al toparse con la línea negra, sea capaz de corregir su dirección y seguir con su camino. II.- DESARROLLO Y DISEÑO Al momento del diseño del prototipo se tuvieron en cuenta varias características que afectarían a la implementación exitosa del mismo. Entre las cuestiones que se analizaron en la etapa de diseño se pueden mencionar: el chasis, los
  • 3. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales movimientos a realizar por el robot, los tipos de sensores, y la alimentación necesaria para el funcionamiento de los componentes electrónicos. A. Chasis Para este caso se diseñó un chasis pre- fabricado de forma alargada en forma de “T”, acompañado con otras características de implementación, que nos permitiría realizar mejores movimientos. B. Movimientos La trayectoria que realiza el robot es en línea recta con giros de 90º o 180° cuando detecta un obstáculo. La tracción (fig. 1) utilizada es diferencial (se usan dos servomotores independientes), lo que hace que los giros sean más sencillos y además permite realizar los movimientos sin más espacio que el que está ocupando (gira sobre su propio eje). Fig. 1 Tracción diferencial Otro aspecto del diseño que se definió fue la ubicación de las ruedas, dado que esto también impacta, en el prototipo se ubicaron en la parte de adelante para una mayor tracción. Para las ruedas se utilizaron un par de ruedas de plástico para servomotor y como eje se le añadió uno de los brazos que viene con el servo. C. Sensores Debido a que este sensor capta grados de luminosidad, no es capaz de distinguir colores, sólo captando la existencia del blanco (claridad), negro (oscuridad) y los tonos de grises que corresponden a los distintos porcentajes de luz existentes en el medio. Para los sensores de línea (fig. 2), por cada se sensor (en este caso se usaron 4), se usaron un LED ultra brillante verde + una fotorresistencia + 1 resistencias de 330 ohms + 1 resistencia de 10k. Fig. 2 Sensores de línea
  • 4. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales El diodo emisor de luz (LED) envía un constante haz de luz (fig. 3) hacia el suelo. Esta luz se refleja de nuevo a la LDR. Dependiendo del color, la fotorresistencia recibe cantidades variables de luz reflejada. Fig. 3 Reflejo de la luz D. Motores Para el movimiento de las ruedas se usaron servomotores. El tamaño reducido del servo MG90 (fig. 4) lo hace ideal para la construcción del prototipo (Arduino, 2016) Fig. 4 Servomotor MG90 Los servomotores hacen uso de la modulación por ancho de pulsos (PWM) para controlar la dirección o posición de los motores de corriente continua. La mayoría trabaja en la frecuencia de los cincuenta hercios, así las señales PWM tendrán un periodo de veinte milisegundos. E. Alimentación Para lograr un prototipo autónomo se utilizó una fuente de alimentación, en este caso, se usó una batería LI-PO de 7.4v a 4500 mAh (fig. 5), la cual alimentaba a la placa Arduino, los servos y los sensores de línea. Fig. 5 Batería LI-PO La batería se ubicó en la parte de enfrente del robot para que las llantas se acercaran lo más posible al suelo, logrando así gran estabilidad y mayor tracción. III.- CONEXIONES Se hicieron las conexiones correspondientes de todos los elementos anteriormente mencionados para el buen funcionamiento del robot. Primeramente hicimos las conexiones del puente H
  • 5. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales (L298N) y de los servomotores con el Arduino uno (fig. 6). Fig. 6 Conexión de los motores y puente H Tabla 1. Pines usados en el Arduino para la conexión del puente H Tabla 2. Conexión de los Servos al puente H Después de hacer las conexiones del puente H, procedimos a hacer las conexiones de los sensores de línea al Arduino, en este caso, fueron hechas con LED´s ultrabrillantes y fotorresistencias (fig. 7). Fig. 7 Conexión de los sensores de línea Tabla 3. Conexión de los Servos al puente H Una vez tenido todos las conexiones hechas de nuestros componentes pasamos a agregar la fuente de Pines Arduino Pines Puente H 11 ENA 12 IN1 13 IN2 2 IN3 4 IN4 3 ENB Salida Puente H Servomotores OUT2 Servo Izquierdo OUT3 Servo Derecho Pines Arduino Salida de las Fotorresistencias A0 Salida Fotorresistencias 1 A1 Salida Fotorresistencias 2 A2 Salida Fotorresistencias 3 A3 Salida Fotorresistencias 4
  • 6. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales alimentación que fue una batería LIPO de 7.4v a 450mAh (fig. 8) con su interruptor correspondiente, y todo esto fue montado al chasis de nuestro robot (fig. 9) Fig. 8 Conexión completa del circuito Fig. 9 Circuito montado al Chasis del robot Descripción de la lógica utilizada Se añadió a nuestro código, una función “calibrar” que se utilizaría para poder obtener ciertos valores (muestreo) que nos servirían para referencia a nuestros sensores de línea y así poder tener un mejor control en el robot, ya que en algunas ocasiones, el color varía por la cantidad de luz que incide en la superficie en un momento determinado. Todos estos valores de referencia se guardan en la EEPROM para hacer uso de ellas cuando el robot entre en funcionamiento. Primeramente se colocó en el código instrucciones para que el robot camine hacia adelante mientras se encuentra dentro de la zona de salida. Tomamos de forma obvia, que el robot al ser colocado correctamente, ira hacia adelante sin ninguna desviación. Después de ello, el robot se guiara por las líneas del fondo del laberinto al igual que los cruces. Se consultó detalladamente el reglamento de este concurso, y se observó que en ninguno de sus puntos se prohibía la programación de los cruces para que el
  • 7. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales robot se guiara y llegara rápidamente a la meta, es por ello que como equipo, decidimos irnos por esta vía, y se le programa al robot con números de cruces y sentidos (derecha o izquierda). Por lo anteriormente mencionado, se le ingresa al código dos vectores, uno para llevar el control de cruces y el otro para los sentidos. Después de haber llegado a un cruce, el robot se detiene y verifica en el vector, si el número de cruce en el cual esta, es igual al dato que esta contenido dentro de esta fila el robot girara en el sentido del dato correspondiente a su vector. Al llegar al número total de datos en el vector, se le informa al robot para que este se encuentre preparado para localizar la meta y no seguir buscando cruces. Aplicación en la vida real. El prototipo que hemos desarrollado como un robot de laberinto puede ser aplicado en la vida real, con apenas algunas modificaciones. Un uso que podemos darle seria usarlo como un detector de explosivos mediante alguna situación de suma importancia o que ponga en peligro vidas humanas. Como ejemplo podemos mencionar las minas, nuestro robot sería capaz de detectar si hay explosivos dentro mediante el uso de tecnologías como el rayo X, que calcula la densidad de los objetos que se encuentren dentro de la mina, y leerá la radiación gama para determinar la composición química (MsRobotics, 2016) y de esta manera identificar si existen o no explosivos y enviará toda la información recabada al encargado de la operación. Código Se declaran todas las variables que se utilizaran y la librería correspondiente para el uso de la EEPROM. #include <EEPROM.h> // pines del puente H #define IN1 12 #define IN2 13 #define motorIzq 11 // viendo de frente al robot #define IN3 2 #define IN4 4 #define motorDer 3 #define minVelocidadIzq 38 // velocidad minima (pwm)
  • 8. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales #define minVelocidadDer 38 // velocidad minima (pwm) #define velGiroIzq_Der 40 // velocidad GiroIzquierda (pwm) #define velGiroIzq_Izq 40 // velocidad GiroIzquierda (pwm) #define velGiroDer_Der 40 // velocidad GiroDerecha (pwm) #define velGiroDer_Izq 40 // velocidad GiroDerecha (pwm) #define velAtras 33 // velocidad atras (pwm) // pines de los sensores de line #define sensorLineaDer A0 // viendo de frente al robot #define sensorLineaIzq A1 #define sensorCruceDer A2 #define sensorCruceIzq A3 #define izquierda 1 #define derecha 0 #define timeInterrup 49535 // interrupcion cada 1ms int umb_crucemeta_Der, umb_crucemeta_Izq; int lineaDer, lineaIzq, promedioDer, promedioIzq; int sp_linea_Der, sp_linea_Izq, umb_linea_Der, umb_linea_Izq; int lineaCruceDer, lineaCruceIzq, promedioCruceDer, promedioCruceIzq; int sp_cruce_Der, sp_cruce_Izq, umb_cruce_Der, umb_cruce_Izq; int errorDer = 0, last_errorDer = 0, derivativoDer = 0, salida_pwm; int errorIzq = 0, last_errorIzq = 0, derivativoIzq = 0; float kpDer = 10.6, kdDer = 40.5 , kpIzq = 10.6, kdIzq = 40.5; byte i, muestras, cruce ,numeroCruces; char c; unsigned long duracion, timeout; // lectura max 30cm (1740us) unsigned int distanciaIzq; unsigned int distanciaCentro; unsigned int distanciaDer; byte lineaCruces[] = {1,2}; byte lineaSentido[] = {izquierda,derecha}; // viendo de frente al robot Después tenemos la función calibrar, que nos sirve para realizar un muestreo de los colores de la superficie y tener menos probabilidad de error al momento de analizar nuestro piso. También tenemos la función sensores de líneas que nos va tomando los valores actuales de la superficie del robot. Y la función control para hacer ciertos movimientos si se detecta un cruce. /********************************** *********************************** **********************/ /*** CALIBRAR ***/ void calibrar(void) { while(c != 's') { Serial.println("1.-Calibrar linea (l)"); Serial.println("2.-Calibrar pista (p)"); Serial.println("3.-Calibrar inicio (i)"); Serial.println("4.-Calibrar meta (m)"); Serial.println("5.-Leer EEPROM (r)"); Serial.println("6.-Salir (s)");
  • 9. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales while(!Serial.available()); c = 0; c = Serial.read(); if(c == 'l' || c == 'p' || c == 'i' || c == 'm' ) { promedioDer = 0; promedioIzq = 0; promedioCruceDer = 0; promedioCruceIzq = 0; for(i = 0; i < muestras; i++) { lineaDer = (analogRead(sensorLineaDer))/4; // valores de 0 - 255 lineaIzq = (analogRead(sensorLineaIzq))/4; // valores de 0 - 255 lineaCruceDer = (analogRead(sensorCruceDer))/4; lineaCruceIzq = (analogRead(sensorCruceIzq))/4; promedioDer += lineaDer; promedioIzq += lineaIzq; promedioCruceDer += lineaCruceDer; promedioCruceIzq += lineaCruceIzq; Serial.print("linea "); Serial.print(lineaIzq); Serial.print('t'); Serial.println(lineaDer); Serial.print("cruce "); Serial.print(lineaCruceIzq); Serial.print('t'); Serial.println(lineaCruceDer); delay(500); } Serial.print("promedioLinea "); Serial.print(promedioIzq/muestras); Serial.print('t'); Serial.println(promedioDer/muestras ); Serial.print("promedioCruce "); Serial.print(promedioCruceIzq/muest ras); Serial.print('t'); Serial.println(promedioCruceDer/mue stras); if(c == 'l') { EEPROM.write(0, (byte) (promedioDer/muestras) ); EEPROM.write(1, (byte) (promedioIzq/muestras) ); EEPROM.write(4, (byte) (promedioCruceDer/muestras) ); EEPROM.write(5, (byte) (promedioCruceIzq/muestras) ); } if(c == 'p') { EEPROM.write(2, (byte) (promedioDer/muestras) ); EEPROM.write(3, (byte) (promedioIzq/muestras) ); EEPROM.write(6, (byte) (promedioCruceDer/muestras) ); EEPROM.write(7, (byte) (promedioCruceIzq/muestras) ); } if(c == 'm') { EEPROM.write(8, (byte) (promedioDer/muestras) ); EEPROM.write(9, (byte) (promedioIzq/muestras) ); EEPROM.write(10, (byte) (promedioCruceDer/muestras) ); EEPROM.write(11, (byte) (promedioCruceIzq/muestras) ); } Serial.println("*** echo ***"); } if(c == 'r') { Serial.println("Izquierda Derecha");
  • 10. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales Serial.println("--- Linea - --"); Serial.print(EEPROM.read(1)); Serial.print('t'); Serial.println(EEPROM.read(0)); Serial.println("--- Linea Cruce ---"); Serial.print(EEPROM.read(5)); Serial.print('t'); Serial.println(EEPROM.read(4)); Serial.println("--- Pista - --"); Serial.print(EEPROM.read(3)); Serial.print('t'); Serial.println(EEPROM.read(2)); Serial.println("--- Pista Cruce---"); Serial.print(EEPROM.read(7)); Serial.print('t'); Serial.println(EEPROM.read(6)); Serial.println("--- Meta -- -"); Serial.print(EEPROM.read(9)); Serial.print('t'); Serial.println(EEPROM.read(8)); Serial.println("--- Meta Cruce---"); Serial.print(EEPROM.read(11)); Serial.print('t'); Serial.println(EEPROM.read(10)); } } } /********************************** *********************************** **********************/ /*** SENSORES LINEA ***/ void sensoresLinea(void) { lineaDer = analogRead(sensorLineaDer); lineaIzq = analogRead(sensorLineaIzq); lineaCruceDer = analogRead(sensorCruceDer); lineaCruceIzq = analogRead(sensorCruceIzq); } /******************************* ******************************** ****************************/ /*** CONTROL ***/ void control(void) { sensoresLinea(); if( lineaDer < umb_linea_Der && lineaIzq < umb_linea_Izq ) // sin linea { errorDer = 0; last_errorDer = 0; derivativoDer = 0; errorIzq = 0; last_errorIzq = 0; derivativoIzq = 0; adelante(); analogWrite(motorDer,minVelocidadDe r); analogWrite(motorIzq,minVelocidadIz q); c = 'y'; // habilitar deteccion de cruce, despues de cada giro y deteccion sin linea linea do { lineaDer = analogRead(sensorLineaDer); lineaIzq = analogRead(sensorLineaIzq); }while(lineaDer < umb_linea_Der && lineaIzq < umb_linea_Izq); } else {
  • 11. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales if( lineaDer < umb_linea_Der) controlDer(); // se inclina a la derecha if( lineaIzq < umb_linea_Izq) controlIzq(); // se inclina a la izquierda if( lineaDer > umb_linea_Der && lineaIzq > umb_linea_Izq ) // sobre la linea { errorDer = 0; last_errorDer = 0; derivativoDer = 0; errorIzq = 0; last_errorIzq = 0; derivativoIzq = 0; analogWrite(motorDer,minVelocidadDe r); analogWrite(motorIzq,minVelocidadIz q); } if( (lineaCruceDer > umb_cruce_Der) && (lineaCruceIzq > umb_cruce_Izq) && (c == 'y') ) // cruce de linea { do // permitir k salga un tanto del cruce { lineaCruceDer = analogRead(sensorCruceDer); lineaCruceIzq = analogRead(sensorCruceIzq); }while( !(lineaCruceDer < umb_cruce_Der && lineaCruceIzq < umb_cruce_Izq) ); motoresApagados();cruce = 1; c = 'x'; } else { cruce = 0;} } } Después de ello tenemos dos funciones que hacen lo posible por corregir la mala posición del prototipo. /*** CONTROL DERECHA ***/ void controlDer() { lineaDer = analogRead(sensorLineaDer); errorDer = sp_linea_Der - lineaDer; derivativoDer = errorDer - last_errorDer; salida_pwm = (kpDer * errorDer) + ( kdDer * derivativoDer); last_errorDer = errorDer; if( salida_pwm > minVelocidadDer ) salida_pwm = minVelocidadDer; //limitamos la salida de pwm if( salida_pwm < - minVelocidadDer ) salida_pwm = - minVelocidadDer; if (salida_pwm > 0) { analogWrite(motorDer,salida_pwm); analogWrite(motorIzq,minVelocidadDe r-salida_pwm); } if (salida_pwm < 0) { analogWrite(motorDer,minVelocidadDe r+salida_pwm); analogWrite(motorIzq,- salida_pwm); } } /**********************************
  • 12. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales *********************************** **********************/ /*** CONTROL IZQUIERDA ***/ void controlIzq() { lineaIzq = analogRead(sensorLineaIzq); errorIzq = sp_linea_Izq - lineaIzq; derivativoIzq = errorIzq - last_errorIzq; salida_pwm = (kpIzq * errorIzq) + ( kdIzq * derivativoIzq); last_errorIzq = errorIzq; if( salida_pwm > minVelocidadIzq ) salida_pwm = minVelocidadIzq; if( salida_pwm < - minVelocidadIzq ) salida_pwm = - minVelocidadIzq; if (salida_pwm > 0) { analogWrite(motorDer,minVelocidadIz q-salida_pwm); analogWrite(motorIzq,salida_pwm); } if (salida_pwm < 0) { analogWrite(motorDer,- salida_pwm); analogWrite(motorIzq,minVelocidadIz q+salida_pwm); } } También se programó una función denominada giro, la cual nos sirve para controlar nuestro robot al momento del cruce determinado para poder hacer girarlo sobre su propio eje. /*** GIRO ***/ void giro(byte sentido) { if(sentido == izquierda) { giroIzquierda(); analogWrite(motorDer, velGiroIzq_Der); // velocidades diferentes para analogWrite(motorIzq, velGiroIzq_Izq); // compensar el giro delay(500); do // permitir que los sensores salgan de la linea { lineaDer = analogRead(sensorLineaDer); }while(lineaDer > umb_linea_Der); // cruce de linea do { lineaIzq = analogRead(sensorLineaIzq); }while(lineaIzq < (umb_linea_Izq+10)); do { lineaDer = analogRead(sensorLineaDer); }while(lineaDer < (umb_linea_Der+10)); } if(sentido == derecha) { giroDerecha(); analogWrite(motorDer, velGiroDer_Der); // velocidades diferentes para
  • 13. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales analogWrite(motorIzq, velGiroDer_Izq); // compensar el giro delay(500); do // permitir que los sensores salgan de la linea { lineaIzq = analogRead(sensorLineaIzq); }while(lineaIzq > umb_linea_Izq); // cruce de linea do { lineaDer = analogRead(sensorLineaDer); }while(lineaDer < (umb_linea_Der+10)); do { lineaIzq = analogRead(sensorLineaIzq); }while(lineaIzq < (umb_linea_Izq+10)); /* do // caso especial del giro a la derecha { lineaCruceDer = analogRead(sensorCruceDer); }while(lineaCruceDer < umb_cruce_Der); */ delay(200); } motoresApagados(); delay(500); } La siguiente función es la que verifica si el robot esta fuera de posición para mandar a llamar a las funciones correspondientes y corregirlo. /*** CENTRAR SENSORES LINEA***/ void centrarSensoresLinea(void) { sensoresLinea(); if( !(lineaDer > umb_linea_Der && lineaIzq > umb_linea_Izq) ) { if( lineaDer < umb_linea_Der) { giroIzquierda(); delay(500); analogWrite(motorDer, velGiroIzq_Der); analogWrite(motorIzq, velGiroIzq_Izq); do { lineaDer = analogRead(sensorLineaDer); }while(lineaDer < umb_linea_Der); } else if( lineaIzq < umb_linea_Izq) { giroDerecha(); delay(500); analogWrite(motorDer, velGiroIzq_Der); analogWrite(motorIzq, velGiroIzq_Izq); do { lineaIzq = analogRead(sensorLineaIzq); }while(lineaIzq < umb_linea_Izq); }
  • 14. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales motoresApagados(); delay(500); } } /********************************** *********************************** **********************/ /*** CENTRAR SENSORES CRUCE***/ void centrarSensoresCruce(void) { sensoresLinea(); if( (lineaCruceDer < umb_cruce_Der) && (lineaCruceIzq < umb_cruce_Izq) ) { atras(); do { sensoresLinea(); }while( !(lineaCruceDer > umb_cruce_Der && lineaCruceIzq > umb_cruce_Izq) ); motoresApagados(); delay(500); } } /********************************** *********************************** **********************/ /*** GIRO IZQUIERDA ***/ void giroIzquierda() { digitalWrite (IN1, LOW); digitalWrite (IN2, HIGH); digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); } /********************************** *********************************** **********************/ /*** GIRO DERECHA ***/ void giroDerecha() { digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); } /********************************** *********************************** **********************/ /*** ADELANTE ***/ void adelante() { digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); } /********************************** *********************************** **********************/ /*** ATRAS ***/ void atras() { digitalWrite (IN1, LOW); digitalWrite (IN2, HIGH); digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); delay(300); analogWrite(motorDer, velAtras); analogWrite(motorIzq, velAtras); } /********************************** *********************************** **********************/ /*** MOTORES APAGADOS ***/ void motoresApagados(void) { // Motores apagados digitalWrite (IN1, LOW); digitalWrite (IN2, LOW); analogWrite (motorIzq, 0);
  • 15. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); analogWrite (motorDer, 0); } Hay ciertas funciones en la parte anterior que se usan para diversos objetivos específicos ya que se desgloso demasiado las partes de nuestra lógica para tener un mejor control de programación. Aquí tenemos por fin la parte principal de nuestro código. void setup() { // PinMode para los ULtrasonicos pinMode(trigIzq,OUTPUT); pinMode(trigCentro,OUTPUT); pinMode(trigDer,OUTPUT); pinMode(echoIzq,INPUT); pinMode(echoCentro,INPUT); pinMode(echoDer,INPUT); // PinMode control Puente H motores pinMode (IN4, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN2, OUTPUT); pinMode (IN1, OUTPUT); muestras = 20; cruce = 0; numeroCruces = 0; c = 0; duracion = 0; timeout = 1740; // lectura max ultrasonicos 30cm (1740us) distanciaIzq = 0; distanciaCentro = 0; distanciaDer = 0; motoresApagados(); Serial.begin(9600); } void loop() { //calibrar(); //Serial.println("*** Preparado ***"); // valores de 0 - 1023 sp_linea_Der = EEPROM.read(0) * 4; // setpoint valor calibrado linea sp_linea_Izq = EEPROM.read(1) * 4; umb_linea_Der = ( sp_linea_Der + (EEPROM.read(2) * 4) )/2; // umbral de la linea lado derecho umb_linea_Izq = ( sp_linea_Izq + (EEPROM.read(3) * 4) )/2; sp_cruce_Der = EEPROM.read(4) * 4; // setpoint valor calibrado linea sp_cruce_Izq = EEPROM.read(5) * 4; umb_cruce_Der = ( sp_cruce_Der + (EEPROM.read(6) * 4) )/2; // umbral cruce linea lado derecho umb_cruce_Izq = ( sp_cruce_Izq + (EEPROM.read(7) * 4) )/2; umb_crucemeta_Der = ( EEPROM.read(10) + EEPROM.read(6) ) * 2 ; // umbral meta cruce / pista cruce umb_crucemeta_Izq = ( EEPROM.read(11) + EEPROM.read(7) ) * 2 ; for(i = 0; i < 5; i++) delay(1000); cruce = 0; muestras = 0; numeroCruces = 0; adelante();
  • 16. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales while(1) { if(cruce == 1) { motoresApagados(); cruce = 0; numeroCruces++; delay(300); centrarSensoresLinea(); delay(300); if( lineaCruces[muestras] == numeroCruces) { if( lineaSentido[muestras] == izquierda) { centrarSensoresCruce(); for(i = 0; i < 2; i++) // pausas { digitalWrite(IN2,!digitalRead(IN2)) ; delay(500);} giro(izquierda); } else if( lineaSentido[muestras] == derecha ) { centrarSensoresCruce(); for(i = 0; i < 2; i++) // pausas { digitalWrite(IN2,!digitalRead(IN2)) ; delay(500);} giro(derecha); } for(i = 0; i < 2; i++) // pausas { digitalWrite(IN2,!digitalRead(IN2)) ; delay(500);} centrarSensoresLinea(); delay(300); muestras++; numeroCruces = 0; } adelante(); control(); } else control(); if( muestras == sizeof(lineaCruces)) // buscando la meta { sensoresLinea(); // la condicional cambia segun el color meta / pista if( lineaCruceDer < umb_crucemeta_Der && lineaCruceIzq < umb_crucemeta_Izq ) { motoresApagados(); for(i = 0; i < 10; i++) // pausas { digitalWrite(IN2,!digitalRead(IN2)) ; delay(500);} } } } } Resultados obtenidos En la etapa final del proyecto, en la creación de un robot autónomo capaz de descifrar laberintos, se suscitaron demasiados contratiempos para las pruebas finales y el ir experimentando que tanta inteligencia adquiría el robot de acuerdo a las correcciones que constantemente se le realizaban después de cada prueba hecha en laberintos
  • 17. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales provisionales ya que el final aún no estaba disponible. Existieron detalles como las pruebas en laberintos no idóneos, es decir, se hicieron pruebas en materiales como azulejo, piso firme y terracería lo cual no beneficio la adherencia de nuestras llantas al piso por lo que por cada tipo de piso, el robot se comportaba con distintas velocidades lo cual nos causó contratiempos. Otro inconveniente fue lo de la arquitectura del robot, al ser un poco grande, necesitaba un poco más de espacio que las distancias entre paredes del laberinto, así que se tuvieron que implementar nuevas llantas y motores para un giro más rápido. En algunas ocasiones los problemas eran más técnicos, por ejemplo cuando se prendía el robot a veces un motor prendía y el otro no o viceversa, pero causaba problemas ya que hacía falta una coordinación para iniciar al mismo tiempo. El problema más grande y grave al que nuestro equipo se enfrentó fue a la pérdida del robot dentro de la superficie (en el cruce) cuando tenía cierta desviación que ponía en riesgo muy alto la lógica pensada para que el robot pudiera resolver el laberinto, ya que al salirse de las líneas, perdida totalmente el control que se tenía sobre él. Conclusión Una de las mejores experiencias que hemos tenido fue la realización de este proyecto, ya que demando una exhausta búsqueda de información acerca de cómo armar y programar nuestro prototipo, además de ser la primera vez en adentrarnos en esta área. Otro aspecto importante es que aunque se tenga la mejor arquitectura, no garantiza un óptimo funcionamiento del robot, ya que el componente más importante es el código lo que en realidad controla a la parte mecánica. Para finalizar, la placa arduino es un componente muy básico pero con muchas utilidades dentro de todos los ámbitos ya que como vimos anteriormente tiene aplicaciones prácticas que ayudan a solucionar o servir como apoyo a una necesidad que se tenga.
  • 18. Instituto Tecnológico de Tuxtla Gutiérrez Ciencia y Tecnología con sentido Humano Ingeniería en Sistemas Computacionales Referencias Arduino. (2016). Obtenido de https://www.arduino.cc/en/main/arduinoBoardUno Arduino. (2016). Obtenido de Arduino: http://forum.arduino.cc/index.php?topic=157831.0 MsRobotics. (2016). Obtenido de http://msrobotics.net/index.php/laboratorio-ard/87-control- remoto-infrarrojo-con-arduino