RTP_GUIA_DE_USUARIO_ROBOT_A3.pdf

33
Robot A3 Seguidor de Línea Guía de usuario Introducción A3 es un robot autónomo de morfología móvil, diseñado para competiciones de seguimiento de línea. Se trata de un robot de tipo diferencial, su tracción basa en dos motores de corriente directa, alimentado por una batería de 9 Voltios. A3 utiliza un microcontrolador de la marca Atmel modelo Atmega328, con firmware de Arduino, lo cual facilita su programación.

Transcript of RTP_GUIA_DE_USUARIO_ROBOT_A3.pdf

  • Robot A3 Seguidor de Lnea

    Gua de usuario

    Introduccin

    A3 es un robot autnomo de morfologa mvil, diseado para competiciones de seguimiento de lnea. Se trata de un robot de tipo diferencial, su traccin basa en dos motores de corriente directa, alimentado por una batera de 9 Voltios.

    A3 utiliza un microcontrolador de la marca Atmel modelo Atmega328, con firmware de Arduino, lo cual facilita su programacin.

  • Advertencias de seguridad y precauciones de uso

    El robot A3 no es un juguete. Puede ser usado por nios y jvenes bajo la supervisin y ayuda de un adulto. El uso o abuso del producto es responsabilidad del usuario final. Grupo Educare no se hace responsable por daos o lesiones que ste pueda causar durante su uso. Este producto no est diseado para jugar, no debe usarse fuera de las condiciones de trabajo. A continuacin se indican las precauciones:

    Antes de comenzar por favor lee cuidadosamente el manual. Utiliza bateras alcalinas o recargables. En el caso de las alcalinas asegrate que sean nuevas, y

    si compras recargables verifica que tengan suficiente carga, de lo contrario al programar lopuedes inutilizar para siempre.

    Condiciones de trabajo: superficie lisa, de preferencia melamina, interiores con luz controlada.

    No colocar la tarjeta de circuito impreso (PCB) sobre superficies metlicas. El robot A3 esta ensamblado y soldado con piezas que contienen plomo y estao, por lo cual es

    necesario lavarse las manos despus de manipularlo. Los componentes del robot estn expuestos, por lo que es importante no tocarlo con las

    manos mientras est en funcionamiento. Si tus manos estn mojadas se puede causar uncorto circuito y daar uno o varios componentes.

    Primeros pasos de A3

    Qu necesitas? Batera de 9V. Utiliza de preferencia bateras alcalinas o recargables. Si trabajar durante

    tiempos prolongados con el robot, te recomendamos usar bateras recargables de Niquel-Metal Hidruro, NiMH. No olvides comprar el cargador correspondiente.

    Cable A B, USB a Micro USB. A3 no requiere un programador externo, todo elhardware electrnico ya se incluye en el robot, pero para la comunicacin entre la computadora y el robot se requiere dicho cable.

    Computadora. Necesitas una computadora para programar el robot. Para ello se utiliza lainterfaz de programacin de Arduino, plataforma libre, que funciona en cualquiera de los siguientes sistemas operativos: Windows Mac Linux

    Material para pruebas. Es necesario que tengas a mano papel, cartulinas, cartoncillo ycinta aislante negra o blanca, para improvisar pistas y probar el robot.

  • Conoce ms del robot A3

    Figura 1. Vista frontal de robot seguidor de lnea A3

    A3 es un robot de morfologa mvil de tipo diferencial, es decir se desplaza por medio de dos ruedas con dos motores, uno para cada una. El cerebro de este robot es un Arduino Nano, y est encargado de procesar la informacin que le proveen los sensores para realizar correcciones a travs de los motores, bajo el esquema bsico de control.

    Hardware de A3En la figura 1 se muestra el hardware del robot. Observa que se cuenta con varios componentes y dispositivos electrnicos. Reconoces alguno?, a continuacin se explican brevemente.

    Sensores reflectivos de contraste, son los encargados de percibir la informacin del ambiente,en este caso el contraste, la diferencia entre lo blanco y lo negro, lo brillante y lo opaco. Este dispositivo se compone de dos partes: emisor y receptor. Tanto el primero como el segundo trabajan en el rango infrarrojo de la luz. sta no es perceptible por el ojo humano, pero con ayuda de una cmara digital se observa.

  • LEDs. Diodos emisores de luz por sus siglas en ingls, son dispositivos que emiten una luz alcircular una corriente por sus terminales. En A3 se usan como indicadores y son programablespor el usuario por medio del Arduino.

    Driver para motor. Basado en un transistor de potencia NPN, son los que proveen de potenciaal motor, siendo la interfaz entre el microcontrolador y el motor.

    Botones. Son interruptores de encendido al contacto. El robot cuenta con 2, el primero parareiniciar el microcontrolador (arduino), y el segundo como botn de usuario para propsitogeneral.

    Motorreductores. Son motores de corriente directa (CD, como el de las bateras), con una cajade engranes adaptada. Los usados en A3 tienen una reduccin de 48:1, esto es, por cada 48vueltas que gire el motor, el eje del reductor girar 1 vuelta. De este modo se incrementa eltorque, fuerza, y se reduce la velocidad.

    Batera. Es la que provee de energa elctrica a todo el robot, arduino, sensores, LEDs,motores, pulsadores. Es tipo rectangular de 9V.

    Figura 2. Vista trasera de A3

  • Arduino NanoEs una pequea y completa placa basada en el mirocontrolador Atmega328 que generalmente se usa para hacer prototipos. Tiene ms o menos la misma funcionalidad que el Arduino UNO, pero con una presentacin ms compacta. No posee conector para alimentacin externa, y funciona con un cable USB Mini-B en ez del cable estndar.

    Figura 3. Arduino NanoEspecificaciones

    Microcontrolador: Atmega328. Tensin de operacin (nivel lgico): 5 Voltios. Tensin de entrada (recomendada): 7-12 Voltios. Tensin de entrada (lmites): 6-20 Voltios. Pines E/S digitales: 14 (de los cuales 6 proveen de salida PWM). Entradas Analgicas: 8 Corriente mxima por cada PIN de Entrada/Salida: 40mA Memoria Flash: 32KB. SRAM: 2KB EEPROM: 1KB. Dimensiones: 18.5 mm x 23.2 mm.

  • AlimentacinEl Arduino Nano puede ser alimentado usando el cable USB Mini-B , con una fuente externa no regulada de 6-20V (pin 30), o con una fuente externa regulada de 5V (pin 27). La fuente de alimentacin es seleccionada automticamente a aquella con mayor tensin.El chip FTDI FT232RL que posee el Nano solo es alimentado si la placa esta siendo alimentada usando el cable USB. como resultado, cuando se utiliza una fuente externa (no USB), la salida de 3.3V (la cual es proporcionada por el chip FTDI) no est disponible y los pines 1 y 0 parpadearn si los pines digitales 0 o 1 estn a nivel alto.

    MemoriaEl ATmega168 posee 16KB de memoria flash para almacenar el codigo (de los cuales 2KB son usados por el bootloader); el ATmega 328 posee 32KB, (tambin con 2 KB usados por el bootloader). El Atmega168 posee 1KB de SRAM y 512 bytes de EEPROM (la cual puede ser leida y escrita con la librera EEPROM); el ATmega328 posee 2 KB de SRAM y 1KB de EEPROM.

    Entrada y SalidaCada uno de los 14 pines digitales del Nano puede ser usado como entrada o salida, usando las funciones pinMode(), digitalWrite(), y digitalRead(). Operan a 5 voltios. Cada pin puede proveer o recibir un mximo de 40mA y poseen una resistencia de pull-up (desconectada por defecto) de 20 a 50 kOhms. Adems algunos pines poseen funciones especializadas:

    Serial: 0 (RX) y 1 (TX). (RX) usado para recibir y (TX)usado para transmitir datos TTL va serie.Estos pines estn conectados a los pines correspondientes del chip USB-a-TTL de FTDI.

    Interrupciones Externas: pines 2 y 3. Estos pines pueden ser configurados para activar unainterrupcin por paso a nivel bajo, por flanco de bajada o flanco de subida, o por un cambio devalor. Mira la funcin attachInterrupt() para ms detalles.

    PWM: pines 3, 5, 6, 9, 10, y 11. Proveen de una salida PWM de 8-bits cuando se usa la funcinanalogWrite().

    SPI: pines 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Estos pines soportan la comunicacin SPI, lacual, a pesar de poseer el hardware, no est actualmente soportada en el lenguaje Arduino.

    LED: Pin 13. Existe un LED conectado al pin digital 13. Cuando el pin se encuentra en nivel alto,el LED est encendido, cuando el pin est a nivel bajo, el LED estar apagado.

    El Nano posee 8 entradas analgicas, cada unas de ellas provee de 10 bits de resolucin (1024 valores diferentes). Por defecto miden entre 5 voltios y masa, sin embargo es posible cambiar el rango superior usando la funcin analogReference(). Tambin, algunos de estos pines poseen funciones especiales:

    I2C: Pines 4 (SDA) y 5 (SCL). Soporta comunicacin I2C (TWI) usando la librera Wire(documentacin en la web Wiring).

    Hay algunos otros pines en la placa: AREF. Tensin de referencia por las entradas analgicas. Se configura con la funcin

    analogReference(). Reset. Pon esta linea a nivel bajo para resetear el microcontrolador. Normalmente se usa para

    aadir un botn de reset que mantiene a nivel alto el pin reset mientras no es pulsado.

  • Diagrama Pictrico

    Figura 4. Diagrama pictrico de circuito de A3

  • Programando en ArduinoPara programa el robot seguidor de lnea es necesario contar con el entorno de programacin de Arduino. Si an no lo tiene lo puede descargar en: www.arduino.cc en la seccin de descargas. Es recomendable que la versin de arduino que descarque sea igual o posterior a las 1.0.

    Figura 5. Captura de pantalla de entorno de programacin Arduino versin 1.0.1

    Componentes de Arduino IDE

    Figura 6. Icono Verificar Verificar. inspecciona el cdigo generado, marca errores y posibles soluciones.

    Figura 7. cono: Cargar Cargar: Cuando se presiona este botn se compila y ensambla el cdigo contenido en la

    ventana y se descarga a la tarjeta electrnica de Arduino. Este proceso puede tardar algunos segundos o tal vez un para de minutos.

  • Figura 8. cono: Nuevo. Nuevo: crea un nuevo sketch en blanco.

    Figura 9. cono: Abrir. Abrir: abre un sketch, cdigo, ya existente.

    Figura 10. cono: Guardar. Guardar: salva las modificaciones realizadas en el cdigo.

    Figura 11. cono: Monitor Serial. Monitor Serial: abre la aplicacin de monitor serial, que puede servir para diferentes

    propsitos.

    Referencias del lenguajeLos programas hechos con Arduino se dividen en tres partes principales:

    Estructura, valores (variables y constantes), funciones.

    El lenguaje de programacin Arduino se basa en C/C++.

    EstructurasLas dos estructuras principales son las siguientes:

    setup(), es la estructura donde se configura las entradas, salidas y los mdulos. Es llamadotambin como inicializacin. Lo contenido en esta estructura se ejecuta slamente una vez al inicio del programa.

    loop(), es la estructura donde se escribe el cdigo, y se repetir infintas veces.

    ValoresConstantes

    HIGH, alto, LOW, bajo, INPUT, entrada, OUTPUT, salida, True, verdadero, false, falso,

  • Variables: boolean, booleando, char, carcter, byte, 8 bits int, entero, unsigned int, entero sin signo, long, entero de 32 bits, unsigned long, entero 32 bits sin signo, float, punto flotante.

    Funciones pinMode(), configura si el pin digital ser salida o entrada, digitalWrite(), si el pin ha sido configurado como salida digital, su voltaje de salida ser 0 o 5V. digitalRead(), lectura del valor digital del pin especificado, analogRead(), lectura del valor analgico del pin especificado, analogWrite(), configura la modulacin por anchura de pulso de un pin (PWM), delay(), pausa en milisegundos. Serial, librera incluida para el uso y configuracin del mdulo serial.

    Revisa la referencia del lenguaje de arduino para aprender ms acerca de las estructuras, variables y funciones de Arduino.

  • El primer programa en Arduino para A3Un sencillo programa de demostracin est disponible en los ejemplos de Arduino, Archivo/Ejemplos/01.Basics/Blink.

    Figura 12. El primer programa en ArduinoEste sencillo programa prende y apaga un LED, colocado en la patilla, pin 13./* Blink Turns on an LED on for one second, then off for one second, repeatedly. */// Pin 13 has an LED connected on most Arduino boards.int led = 13;// the setup routine runs once when you press reset:void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); }

  • // the loop routine runs over and over again forever:void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second}

    Abierto el programa de ejemplo es necesario seleccionar la tarjeta correspondiente, en el caso del robot seguidor de lnea, se trata de un Arduino Nano Atmega328, para ello dirjase al men Herramientas/Tarjeta/Arduino Nano w/Atmega328.

    Figura 13. Seleccin de tarjeta Arduino Nano w/ATmega328Ahora se verificar que el cdigo escrito sea correcto, presione el cono verificar:

  • Lo que har esta funcin ser traducir todo lo codificado a un idioma que entienda el micro-controlador. Observe los avisos y errores de salida mostrados. Si el programa se compila correctamente, el mensaje de salida deber ser como se muestra en la figura:

    Figura14. Mensajes de salidaUna vez compilado y verificado el programa, y en vista que no existen errores o advertencias, se procede a cargar el programa a la tarjeta de Arduino. Para ello antes es importante seleccionar el puerto de comunicacin serial COM correcto. Para ello se puede hacer lo siguiente:

    Abra el administrador de dispositivos, En la pestaa Puertos (COM y LPT), verifique el puerto en el cual est ubicado el Arduino.

    Generalmente tiene el nombre de USB Serail Port.

    Figura 15. Verificacin del puerto COM del Arduino

  • Una vez identificado, se selecciona en el IDE, Herramientas/Puerto serial/COMx

    Figura 16. Seleccin del Puerto SerialCargue el programa a la tarjeta de Arduino presionando el cono de cargar. Esta accin puede tardar algunos segundos.

    Figura 17. Carga de programa a tarjeta de Arduino

    Si la carga fue exitosa se desplegar el siguiente mensaje:

    Figura 18. Carga Exitosa

  • Ejemplos y proyectosAhora que sabe como compilar y cargar un prorama a la tarjeta de Arduino es tiempo de aprender a disear y codificar programas ms complicados. Comenzar con los ms sencillos.Ejemplo 1: Luces estilo el auto increible

    Figura 16. Tarjeta de A3La tarjeta del robot seguidor de lnea incluye 5 indicadores LED's para el propsito General. stos se encuentran en los pines digitales 11, 9, 8, 7, 6, marcados como B0, B1, B2, B3, B4 en ese preciso orden.La secuencia que se quiere lograr es la siguiente:

    Movimiento 1 Movimiento 2

    Movimiento 3 Movimiento 4

  • Movimiento 5 Movimiento 6

    Movimiento 7 Movimiento 8Figura 17. Luces del auto increble.

    El cdigo de este programa se encuentra disponible en la pgina Web: http://www.grupoeducare.com/dct/index.php/rec/robotopia

    int runled = 13; //Alias para pin 13int led0 = 11;int led1 = 6;int led2 = 7;int led3 = 8;int led4 = 9;

    void setup(){ //Configuracin de entradas y salidas pinMode(runled, OUTPUT); //Salida digital en runled = pin 13 pinMode(led0, OUTPUT); //Salida digital en led0 = pin 11 pinMode(led1, OUTPUT); //Salida digital en led1 = pin 6

  • pinMode(led2, OUTPUT); //Salida digital en led2 = pin 7 pinMode(led3, OUTPUT); //Salida digital en led3 = pin 8 pinMode(led4, OUTPUT); //Salida digital en led4 = pin 9 //Configuracin de mdulos}

    void loop(){ //Cdigo que se repetir infititamente //Corrimiento de LEDs del B0 al B4 digitalWrite(led0, HIGH); //Puesta en alto de led0, prende digitalWrite(led1, LOW); //Puesta en bajo de led1, apaga delay(250); digitalWrite(led1, HIGH); //Puesta en alto de led1, prende digitalWrite(led0, LOW); //Puesta en bajo de led0, apaga delay(250); digitalWrite(led2, HIGH); //Puesta en alto de led2, prende digitalWrite(led1, LOW); //Puesta en bajo de led1, apaga delay(250); digitalWrite(led3, HIGH); //Puesta en alto de led3, prende digitalWrite(led2, LOW); //Puesta en bajo de led2, apaga delay(250); digitalWrite(led4, HIGH); //Puesta en alto de led4, prende digitalWrite(led3, LOW); //Puesta en bajo de led3, apaga delay(250);

    //Corrimiento de LEDs del B4 al b0 digitalWrite(led3, HIGH); //Puesta en alto de led0, prende digitalWrite(led4, LOW); //Puesta en bajo de led4, apaga delay(250); digitalWrite(led2, HIGH); //Puesta en alto de led0, prende digitalWrite(led3, LOW); //Puesta en bajo de led4, apaga delay(250); digitalWrite(led1, HIGH); //Puesta en alto de led0, prende digitalWrite(led2, LOW); //Puesta en bajo de led4, apaga delay(250);}

    Es un ejemplo sencillo pero ayuda a comprender el manejo de los pines digitales como salidas.

  • Ejemplo 2: Encendido de un LED con un interruptor sin contacto.La tarjeta del robot A3 cuenta con 5 sensores del tipo reflectivo infrarrojo. Este tipo est compuesto de dos componentes un emisor y un receptor. El primero es un LED infrarrojo, luz que no podemos ver los ojos; el segundo es un fototransistor con filtro de luz de da.El funcionamiento es el siguiente:

    Figura 18. Sensor Reflectivo sobre superficie reflejante.

    Cuando el LED infrarrojo se encuentre emitiendo luz, si la superfice es reflejante, por ejemplo blanca, se refleja una cantidad de luz que es percebida por el fototransistor, que convierte la seal luminosa en voltaje, permite un flujo de corriente entre sus terminales y por la configuracin de carga de emisor se obtiene un valor.

    Figura19. Sensor Reflectivo sobre superficie opaca

    Por lo contrario si el la superficie es opaca, por ejemplo negra, se refleja poca luz, la cual es percibida por el fototransisto, pero se genera poca corriente en sus terminales y por consiguiente poco voltaje.Este sensor no puede servir como un interruptor sin contacto, y se usa comnmente en muchos procesos de la industra y cotidianos, tal es caso de las llaves automticas de agua usadas en los baos pblicos. La intensin es que cuando coloque su dedo frente al sensor este active el LED.

    A continuacin se propone el cdigo. /*--------------------------------Inicio del cdigo--------------------------------*///Declaracin de variables globalesint sensor4;

    int runled = 13; //Alias para pin 13

  • int led0 = 11;

    void setup(){ //Configuracin de entradas y salidas pinMode(led0, OUTPUT); //Salida digital en led0 = pin 11

    //Configuracin de mdulos}void loop(){ //Cdigo que se repetir infititamente

    sensor4 = analogRead(A4); //Lectura del sensor Izquierdo if (sensor4 > 512) //Si la superficie es blanca entonces prende LED { digitalWrite(led0, HIGH); } else //Sino, es decir, es negro, entonces apaga LED { digitalWrite(led0, LOW); }

    delay(50);}/*--------------------------------Fin del cdigo--------------------------------*/

    El funcionamiento de este ser el siguiente, cuando coloque su dedo cerca del sensor marcado como A4 en el PCB del robot el indicador LED marcado como B0 se encender, sino se mantendr apagado, como se muestra en la siguiente figura.

    Figura 20. Funcionamiento del programa

  • Ejercicio 1:Desarrolle un programa que cumpla con las siguientes condiciones:

    Si el sensor 4, A4, detecta, est sobre una superficie reflejante, entonces prende el LED marcado como B0.

    Si el sensor 3, A3, detecta, est sobre una superficie reflejante, entonces prende el LED marcado como B1.

    Si el sensor 2, A2, detecta, est sobre una superficie reflejante, entonces prende el LED marcado como B2.

    Si el sensor 1, A1, detecta, est sobre una superficie reflejante, entonces prende el LED marcado como B3.

    Si el sensor 0, A0, detecta, est sobre una superficie reflejante, entonces prende el LED marcado como B4.

    Cada uno de los sensores debe accionar de manera independiente, pudiendo estar varios en superficie reflejante y tener funcionamiento.

  • Ejemplo 3: Accionar de motores.Para probar los motores tenemos que conectarlos en los terminales (verdes con tornillos), marcados como Motor A y Motor B. En la siguiente figura se muestra a manera de ejemplo la conexin.

    Figura 21. Conexin de motoresTambin es necesario conectar la batera con interruptor. Sea cuidadoso al conectar la batera, conecte el cable rojo del broche de la batera (positivo) en el tornillo del terminal verde marcado con +V, y el negro (comn, tierra) conctelo al otro lado del terminal, marcado con GND.Puede guiarse de la siguiente figura para conectarlo. Corte la alimentacin con el interruptor.

    Figura 22. Conexin de batera

  • Copie y pegue el siguiente cdigo en la ventana del IDE de Arduino./*--------------------------------Inicio del cdigo--------------------------------*///Declaracin de variables globalesint sensor0, sensor1, sensor2, sensor3, sensor4;

    int MotorA = 3;int MotorB = 5;int led1 = 6;int led2 = 7;int led3 = 8;

    void setup(){ //Configuracin de entradas y salidas pinMode(MotorA, OUTPUT); //Salida digital en MotorA = pin 5 pinMode(MotorB, OUTPUT); //Salida digital en MotorA = pin 3 pinMode(led1, OUTPUT); //Salida digital en led1 = pin 6 pinMode(led2, OUTPUT); //Salida digital en led2 = pin 7 pinMode(led3, OUTPUT); //Salida digital en led3 = pin 8 //Configuracin de mdulos}

    void loop(){ //Cdigo que se repetir infititamente

    //Adelante digitalWrite(MotorA, HIGH); digitalWrite(MotorB, HIGH); digitalWrite(led1, LOW); digitalWrite(led2, HIGH); digitalWrite(led3, LOW); delay(1000); //Derecha digitalWrite(MotorA, HIGH); digitalWrite(MotorB, LOW); digitalWrite(led1, HIGH); digitalWrite(led2, LOW); digitalWrite(led3, LOW); delay(1000); //Izquierda

  • digitalWrite(MotorA, LOW); digitalWrite(MotorB, HIGH); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); delay(1000);

    }/*--------------------------------Fin del cdigo--------------------------------*/

    FuncionamientoEl robot deber ir hacia adelante, despus a la derecha y por ltimo a la izquierda. Se repetir infinitamente. Verifique que la secuencia descrita corresponda con el movimiento del robot. Si alguno de los motores gira en sentido contrario invierta los cables en los terminales de tornillo (verdes).

  • Ejemplo 4: Visualizacin del valor de los sensores en monitor serial.Una de las grandes ventajas de las tarjetas de Arduino es su simplicidad para establecer conexin con una computadora. Esto se realiza gracias al convertivor USB a serial incluido en la tarjeta. A dems el entorno de programacin cuenta con una aplicacin, monitor serial, que sirve para visualizar, recibir y enviar informacin.El siguiente programa obtiene el valor de los sensores reflectivos analgico, los cuantifica y los despliega. La cuantificacin es el proceso por el cual se le asigna un valor en bits a una seal. Los convertidores CAD, Analgico a Decimal, cuantifican las seales, es decir entregan un valor en nmero dependiendo de la resolucin que posean. En el caso del microcontrolador que se usa, Atmega328, la resolucin es de 10 bits, es decir 1024 divisiones en la escala del 0 al 5V. Una buen analoga es la siguiente: Suponga que tiene una escalera de 5 metros con 1024 escalones, cada escaln le har subir 0.0048 metros. Si otra persona le indica que tiene que pintar una linea a 2.5 metros del piso, Cuntos escalones tendr que subir?, esto puede resolverse por una simple regla de tres:

    A grosso modo eso es lo que hace un convertidor Analgico a Digital, convierte un voltaje en un dato que pueda manipular.Para realizar la calibracin los sensores o para obtener informacin de ellos se puede realizar un programa que muestre los datos en el monitor serial. A continuacin se propone el cdigo para realizar esta tarea.

    /*--------------------------------Inicio del cdigo--------------------------------*///Declaracin de variables globalesint sensor0, sensor1, sensor2, sensor3, sensor4;

    void setup(){ //Configuracin de entradas y salidas

    //Configuracin de mdulos Serial.begin(9600);}

    void loop(){ //Cdigo que se repetir infititamente

    sensor0 = analogRead(A0); //Lectura del sensor Derecho sensor1 = analogRead(A1); //Lectura del sensor Centro Derecho sensor2 = analogRead(A2); //Lectura del sensor Centro sensor3 = analogRead(A3); //Lectura del sensor Centro Izquierdo sensor4 = analogRead(A4); //Lectura del sensor Izquierdo

    Dato= 2.5metros1024escalones5metros

    =512escalones

  • Serial.print("Sensor Derecho = "); Serial.println(sensor0); Serial.print("Sensor Centro Derecho = "); Serial.println(sensor1); Serial.print("Sensor Centro = "); Serial.println(sensor2); Serial.print("Sensor Centro Izquierdo = "); Serial.println(sensor3); Serial.print("Sensor Izquierdo = "); Serial.println(sensor4); delay(500);

    }/*--------------------------------Fin del cdigo--------------------------------*/

    FuncionamientoUna vez compilado y descargado el cdigo se deber abrir el monitor serial dentro del IDE de Arduino para ver los datos.

    Figura 23. Recepcin de datos por el monitor Serial

    En la figura se puede observar los valores obtenidos sobre una superficie reflejante, en la parte superior, y en la posterior sobre una superficie opaca. Estos datos son importantes para la determinacin del umbral para el seguidor de lnea.

    Ejercicio 2Desarrolle el cdigo para un programa que muestre por el monitor serial el valor de los sensores en Voltaje.

  • Ejemplo 5: Seguidor de lnea BsicoEl seguimiento de una lnea es una buena introduccin en la programacin de robots.

    Por qu un seguidor de lneas? Es fcil entender el funcionamiento y la lgica de programacin para el seguimiento de una lnea. Optimizar el programa para hacer que el robot se deslice sobre una lnea a la velocidad ms rpida es un reto que puse llevarle a algunos conceptor avanzados de programacin.

    Explicacin del concursoEl concurso de velocidad consiste en una carrera de persecucin entre dos robots en una pista cerrada, comenzando en puntos opuestos y avanzando en el mismo sentido. El objeto, por tanto, ser la consecucin de altas velocidades de marca en un recorrido perfectamente establecido.

    Figura 24. Competicin seguidor de lnea, persecucin

    Construya una pista para pruebasEs importante tener una pista o construir una con los siguientes materiales.

    Cartulina blanca, cinta de aislar negra, tijeras.

    Para hacer pruebas dibuje con la cita de aislar una pista sencilla, tal vez sea suficiente con un rectngulo con las esquinas redondeadas o una elipse. No se recomienda vueltas con ngulos rectos, 90 grados.

  • Se propone el siguiente cdigo, copie y pegue en el rea de cdigo del IDE de Arduino.

    /*--------------------------------Inicio del cdigo--------------------------------*///Declaracin de variables globalesint sensor0, sensor1, sensor2, sensor3, sensor4;

    int runled = 13; //Alias para pin 13int led0 = 11;int led1 = 6;int led2 = 7;int led3 = 8;int led4 = 9;

    int umbral = 750;int velocidad = 100;

    void setup(){ //Configuracin de entradas y salidas pinMode(runled, OUTPUT); //Salida digital en runled = pin 13 pinMode(led0, OUTPUT); //Salida digital en led0 = pin 11 pinMode(led1, OUTPUT); //Salida digital en led1 = pin 6 pinMode(led2, OUTPUT); //Salida digital en led2 = pin 7 pinMode(led3, OUTPUT); //Salida digital en led3 = pin 8 pinMode(led4, OUTPUT); //Salida digital en led4 = pin 9 //Configuracin de mdulos}

    void loop(){ //Cdigo que se repetir infititamente

    sensor0 = analogRead(A0); sensor1 = analogRead(A1); //Lectura del sensor Centro Derecho sensor2 = analogRead(A2); //Lectura del sensor Centro sensor3 = analogRead(A3); //Lectura del sensor Centro Izquierdo sensor4 = analogRead(A4); if (sensor0 > umbral && sensor1 > umbral && sensor2 < umbral && sensor3 > umbral && sensor4 >

    umbral) //Si la superficie es blanca entonces prende LED { analogWrite(5, velocidad); analogWrite(3, velocidad); digitalWrite(led1, LOW);

  • digitalWrite(led2, HIGH); digitalWrite(led3, LOW); }

    //Centro y derecho if (sensor0 > umbral && sensor1 < umbral && sensor2 > umbral && sensor3 > umbral && sensor4 > umbral) //Si la superficie es blanca entonces prende LED

    { analogWrite(5, 50); analogWrite(3, velocidad); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, LOW); } //derecho if (sensor0 < umbral && sensor1 > umbral && sensor2 > umbral && sensor3 > umbral && sensor4 >

    umbral) //Si la superficie es blanca entonces prende LED { analogWrite(5, 20); analogWrite(3, velocidad); digitalWrite(led1, HIGH); digitalWrite(led2, LOW); digitalWrite(led3, LOW); }

    //Centro Izquierdo if (sensor0 > umbral && sensor1 > umbral && sensor2 > umbral && sensor3 < umbral && sensor4 > umbral) //Si la superficie es blanca entonces prende LED

    { analogWrite(5, velocidad); analogWrite(3, 50); digitalWrite(led1, LOW); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); } //Izquierdo if (sensor0 > umbral && sensor1 > umbral && sensor2 > umbral && sensor3 > umbral && sensor4 <

    umbral) //Si la superficie es blanca entonces prende LED { analogWrite(5, velocidad); analogWrite(3, 20);

  • digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); }

    }/*--------------------------------Fin del cdigo--------------------------------*/

    FuncionamientoSon cinco las entradas que se toman en cuenta para hacer la correccin en los motores y de esta forma seguir la lnea. Si ya prob el cdigo se dar cuenta que el robot sigue la lnea de la siguiente manera.

    Figura 25. Seguimiento de lnea con condicionesIdealmente el programa descrito anteriormente tiene el comportamiento mostrado en la tabla.

    Sensor 0 Sensor 1 Sensor 2 Sensor 3 Sensor 4 Motor A (3) Motor B (5)

    1 1 1 1 0 8.00% 40.00%

    1 1 1 0 1 20.00% 40.00%

    1 1 0 1 1 40.00% 40.00%

    1 0 1 1 1 40.00% 20.00%

    0 1 1 1 1 40.00% 8.00%

    En la tabla un 1 representa superficie blanca, y un 0 representa la lnea negra.

    Para realizar ajuste en la velocidad, se debe de cambiar el valor de la variable velocidad.int velocidad = 100;

    Y las velocidades de cada motor en cada condicin.

  • Como ver este sistema de control no es muy eficiente, el seguidor de lnea no se desliza exactamente sobre ella y se requiere trabajar a baja velocida.Ejercicio 3.Desarrolle un cdigo para la respuesta ante lo cinco sensores y las siguientes condiciones:

    Sensor 0 Sensor 1 Sensor 2 Sensor 3 Sensor 4 Motor A Motor B

    1 1 1 1 0

    1 1 1 0 1

    1 1 1 0 0

    1 1 0 1 1

    1 1 0 0 1

    1 0 1 1 1

    1 0 0 1 1

    0 1 1 1 1

    0 0 1 1 1

    Ajuste y determine las acciones a tomar con respecto a la velocidad de cada uno de los motores.

  • Ejemplo 6: Seguidor de lnea con Control PIDPara seguir la lnea con precisin es necesario aplicar mtodos de control. La tcnica usada en este ejemplo es el control PID.

    Proporcional, es un valor propocional a la posicin del robot sobre la lnea. Si el robot estcentrado sobre la lnea el error ser 0, pero si se encuentra a la derecho o izquierda el valor del error ser positivo o negativo.

    Integral, es una memoria de todos los eventos anteriores. Una integral en sistemas discretos,generalmente usados por micro-controladores y microprocesadores, se pude expresar como la sumatoria de todos los puntos anteriores, lo que en sistemas continuos es el rea debajo de la curva.

    Derivativo, es la razn de cambio, la tendencia, el diferencia de los valores actuales yanteriores.

    El cdigo propuesto/*--------------------------------Inicio cdigo-------------------------------------*/#include //Biblioteca para la lectura y calibracin de los sensores de contraste

    //Declaracin de constantes#define NUM_SENSORS 5 // Nmero de sensores#define NUM_SAMPLES_PER_SENSOR 4 // Nmero de muestras por sensor#define EMITTER_PIN 2 // Controlador de emisores LED's infrarrojos

    //Los sensores reflectivos para detectar contraste de encuentran conectados en las entradas//Analgicas A0 a A4QTRSensorsAnalog qtra((unsigned char[]) {0, 1, 2, 3, 4, 5}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);unsigned int sensorValues[NUM_SENSORS]; //Vector para almacenar seal de sensores

    unsigned int sensors[5]; // Matriz para armazenar valores dos sensores

    int MotorA = 5; //Alias para Motor Bint MotorB = 3; //Alias para Motor A

    //Declaracin de variablesint total = 0;float average = 0;int index = 0;int last_proportional;int integral;

    void setup(){

  • //Configuracin de entradas y salidas digitales delay(500); pinMode(13, OUTPUT);

    //Se prende el indicador LED conectado en el pin 13, para indicar que se //inicia la calibracin digitalWrite(13, HIGH); //Rotacin del robot para calibracin analogWrite(MotorA, 90); analogWrite(MotorB, 0);

    for (int i = 0; i < 200; i++) //Calibracin durante 5 segundos {

    qtra.calibrate(); // Se hace las lecturas para obtener valores de mximos y mnimos } digitalWrite(13, LOW); //Se apaga el LED indicando que se completo la programacin

    analogWrite(MotorA, 0); analogWrite(MotorB, 0); delay(1000);

    }

    void loop(){ while(1){ //Se obtiene el valor de cada uno de los sensores mediante la funcin qtra.readline(); unsigned int position = qtra.readLine(sensorValues);

    //Determinacin del trmino proporcional int proportional = ((int)position) - 2000;

    //Determinacin del trmino derivativo int derivative = proportional - last_proportional;

    //Determinacin del trmino integral integral += proportional;

    //Se almacena el estado anterior para determinar el prxmio trmino derivativo last_proportional = proportional;

    //Clculo para determinar la velocidad de cada uno de los motores

    int power_difference = proportional/10 + integral/10000 + derivative*3/2;

  • const int max = 180; if(power_difference > max) power_difference = max; if(power_difference < -max) power_difference = -max; if(power_difference < 0) set_motors(max+power_difference, max); else set_motors(max, max-power_difference);

    }}

    // Accionamiento dos motoresvoid set_motors(int left_speed, int right_speed){ if(right_speed >= 0 && left_speed >= 0){

    analogWrite(MotorA, left_speed); analogWrite(MotorB, right_speed);

    } if(right_speed >= 0 && left_speed < 0){

    left_speed = -left_speed; analogWrite(MotorA, left_speed); analogWrite(MotorB, 0);

    } if(right_speed < 0 && left_speed >= 0){

    right_speed = -right_speed; analogWrite(MotorA, 0); analogWrite(MotorB, right_speed);

    } }

    /*--------------------------------Fin de cdigo-------------------------------------*/

    Para la compilacin de este programa es necesario descargar e instalar la librera QTRSensors para Arduino.FuncionamientoEl robot seguir una lnea blanca sobre fondo negro, deslizndose de la mejor manera posible, debido al mtodo de contro usado, PID.

    Ejercicio 4:Modifique el cdigo para que el robot siga una lnea negra con fondo blanco.