Construir un robot seguidor de línea con #Arduino #SoftwareLibre #HardwareLibre

MOVIL CONTROLADO POR COMPUTADOR CON HARDWARE Y SOFTWARE LIBRE

 JULY PAOLA CHITIVA ORTIZ
JHOSMAN ALFONSO LIZARAZO MORA

 DOCENTE NORBERTO NOVOA

ARQUITECTURA DE COMPUTADORES

 

UNIVERSIDAD DISTRITAL FRANCISCO JOSÉ DE CALDAS

FACULTAD TECNOLOGICA

TECNOLOGIA EN SISTEMATIZACIÓN DE DATOS

 

 

 

Vehículo Controlado Mediante un Computador se podría controlar un “vehículo” (Robot  pequeño de ruedas) que avance, retroceda o gire mediante instrucciones que se impartan  desde el equipo, o se podría hacer que este vehículo en vez de seguir instrucciones desde el  PC, siga una ruta determinada mediante infrarrojos. Este será constituido por ruedas,  motores, fuente de energía, y tarjeta de control (micro controlador Arduino ATmega168) programado en lenguaje  Arduino. 

Fase de diseño electrónico

El robot actuará como un móvil seguidor de línea negra haciendo uso de sensores infrarrojos, los cuales detectan la línea y envían una señal al resto del circuito del robot. Allí, de acuerdo a la programación realizada, se tomará una decisión respecto a las acciones que el robot debe realizar para mantenerse en el camino y llegar a la meta. Este diseño electrónico cuenta con dos sistemas: percepción y potencia. 

Percepción

Es el sistema encargado de obtener la información del entorno para enviarla al sistema de comunicación en el cual se determinarán las acciones para los robots. En este caso se usarán leds infrarrojos, un emisor y un receptor, los cuales están encargados de detectar la línea negra que define el camino a seguir. En este caso se utilizarán dos sensores CNY70.

 

El led infrarrojo (IR) es un componente electrónico que emite luz infrarroja, caracterizada por encontrarse en una frecuencia menor (10-5 m) que la luz visible por el ojo humano (0.5 x 10-6m), por lo que sólo puede ser detectada por otro componente electrónico llamado fotodiodo. De esta manera el led infrarrojo actúa como el emisor y el fotodiodo como el receptor. La configuración usada es de tipo auto-reflexiva, es decir que tanto el emisor como el receptor se encuentran ubicados uno al lado del otro y la luz emitida que viaja en línea recta se refleja en un objeto o superficie hacia el fotodiodo (figura 5). Este tipo de luz se refleja sobre colores blancos o claros, si se hace sobre un color oscuro o negro la luz es mayormente absorbida, disminuyendo la intensidad que recibirá el fotodiodo. De acuerdo a este y al diseño del entorno, debe invertirse la señal para que pueda actuar sobre la línea negra.

 

Figura del Sensor Emisor – Receptor

En el sensor infrarojo lo que hace es enviar y recibir una señal muy pequeña que determina la transmisión de luz infraroja que dependiendo de las condiciones del espacio puede darnos varios valores, estos van conectados a  unas resistencias R2 y R4 controlan el flujo de corriente, la cual desbloqueará su base y permitirá la amplificación de la señal. Las resistencias R1 y R3 actúan como protección de los led disminuyendo el flujo de corriente hacia éstos.

Es importante tener presente que el sensor infrarrojo también es sensible a la luz ambiente, razón por la cual tanto el led infrarrojo como el fotodiodo deben recubrirse con cinta aislante negra (u otro material oscuro), formando una especie de conducto que limita la incidencia de esta luz y facilita que el haz de luz infrarroja se emita en una sola dirección. O reprogramar la sensibilidad de los sensores CNY70 dentro de la programación.

 

 

Potencia

 

La señal de salida obtenida de los sensores infrarrojos se convierte en la señal de entrada a la fase de programación, en la que interviene un módulo electrónico (Arduino) para el control del robot. Para ello se utilizará un componente (SN754410NE) o el componente (L293D) quienes realizarán la función de indicar a los motores que actividad realizar dependiendo del momento

 

 

 

 

Se crea puente H para control de los motores

 

Como hemos dicho el puente H se usa para invertir el giro de un motor, pero también puede usarse para frenarlo (de manera brusca), al hacer un corto entre las bornas del motor, o incluso puede usarse para permitir que el motor frene bajo su propia inercia, cuando desconectamos el motor de la fuente que lo alimenta. En el siguiente cuadro se resumen las diferentes acciones.

 

S1

S2

S3

S4

Resultado

1

0

0

1

El motor gira en avance

0

1

1

0

El motor gira en retroceso

0

0

0

0

El motor se detiene bajo su inercia

1

0

1

0

El motor frena (fast-stop)

 

Figura Etapa de Potencia 

La señal de salida de los sensores infrarrojos es de tipo análoga porque su variación depende de la distancia entre los componentes, la cantidad de luz percibida y la línea negra, de la incidencia de la luz ambiente y de las pérdidas en el flujo de corriente en todo el circuito. Esta señal entra a la fase de programación y allí es transformada en una señal digital, la cual a su vez es la entrada al driver de los motores (Puente H). 

Fase de diseño mecánico

 

El robot cuenta con tracción diferencial, ya que utiliza dos ruedas que son controladas de manera individual y soportadas en un eje central común (rueda loca) para el balance. Las dos ruedas tienen un recubrimiento de caucho que permite mayor adhesión a la superficie plana del entorno; la rueda loca además facilita el movimiento del robot al contar con un giro libre de 360 grados. Las dos ruedas principales son controladas por un motor de corriente continua que cuenta con un sistema de engranajes que ayuda a aumentar la potencia en el movimiento.

 

Figura Ubicación Ruedas del Robot

 

En la figura 7 se observa la ubicación de las ruedas en el robot; la rueda loca se encuentra en la parte posterior de éste. Las formas de avance con las que cuenta robot son hacia adelante, girar a la izquierda y girar a la derecha y hacia atrás si así se requiere. En la figura 8 se indica la posición en el robot de los sensores para el avance del seguimiento de línea:

 

Figura de Ubicación de los Sensores del Robot

Finalmente, en la figura 9 se presentan dos vistas de la estructura física de los robots.

 

Vista física del diseño del Robot

 

Diseño de programación

La última fase que se tiene en cuenta para la construcción de los robots y su funcionamiento bajo el paradigma de los Sistemas Multi-Agentes es la de programación, la cual se divide en las secciones de control y de comunicación.

Control

Como ya se ha descrito en la fase de diseño mecánico la tracción de los robots es diferencial, pero se hace necesario controlar su movimiento (detenerse, avanzar, girar) y además garantizar el correcto funcionamiento de los sensores para seguir un camino. Para solucionar esto se propone hacerlo a través de un entorno de programación, teniendo en cuenta la población principal a la cual va dirigida la actividad, por lo que es importante que sea de fácil acceso y uso. 

De esta manera, el control de los robots se realiza a través el IDE de programación de Arduino www.arduino.cc.

Estas placas son capaces de recibir información del ambiente o entorno en el que se encuentren, procesarla, manipularla y controlar posteriormente una salida en la que pueden encontrarse motores, luces, sonido, entre otras. Una ventaja que tiene este tipo de hardware de código abierto y como aporte a la educación, es que además de la opción de compra también pueden obtenerse las características de hardware y así ser ensamblado libremente. El tipo de placa que se usa para este proyecto es la Duemilanove (Figura 10), la cual cuenta principalmente con seis entradas análogas, 14 entradas/salidas digitales, un microcontrolador ATMega168, un voltaje de operación de 5 voltios y una conexión por puerto USB (Arduino, 2012) que permitirá la alimentación y programación de esta placa.

Para que sea posible la programación de la placa en el entorno Arduino, primero debe descargarse el software Arduino y el firmware que hará posible el reconocimiento de dicha placa por el entorno[1]. En la página principal de Arduino se encuentran las especificaciones de instalación de acuerdo al tipo y versión del sistema operativo con el que se cuente. En este proyecto se utilizó la versión de Arduino para Ubuntu, el cual se puede encontrar en el centro de Software para Ubuntu:  https://apps.ubuntu.com/cat/applications/arduino/


[1]Se puede descargar directamente de la página principal de Arduino:   http://arduino.cc/en/Guide/HomePage

 

Programación:

1) Instalar Arduino (sudo apt-get install arduino)

2) Conectar Arduino por USB

3) Abrir Arduino

4) Seleccionar tarjeta (Herramientas/Tarjeta/Arduino Diecimila or Duemileanve w/ Atmega168

5) Verificar permisos USB (~$ ls -l /dev/tty*)

6) Visualizar cual fue el puerto asignado ~$ dmesg

7) Si no tiene permisos asignar permisos al puerto USB que se asignó a la placa (crwxrwxrwx 1 root dialout 188,  0 may 24 10:33 ttyUSB0)

~$chmod 777 ttyUSB0 

Este es un ejemplo del Hola Mundo para arduino

Código para nuestro robot seguidor de línea con Arduino:

 

#define M1A 19 //Motor 1A
#define M1B 18 //Motor 1B
#define M2A 17 //Motor 2A

#define M2B 16 //Motor 2B
#define PIN_PWM 11 //Modulacion por ancho de pulso – Emular salida analogica con salida digital
#define VEL 100 //Velocidad
#define S1 0 //IZQ
#define S2 1 //DER
#define _UMBRAL_ 200 //Umbral de los sensores
unsigned long timeserial;
void setup (){
Serial.begin(9600);
timeserial = millis();
pinMode(M1A, OUTPUT);
pinMode(M1B, OUTPUT);
pinMode(M2A, OUTPUT);
pinMode(M2B, OUTPUT);
STOP(10000);
analogWrite(PIN_PWM, VEL);
}
void loop()

{

byte SDER = (analogRead(S1)> _UMBRAL_ )?0:1;
byte SIZQ = (analogRead(S2)> _UMBRAL_ )?0:1;

if(SDER && SIZQ)
STOP(0);

else if (!SDER && SIZQ)

DER(0);

else if (SDER && !SIZQ)

IZQ(0);

else

ADE(0);
if(millis() – timeserial > 500){
timeserial = millis();
Serial.print(“Sensor1: “);
//Serial.print(SDER);
Serial.print(analogRead(S1));
Serial.print(” Sensor2: “);
//Serial.println(SIZQ);
Serial.println(analogRead(S2));
}

}
void ATR(uint16_t time){
digitalWrite(M1A, HIGH);

digitalWrite(M1B, LOW);
digitalWrite(M2A, HIGH);
digitalWrite(M2B, LOW);
delay(time);
}
void ADE(uint16_t time){
digitalWrite(M1A, LOW);
digitalWrite(M1B, HIGH);
digitalWrite(M2A, LOW);
digitalWrite(M2B, HIGH);

delay(time);

}
void DER(uint16_t time){
//Llanta Izquierda

digitalWrite(M1A, HIGH);
digitalWrite(M1B, LOW);

//llanta Derecha

digitalWrite(M2A, LOW);
digitalWrite(M2B, HIGH);
delay(time);
}
void IZQ(uint16_t time){
//Llanta Izquierda

digitalWrite(M1A, LOW);
digitalWrite(M1B, HIGH);
//Llanta Derecha

digitalWrite(M2A, HIGH);
digitalWrite(M2B, LOW);

delay(time);

}
void STOP(uint16_t time){
digitalWrite(M1A, LOW);
digitalWrite(M1B, LOW);
digitalWrite(M2A, LOW);
digitalWrite(M2B, LOW);
delay(time);

}

 

A continuación se presenta los listados de componentes utilizados para la construcción de los robots especificados en el diseño electrónico, mecánico y de programación. Cada listado corresponde a los componentes utilizados para 1 robot.

 

        Componentes para el diseño 

 

Cantidad

Componente

2

Led infrarrojo CNY70

2

Resistencias 220

2

Resistencias 47K

1

Driver para motor L293 B ó SN754410NE

2

Secciones de acrílico de 12×12 cms de 10 mm. de ancho para las partes superior e inferior.

Tornillos y Tuercas

2

Ruedas de 8 cm de diámetro

1

Rueda loca

1

Twin Motor GrearBox

1

Placa Arduino ATMega168

1

Protoboard

Cables para conexiones

5

Condensadores

Agradecimientos:

 

·                    Laura Romero

·                    Leonardo Urrego

·                    Documentación arduino.cc

·                    Google y Wikipedia

·                    Texas Instruments

 

Fotografías: haz click aqui

 

 

Video: 

http://www.youtube.com/watch?v=k3OWezAWlbo 

 

 

 

 

 

  • Alex Alonso Serrano

    y el hardwarde¿???????????

    • Hola, no entiendo tu pregunta.

      • Castro Quispe Reyna Maria

        hola disculpa, en el programa sale error y no especifica cual me podría ayudar

        • Santiago Zeiler Ribes

          si en el programa sale error, será que está MAL PROGRAMADO
          ¿Alguien puede hacerlo bien?
          Gracias

          • Carlos Caycho Chumpitaz

            Bueno encontré
            el error y lo corregí, aquí les comparto el código:
            https://drive.google.com/file/d/0B7uSDpKO9ihxa2hObVRYMFpCdFk/view?usp=sharing
            [El problema está en la línea 71, 75 y 81. En la línea 71 está mal escrito el guion
            debería ser así if(millis() – timeserial > 500){ En la línea 75 está
            mal escrito las comillas debería ser así Serial.print(“Sensor1:
            “); Y en la línea 81 también está mal escrito las comillas debería
            ser así Serial.print(” Sensor2: “); En la imagen adjunta se muestra el error

          • Carlos Caycho Chumpitaz

            Bueno encontré el error y lo corregí, aquí les
            comparto el código:
            https://drive.google.com/file/d/0B7uSDpKO9ihxa2hObVRYMFpCdFk/view?usp=sharing [El problema está en la línea 71, 75 y 81. En la línea 71 está mal escrito el guion
            debería ser así if(millis() – timeserial > 500){ En la línea 75 está
            mal escrito las comillas debería ser así Serial.print(“Sensor1:
            “); Y en la línea 81 también está mal escrito las comillas debería
            ser así Serial.print(” Sensor2: “); En la imagen adjunta se muestra el error]

  • fany lopez

    Hola, a mi me gustaría realizar un robot igual pero que identifique sonido es para un proyecto escolar. Tienes algún tutorial que me pueda servir.

  • Bryan Fernandez

    realizare este proyecto en mi colegio y tengo una duda es necesario programarlo en linux ? como salen en las imagenes ?

    • Hola, no, debe programarse en Arduino (que es multiplataforma) Exitos!

  • Bryan Fernandez

    holap tengo varias dudas .
    hay que seguir el plano al pie de la letra
    porque en en el plano aparecen 2 resistencias de 330 y trasistores o diodos led ya que me guie por la lista de materiales y no aparecian esas cosas , es necesario . tienes algun correo para seguir comunicando mis dudas . saludos

  • Alex

    Oola..!
    Oye, cuando compilo el código marca muchos errores…
    Ayuda D:

    • Debes leer algo sobre arduino y encontrar donde está el código, cuentanos donde está el problema.

  • luis

    cuando copio el programa sale con errores al verificar , necesita ayuda porfavor !!!!!

    • Debes leer algo sobre arduino y encontrar donde está el código.

  • Honorio Apaza Alanoca

    en placa arduino UNO el código cambia ?
    el siguiente error tengo:

    • Eso depende de como hayas definido los pines, revisa bien y pone lógica.

  • luis

    una consulta, el robot solo funcionara cuando esta conectado a la pc , ?? yo lo quiero hacer para una competencia o como se podria para q este pueda funcionar solo o con una bateria

  • Kevin Enrique Garcia Padilla

    hola cunado verifico el código me aparecen muchos errores

  • Carlos Caycho Chumpitaz

    Bueno encontré el error y lo corregí, aquí les
    comparto el código:
    https://drive.google.com/file/d/0B7uSDpKO9ihxa2hObVRYMFpCdFk/view?usp=sharing
    [El problema está en la línea 71, 75 y 81. En la línea 71 está mal escrito el guion
    debería ser así if(millis() – timeserial > 500){ En la línea 75 está
    mal escrito las comillas debería ser así Serial.print(“Sensor1:
    “); Y en la línea 81 también está mal escrito las comillas debería
    ser así Serial.print(” Sensor2: “); La imagen adjunta muestra el error y la solución]

    • En verdad quería que se estresaran un poco para poder resolverlo, en realidad aquí está todo lo del proyecto, un poquito de investigación y aprendizaje yudaría a resolverlo. Pero en vista de que dieron con la clave, ya lo he editado en el código principal.

  • Javier Abitia

    disculpa quisiera saber si el diagrama de conexión de los sensores esta bien realizado, ya que según yo la salida hacia el micro controlador tendría que venir de la salida del transistor y no del diodo(led). gracias

  • Andrés

    Hola!! Me pareció muy interesante tu proyecto y me gustaría hacerlo para el colegio pero planeo poner en vez de la rueda loca dos ruedas extras para que quede en la parte trasera dos ruedas que den la potencia(y no giren) y dos ruedas que le den la dirección. Mi pregunta es que tendría que cambiar dentro del la programación de Arduino para que funcione??
    Muchas gracias!!

    • Andres, el secreto de esto es Jugar y “Hackear” entre mas complicado sea para tí aprenderás mas! animo! y nos cuentas

      • Andrés

        Muchas gracias Jhosh!!! Voy a poner mucho empeño en esto y me encantaria si me pudieras recomendar alguna pagina que me enseñe un poco mas sobre estos aspectos. Muchas gracias!!

  • David Hernandez

    se puede hacer con el arduino uno?

  • Pol Sánchez

    Alguien me podria confirmar si R4(1) es una pila? Y de que voltaje es?

A %d blogueros les gusta esto: