Sunteți pe pagina 1din 30

Proyecto Profundiza. IES Cecilio Jiménez

PROYECTO PROFUNDIZA

ROBÓTICA CON ARDUINO CONSTRUCCIÓN Y PROGRAMACIÓN DE UN ROBOT SIGUE LINEAS

CONSTRUCCIÓN Y PROGRAMACIÓN DE UN ROBOT SIGUE LINEAS IES Cecilio Jiménez Profesor Adolfo J. Pedraza García
CONSTRUCCIÓN Y PROGRAMACIÓN DE UN ROBOT SIGUE LINEAS IES Cecilio Jiménez Profesor Adolfo J. Pedraza García
CONSTRUCCIÓN Y PROGRAMACIÓN DE UN ROBOT SIGUE LINEAS IES Cecilio Jiménez Profesor Adolfo J. Pedraza García

IES Cecilio Jiménez Profesor Adolfo J. Pedraza García adolfo.jpg@gmail.com

Proyecto Profundiza. IES Cecilio Jiménez

Índice

1. INTERÉS DEL PROYECTO

3

2. INTRODUCCIÓN A LA ROBÓTICA

4

3. DESCRIPCIÓN BÁSICA

DE LA TARJETA ARDUINO

4

4. MATERIALES PARA EL

ROBOT

5

5. EJEMPLOS BÁSICOS DE PROGRAMACIÓN EN ARDUINO

8

6. MONTAJE DEL PUENTE EN H PARA EL CONTROL DE LOS MOTORES

12

7. CONTROL DE LOS MOTORES DC

15

8. IMPLEMENTANDO LOS SENSORES AL ROBOT

20

9. CONTROLANDO LOS SENSORES INFRARROJOS

23

10. CONTROLANDO EN PIEZOBUZER Y LOS LEDS

26

11. PROGRAMA FINAL

27

12. IMÁGENES Y RESULTADOS FINALES

30

Proyecto Profundiza. IES Cecilio Jiménez

1. INTERÉS DEL PROYECTO

Una de los contenidos de tecnología de 4º ESO es la robótica y el control por ordenador. Estos contenidos encierran en sí un campo de estudio muy amplio y cuyas aplicaciones quedan abiertas a la imaginación.

y cuyas aplicaciones quedan abiertas a la imaginación. El entorno de desarrollo de Arduino forma parte

El entorno de desarrollo de Arduino forma parte de los programas educativos incluidos en la distribución Edu de Guadalinex que disponemos en el centro.

El trabajo en profundidad de estos contenidos en clase requiere disponer de más tiempo para su estudio y comprensión y pueden resultar difíciles para algunos alumnos. No obstante, existen otras razones de peso para no descuidarla:

Sus aplicaciones son muy motivadoras, resultando unos proyectos innovadores, atractivos y creativos.

Su puesta en práctica pone en valor los conocimientos teóricos de la materia.

La programación del robot sienta las bases para continuar esos contenidos en estudios posteriores, carreras técnicas o formación profesional.

Su desarrollo exige buenas dosis del método de científico de planteamiento/ensayo/error pero sobre la base de unos conocimientos asentados.

Anima a los alumnos a crear por ellos mismos a modificar sobre lo hecho y conseguido, adaptándolo a otras necesidades.

Plantea un plan de trabajo muy motivador y creativo para el alumnado.

Exige poner en práctica destrezas y conocimientos multidisciplinares.

Muestra las posibilidades de la tecnología y sus aplicaciones reales.

Proyecto Profundiza. IES Cecilio Jiménez

2. INTRODUCCIÓN A LA ROBÓTICA

Un robot es una máquina o ingenio electrónico programable, capaz de manipular objetos y realizar trabajos, por lo general, en instalaciones industriales.

La arquitectura de un robot se fundamenta en 3 elementos:

Sensores: permiten al robot recoger información del exterior para que pueda realizar acciones.

Actuadores: Son dispositivos que proporcionan la fuerza motriz real para las articulaciones del robot. Los actuadores suelen obtener su energía a partir de una de estas tres fuentes: aire comprimido, fluido por presión o electricidad.

Sistema de control: El sistema de control es el cerebro del robot. Procesa todos los datos de los diferentes sensores y realiza operaciones a través los actuadores conforme al programa almacenado y bajo la supervisión de un microcontrolador.

3. DESCRIPCIÓN BÁSICA DE LA TARJETA ARDUINO

3. DESCRIPCIÓN BÁSICA DE LA TARJETA ARDUINO Arduino es una plataforma de hardware abierto basada en

Arduino es una plataforma de hardware abierto basada en hardware y software flexibles y fáciles de usar. Se trata de una sencilla placa con entradas y salidas (E/S) analógicas y digitales. Originalmente estaba pensada para el desarrollo de proyectos artísticos y entornos interactivos, pero debido a su versatilidad y facilidad de uso, se está usando en muchos otros proyectos, incluyendo cada vez más robots.

Arduino puede sentir el entorno mediante la recepción de entradas desde una variedad de sensores y puede actuar en su alrededor mediante el control de luces, motores y otros artefactos. El microcontrolador de la placa se programa usando el “Arduino Programming Language” muy similiar al código C++.

En la robótica, podemos usar Arduino de 2 formas:

Arduino usarse como "cerebro" de nuestro robot, ejerciendo de controlador y coordinador del resto de partes del robot.

Si queremos usar un ordenador más potente (o un portátil) como cerebro, Arduino puede servir como interfaz de control entre el ordenador y el resto de partes del robot.

Arduino recoge todos los desordenados detalles de la programación de microcontrolador y lo encierra en un paquete fácil de usar. Arduino simplifica el proceso de trabajo y es muy apropiado para los estudiantes principiantes de robótica por las siguientes ventajas:

Proyecto Profundiza. IES Cecilio Jiménez

Barato: Las placas de Arduino son relativamente baratas y se pueden incluso ensamblar a mano.

Multiplataforma: El software de Arduino se ejecuta en sistemas operativos Windows, Macintosh OSX y GNU/Linux.

Entorno de programación simple y claro.

Código abierto y software extensible: El software de Arduino está publicado como herramientas de código abierto.

Hardware abierto y extensible: Los planos de los módulos están publicados bajo licencia Creative Commons, por que diseñadores experimentados de circuitos pueden hacer su propia versión del módulo, extendiéndolo o mejorándolo.

El significado de los pines de Arduino lo tienes a continuación:

de los pines de Arduino lo tienes a continuación: 4. MATERIALES PARA EL ROBOT Los materiales

4. MATERIALES PARA EL ROBOT

Los materiales para la construcción de nuestro robot sigue líneas los hemos adquirido a través de tiendas online:

Cooking-hacks: http://www.cooking-hacks.com/

Onda radio: http://www.ondaradio.es/

Proyecto Profundiza. IES Cecilio Jiménez

Proyecto Profundiza. IES Cecilio Jiménez

http://www.bricogeek.com/shop/ robotica/108-rueda-loca- Rueda loca metalica-3-8.html http://www.ondaradio.es/esp/cata
http://www.bricogeek.com/shop/
robotica/108-rueda-loca-
Rueda loca
metalica-3-8.html
http://www.ondaradio.es/esp/cata
logoConsulta.aspx?
Chip L293D (Puente en H)
TextBuscar=L293D
http://www.bricogeek.com/shop/
componentes/299-zumbador-
Zumbador piezo
piezo-12mm.html
Diodos led 5mm de alta
lumninosidad
(Se puede encontrar en tiendas
de electrónica)
Resistencias de 220 Ω, 330 Ω y
10 kΩ
(Se puede encontrar en tiendas
de electrónica)

Proyecto Profundiza. IES Cecilio Jiménez

http://www.bricogeek.com/shop/ cables/331-cable-adaptador-9v- Cable de alimentación jack jack.html
http://www.bricogeek.com/shop/
cables/331-cable-adaptador-9v-
Cable de alimentación jack
jack.html
http://www.cooking-
hacks.com/index.php/arduino-
jumper-cables.html
Cables de conexión
(Se puede encontrar en tiendas
de electrónica)
http://www.bricogeek.com/shop/
cables/343-cable-usb-a-b.html
Cable USB (A/B)
(Se puede encontrar en tiendas
de electrónica)
http://www.bricogeek.com/shop/
cables/386-tubo-
termoretractil.html
Tubo Termoretráctil
(Se puede encontrar en tiendas
de electrónica)

5. EJEMPLOS BÁSICOS DE PROGRAMACIÓN EN ARDUINO.

1. Led intermitente. Se trata de hacer un programa que active un led conectado al pin 13 de forma intermitente durante un tiempo de 1 segundo encendido y 1 segundo apagado. Es el

Proyecto Profundiza. IES Cecilio Jiménez

programa que tiene cargado la placa arduino nada más sacarla de la caja. Los comentarios al programa apararen detrás de la doble barra //. La ejecución del programa los ignora así que podemos poner todos los que queramos. Leyendo los comentarios de los programas aprenderás mucho!

void setup()

//comienza la configuración de los pines.

{

pinMode(13, OUTPUT);

//asignamos el pin 13 como salida .

}

void loop()

//comienza el bucle.

{

digitalWrite(13, HIGH);

//activamos el pin 13.

delay(1000);

//esperamos 1000 milisegundos (=1s)

digitalWrite(13, LOW);

//apagamos el led.

delay(1000);

//esperamos 1000 milisegundos.

}

2. Creando una variable. Vamos a crear una variable llamada LED para almacenar en ella el número del pin que vamos a utilizar en el programa. Aunque en este caso, dada la sencillez del ejemplo no sería necesario, es una buena práctica cuando tengamos más dispositivos conectados a la placa arduino, ya que facilita la comprensión de los programas.

int LED = 13;

//el valor 13. Como 13 es un número entero por ello se escribe int delante

//creamos una variable llamada LED y le asignamos

void setup() { pinMode(LED, OUTPUT);

//creada anteriormente, cuando escribimos LED, el programa //interpreta el valor //asignado, 13.

//Aquí hemos utilizado ya la variable

}

void loop() { digitalWrite(LED, HIGH);

delay(1000);

digitalWrite(LED, LOW);

delay(1000);

}

3. Creamos más variables. Ahora vamos a añadir al programa una variable llamada t_on para

guardar en ella el tiempo de encendido del LED, y otra variable t_off para el tiempo de apagado, que serán de 0,5s y 0,1s respectivamente.

int t_on = 500; //creamos la variable t_on y le asignamos un

Proyecto Profundiza. IES Cecilio Jiménez

//valor de 500 int t_off = 100; //creamos la variable t_off y le asignamos un //valor de 100 milisegundos int LED = 13;

void setup() { pinMode(LED, OUTPUT);

}

void loop() { digitalWrite(LED, HIGH); delay(t_on); digitalWrite(LED,LOW); delay(t_off);

}

4. Programando un semáforo. Vamos a programar el encendido de tres leds conectados en los pines 4, 5 y 6 correspondientes a las luces rojo, amarilla y verde respectivamente. El tiempo de encendido será de 3s, 1s y 4s respectivamente.

El tiempo de encendido será de 3s, 1s y 4s respectivamente. void setup() { pinMode(4,OUTPUT); //configuramos

void setup() {

pinMode(4,OUTPUT); //configuramos los pines 4,5 y 6 como salidas

pinMode(5,OUTPUT);

pinMode(6,OUTPUT);

}

Proyecto Profundiza. IES Cecilio Jiménez

void loop()

{

digitalWrite(4, HIGH); //activamos el pin 4 (led rojo) delay(3000); //esperamos 3 segundos

digitalWrite(4, LOW); //apagamos el led rojo digitalWrite(5, HIGH); //activamos el pin 5 (led amarillo) delay(1000); //esperamos 1 segundo digitalWrite(5,LOW); //apagamos el led amarillo digitalWrite(6,HIGH); //activamos el pin 6 (led verde) delay(4000); //esperamos 4 segundos digitalWrite(6,LOW); //apagamos el led verde

}

5. ¿Utilizamos un bucle for? En ocasiones puede resultar muy útil escribir este tipo de bucle, ejecutando, en pocas líneas de programa, muchas órdenes. Por ejemplo, nos puede servir para acelerar poco a poco un motor hasta llegar a su máxima velocidad. En este caso lo vamos a aplicar para definir los pines 4,5 y 6 como salidas del ejercicio anterior. Su estructura es la siguiente:

void setup() {

for (int i=4;i<7;i=i+1) { pinMode(i,OUTPUT);

}

}

//Para definir el bucle se requieren tres parámetros:

a) definir una variable y un valor inicial

b) definir la condición para que se repita el bucle (interprétalo

como repite esto mientras que 'i' valga menos de 7) c) definir el incremento (o decremento) del valor de la variable en cada repetición. En este caso 'i' se incrementa en una unidad en cada repetición

// el resto del programa continua igual que el anterior.

Tarea: Modifica el programa anterior para conseguir que el led amarillo parpadee 5 veces durante 1 segundo antes de conectar el led rojo.

Proyecto Profundiza. IES Cecilio Jiménez

6. MONTAJE DEL PUENTE EN H PARA EL CONTROL DE LOS

MOTORES

La tarjeta Arduino proporciona una corriente máxima por canal de 40mA, suficiente para activar pequeños actuadores como leds pero insuficiente para manejar el consumo de un motor de corriente continua. Por ello, es necesario utilizar un chip de potencia para amplificar esas señales de la tarjeta, que además incorpora unos diodos de protección contra los picos inversos de tensión producidos por la desconexión de cargas inductivas.

Para invertir la dirección del motor sin un nuevo conexionado requiere de un circuito conocido como un PUENTE-H (observa cómo el circuito alrededor del motor está en forma de H).

cómo el circuito alrededor del motor está en forma de H). P u e n t

Puente en H

motor está en forma de H). P u e n t e e n H El

El cierre de los interruptores A y D hace que el motor gire adelante.

de los interruptores A y D hace que el motor gire adelante. Cerrando los interruptores B

Cerrando los interruptores B y C hace que el motor gire hacia atrás.

Es necesario observar que es fácil hacer un corto de batería al cerrar por descuido los interruptores A y B o cerrando los interruptores C y D. Esto pondría en peligro la batería. Una buena medida para evitarlo es automatizar al máximo el control de los interruptores.

es automatizar al máximo el control de los interruptores. Para permitir controlar el Puente H al

Para permitir controlar el Puente H al microcontrolador, los interruptores mecánicos deben ser sustituidos por transistores. Observa el empleo de diodos en el circuito. El bobinado en el motor es esencialmente un inductor. Cuando el flujo de corriente en un inductor de repente es cortado, la corriente de pronto no puede ir a 0. Por consiguiente, inducen un voltaje oponiéndose a esta corriente. Este voltaje puede ser tan alto que esto destruya los transistores. Los diodos de retorno proporcionan un camino de vuelta seguro para esta corriente que evita y protege los transistores.

El puente-H, puede ser realizado con transistores discretos o puede ser comprado como un circuito integrado. Utilizar un circuito integrado ayudará a mantener el proyecto compacto y la lógica interna previene que la batería pueda ser cortocircuitada cono se describió como más arriba.

6.1. DESCRIPCIÓN

Para conseguir amplificar las señales de control de la tarjeta Arduino, invertir el sentido de giro de los motores mediante puente en H y proteger de las cargas inductivas, utilizamos para ello un chip L293D. Aquí tienes el significado de cada uno de sus 16 pines:

Proyecto Profundiza. IES Cecilio Jiménez

Proyecto Profundiza. IES Cecilio Jiménez El chip L293 es un driver de 4 canales capaz de

El chip L293 es un driver de 4 canales capaz de proporcionar una corriente de salida de hasta 1A por canal. Cada canal es controlado por señales de entrada compatibles TTL y cada pareja de canales dispone de una señal de habilitación que desconecta las salidas de los mismos.

Dispone de una patilla para la alimentación de las cargas que se están controlando, de forma que dicha alimentación es independiente de la lógica de control. Con este circuito integrado se puede controlar el sentido de giro de hasta dos motores simultáneamente.

6.2. CARACTERÍSTICAS DEL CHIP L293D

Intensidad por canal =600mA

Intensidad de pico por canal=1,2 A

Protección contra sobretemperaturas

Protección interna contra sobretensiones producidas por cargas inductivas

Alimentación independiente de las cargas y control

Alta inmunidad al ruido

Tensión de alimentación de las cargas ≤ 36 V

Tensión de alimentación del chip = de 4.5 a 36 V

36 V • Tensión de alimentación del chip = de 4.5 a 36 V Robótica con

Proyecto Profundiza. IES Cecilio Jiménez

6.3. ESQUEMA PARA CONTROLAR DOS MOTORES

IES Cecilio Jiménez 6.3. ESQUEMA PARA CONTROLAR DOS MOTORES 6.4. ESQUEMA DEL MONTAJE EN PLACA PROTOTIPOS

6.4. ESQUEMA DEL MONTAJE EN PLACA PROTOTIPOS

DOS MOTORES 6.4. ESQUEMA DEL MONTAJE EN PLACA PROTOTIPOS Robótica con arduino: Construcción y programación de

Proyecto Profundiza. IES Cecilio Jiménez

7. CONTROL DE LOS MOTORES DC

En los siguientes ejemplos y ensayos vamos a introducirnos en la programación de los motores para conseguir diferentes movimientos básicos del robot:

Marcha adelante.

Marcha atrás.

Giro izquierda.

Giro derecha.

Rotación a izquierda sobre su propio eje.

Rotación a derecha sobre su propio eje.

Una vez que hemos realizado la conexión del chip L293D o puente en H, procedemos a la programación en el IDE de Arduino:

1. Calentando motores: Vamos a comprobar el funcionamiento del motor izquierdo, que hemos conectado a los pines 4 y 5 de Arduino Uno. Para su programación, vamos a utilizar por primera vez las funciones, que son como unas rutinas que por su frecuencia de uso, si las etiquetamos con un nombre, facilitan y estructuran la programación a la vez que lo simplifican. Su uso es fácil, observa el siguiente ejemplo:

void setup () { pinMode(4,OUTPUT); //configuramos los pines 4 y 5 como salidas

pinMode(5,OUTPUT);

}

void adelante () {

digitalWrite(4,LOW);

/*Esta sería la configuración ideal, ya

digitalWrite(5,HIGH);

que

el

pin

5

es

del

tipo

PWM

}

lo

que

nos

permitirá

variar la

velocidad del motor en su avance. Si con esta conexión el motor no gira hacia adelante, entonces habrá que invertir la conexión del motor al chip L293D*/

void paro () {

digitalWrite(4,LOW);

digitalWrite(5,LOW);

}

void loop () { adelante();

delay(2000);

paro();

delay(1000);

}

//llamamos a la función creada // esperamos 2 segundos con el motor en marcha //paramos el motor utilizando la función paro

Proyecto Profundiza. IES Cecilio Jiménez

2.

¿Y el motor derecho? Vamos a comprobar el funcionamiento del motor derecho, que hemos conectado a los pines 6 y 7 de Arduino Uno. Volvemos a utilizar las funciones. Observa el siguiente ejemplo:

void setup () { pinMode(6,OUTPUT); //configuramos los pines 6 y 7 como salidas

pinMode(7,OUTPUT);

}

void adelante () {

digitalWrite(6,HIGH);

/*esta sería la configuración ideal, ya

digitalWrite(7,LOW);

que

el

pin

6

es

del

tipo

PWM

}

lo

que

nos

permitirá

variar la

velocidad del motor en su avance. Si con esta conexión el motor no

gira hacia adelante, entonces habrá que invertir la conexión del motor al chip L293D */

void paro () {

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

void loop () { adelante();

delay(2000);

paro();

delay(1000);

}

//llamamos a la función creada // esperamos 2 segundos con el motor en marcha //paramos el motor utilizando la función paro

3. ¡Y ahora los dos! Una vez que hemos comprobados que todo funciona bien y como nosotros queremos, vamos a utilizar los dos motores a la vez y vamos a introducir la función atrás:

void setup () {

pinMode(4,OUTPUT);

pinMode(5,OUTPUT);

pinMode(6,OUTPUT);

pinMode(7,OUTPUT);

}

void adelante () {

digitalWrite(4,LOW);

digitalWrite(5,HIGH);

digitalWrite(6,HIGH);

digitalWrite(7,LOW);

}

void paro () {

digitalWrite(4,LOW);

Proyecto Profundiza. IES Cecilio Jiménez

digitalWrite(5,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

void atras () {

digitalWrite(4,HIGH);

digitalWrite(5,LOW);

digitalWrite(6,LOW);

digitalWrite(7,HIGH);

}

void loop () { adelante();

delay(2000);

paro();

delay(1000);

atras();

delay(2000);

paro();

delay(1000);

}

4. Y ahora los giros: Como ya puedes entender, para conseguir que el robot gire a la izquierda debes parar el motor de ese lado y mantener en marcha el derecho. Al contrario, para girar a la derecha, debes parar el motor derecho y mantener en marcha el motor izquierdo. Como ejemplo vamos a programar los siguientes movimientos:

Adelante 2 s

Paro 0,5 s

Gira a izquierdas 0,25 s

Paro 0,5 s

Atrás 2 s

Paro 0,5 s

Gira a derechas 0,25 s

Paro 0,5 s

void setup () {

pinMode(4,OUTPUT);

pinMode(5,OUTPUT);

pinMode(6,OUTPUT);

pinMode(7,OUTPUT);

}

void adelante () {

digitalWrite(4,LOW);

digitalWrite(5,HIGH);

digitalWrite(6,HIGH);

digitalWrite(7,LOW);

Proyecto Profundiza. IES Cecilio Jiménez

}

void paro () {

digitalWrite(4,LOW);

digitalWrite(5,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

void atras () {

digitalWrite(4,HIGH);

digitalWrite(5,LOW);

digitalWrite(6,LOW);

digitalWrite(7,HIGH);

}

void giraizquierda () { digitalWrite(4,LOW); //paramos el motor izquierdo

digitalWrite(5,LOW);

digitalWrite(6,HIGH); //mantenemos el motor derecho en marcha

digitalWrite(7,LOW);

}

void giraderecha () {

digitalWrite(4,LOW);

digitalWrite(5,HIGH); //mantenemos el motor izquierdo en marcha digitalWrite(6,LOW); //paramos el motor derecho

digitalWrite(7,LOW);

}

void loop () { adelante();

delay(2000);

paro();

delay(500);

giraizquierda();

delay(250);

paro();

delay(500);

atras();

delay(2000);

paro();

delay(500);

giraderecha();

delay(250);

paro();

delay(500);

}

5.

Regulando la velocidad: Aplicar toda la energía al motor DC, hará que éste, gire a la

Proyecto Profundiza. IES Cecilio Jiménez

máxima velocidad y quitando la energía al motor, haremos que el motor deje de girar. El puente-h que hemos comentado antes es capaz de controlar estos dos estados. Para conseguir hacer que el motor pueda girar a velocidades inferiores, puede usarse una técnica conocida como, Modulación de Anchura de Pulso (PWM). Para el control adecuado del robot y hacerlo seguir bien la línea sin perderla, es conveniente utilizar velocidades de giro menores. La tarjeta Arduino Uno integra 6 pines del tipo PWM. Estos pines pueden tomar 256 valores diferentes comprendidos entre 0 y 5V. El controlador consigue proporcionando en realidad una señal digital.

El PWM es un modo eficiente, para simular una gama de valores analógicos en circuitos digitales. Conmutando rápidamente entre encendido y apagado, se puede simular un valor medio. Se muestran tres señales en la figura.

un valor medio. Se muestran tres señales en la figura. Las tres señales comparten la misma

Las tres señales comparten la misma frecuencia, pero la anchura de los pulsos es diferente. Por medio de la variación del tiempo en "alto", podemos hacer que el motor "vea" un valor entre 0V y

+5V.

Para programar una salida analógica, debemos escribir:

analogWrite(pin,valor);//valor debe estar comprendido entre 0 y

255

Ejemplo:

analogWrite(5,100);

//activa el pin 5 con un valor de 100,

que correspondería al 100/256 = 39% de su voltaje máximo.

6. Acelerando los motores: si queremos conseguir una aceleración gradual de la velocidad los motores debemos introducir un concepto nuevo de programación, el bucle for. Observa el siguiente ejemplo:

Proyecto Profundiza. IES Cecilio Jiménez

void acelera () {

digitalWrite(4,HIGH);

digitalWrite(7,HIGH);

for (int i=0;i<255;i=i+10) { /*la variable i se utiliza para almacenar el valor del pulso PWM. Se suma 10 unidades en cada repetición del bucle for */

analogWrite(5,i);

analogWrite(6,i);

delay(100);

}

}

8. IMPLEMENTANDO LOS SENSORES AL ROBOT

8.1. INTRODUCCIÓN

En robótica, el uso de diversos sensores es esencial ya que permiten al robot captar información sobre su entorno. Luego, por medio del control, podremos interpretar las señales proporcionadas y actuar en consecuencia. Los sensores son por tanto básicos para que el robot pueda actuar sobre su entorno conforme a sus sensores y al programa de control.

En la clasificación de los sistemas de control, tenemos dos grupos:

de los sistemas de control, tenemos dos grupos: Sistemas automáticos de lazo abierto: suelen funcionar

Sistemas automáticos de lazo abierto: suelen funcionar sobre una base de tiempos prefijados e invariables según las condiciones del sistema a controlar. Ejemplos: una lavadora, un semáforo,

llenado de un depósito por tiempos de conexión

de una bomba, etc.

Sistemas automáticos de lazo cerrado: comparan continuamente la señal de referencia con la señal de uno o varios sensores y actúan sobre el sistema en función de esa diferencia y de las instrucciones contenidas en el programa.

Ejemplos: El control estable de la temperatura o humedad de un recinto (frigorífico o sistema de riego automático), llenado de un depósito con sistema antirrebose, encendido automático de iluminación en función de la oscuridad, mantenimiento estable de la velocidad de un vehículos, sistemas detectores de colisión, etc.

de un vehículos, sistemas detectores de colisión, etc. Estos sistemas de control son más completos que

Estos sistemas de control son más completos que los de lazo abierto y permiten realizar funciones más complejas.

Tipos de sensores hay muchos, por ejemplo:

Sensores de luz

Sensores inclinación

Proyecto Profundiza. IES Cecilio Jiménez

Sensores de temperatura

Sensores de humedad

Sensores emisor/receptor de infrarrojos

Sensores de giro

Sensores de aceleración

Sensores de presión, etc.

Sensores de presencia

Por medio de los sensores conseguiremos que nuestro robot sea capaz de seguir una línea negra. Para ello utilizaremos dos sensores emisor/receptor de infrarrojos del tipo QRD 1114 (también es válido un sensor CNY70). Los colocaremos a una distancia tal que la línea negra pase justo entre los dos sensores.

8.2. DESCRPCIÓN DEL SENSOR DE INFRARROJOS.

dos sensores. 8.2. DESCRPCIÓN DEL SENSOR DE INFRARROJOS. Como ya hemos indicado, utilizaremos unos sensores del

Como ya hemos indicado, utilizaremos unos sensores del tipo QRD 1114. Este sensor consta de un diodo emisor de infrarrojos y de un fototransistor receptor. En total tiene 4 patillas, 2 para el diodo emisor y otras 2 para el receptor.

El blanco refleja la luz (receptor en saturación)

El negro absorbe la luz (receptor en corte)

en saturación) El negro absorbe la luz (receptor en corte) Pin 1 → Colector Pin 2
en saturación) El negro absorbe la luz (receptor en corte) Pin 1 → Colector Pin 2

Pin 1 → Colector Pin 2 → Emisor Pin 3 → Ánodo Pin 4 → Cátodo

Colector Pin 2 → Emisor Pin 3 → Ánodo Pin 4 → Cátodo (*) La marca

(*) La marca que puedes ver en la imagen, indica la patilla 1 (colector)

Proyecto Profundiza. IES Cecilio Jiménez

8.3. CONEXIÓN DE LOS SENSORES DE INFRARROJOS

Jiménez 8.3. CONEXIÓN DE LOS SENSORES DE INFRARROJOS 8.4. INTERPRETACIÓN DE LA LECTURA DEL SENSOR Color
Jiménez 8.3. CONEXIÓN DE LOS SENSORES DE INFRARROJOS 8.4. INTERPRETACIÓN DE LA LECTURA DEL SENSOR Color

8.4. INTERPRETACIÓN DE LA LECTURA DEL SENSOR

Color blanco → refleja la luz → satura el fototransistor → Entrada a 0V → LOW Color negro → absorbe la luz → fototransistor en corte → Entrada a 5V → HIGH

Sensor

Sensor

   

izquierdo

derecho

Situación

Acción

LOW

LOW

Coche en línea

Los dos motores giran adelante

LOW

HIGH

Coche se desvía a izquierda

Girar a derecha

HIGH

LOW

Coche se desvía a derecha

Girar a izquierda

HIGH

HIGH

Coche llega a meta

Parar motores

Nota: Las pistas del circuito que puedes ver en las galerías web del último apartado, se han realizado con cartulina para las curvas y con cinta aislante en los tramos rectos. Los sensores infrarrojos devuelven lecturas completamente diferentes sobre la cartulina y sobre la cinta aislante, a pesar de que las dos son negras. Por ejemplo, en el monitor serie leemos valores de 36 sobre lo blanco, 890 sobre la cinta aislante y ¡39! sobre la cartulina negra. Para remediar este inconveniente, repasa con rotulador negro indeleble los tramos de cartulina y ¡voilá!, asunto arreglado.

Proyecto Profundiza. IES Cecilio Jiménez

9. CONTROLANDO LOS SENSORES INFRARROJOS

IES Cecilio Jiménez 9. CONTROLANDO LOS SENSORES INFRARROJOS Los sensores de infrarrojos nos van a proporcionar

Los sensores de infrarrojos nos van a proporcionar una información vital para nuestro robot siguelíneas, van a ser sus ojos. Los sensores los conectaremos a las entradas analógicas 0 y 1 de Arduino, añadiendo las resistencias de protección correspondientes vistas en el apartado anterior. Una vez que tenemos todo conectado es hora de tomar las lecturas de los sensores.

conectado es hora de tomar las lecturas de los sensores. Para ello utilizaremos el monitor serie

Para ello utilizaremos el monitor serie del IDE arduino. Esta ventana permite mostrar, enviar y recibir información entre el ordenador y nuestra tarjeta arduino. La utilidad del monitor serie es muy grande para el control de proyectos robóticos.

1. Tomando las lecturas de los sensores: Bien, ya tenemos listos y en su sitio los sensores de infrarrojos QRD 1114. Ahora debemos comprobar si funcionan bien y, lo que es más importante, las lecturas que arrojan cuando los colocamos sobre una superficie blanca y sobre una superficie negra.

void setup () {

Serial.begin(9600);

}

//iniciamos en monitor serie a una velocidad de 9600 baudios (bit/s)

void loop () { int lectura_izq = analogRead(0); //leemos la entrada analógica 0 y la guardamos en la variable entera lectura_izq

int lectura_der = analogRead(1); Serial.print("sensor izquierdo: "); //escribimos el texto entre “ “ en el monitor serie

}

Serial.println(lectura_izq);

/*escribimos el valor añadiendo un retorno de carro al final de la línea */

Serial.print("sensor derecho: "); Serial.println(lectura_der);

delay(1000);

/*esperamos 1 segundo antes de realizar un nueva lectura para no saturar el puerto serie */

Proyecto Profundiza. IES Cecilio Jiménez

Después de tomar las lecturas de los sensores infrarrojos, observamos que cuando el sensor está sobre blanco da valores bajos, entorno a 35, y cuando el sensor está sobre negro da valores altos, entorno a 890. Como referencia debemos tomar un valor por encima del cual sabremos con seguridad que el sensor está sobre negro, y por lo tanto, que el robot está perdiendo la trayectoria. Nos parece adecuado tomar como referencia un valor de 500. Valores superiores a este, darán la orden de rectificar la trayectoria mediante un giro a derecha o a izquierda según el caso.

2. En línea: Vamos a programar ya lo que será el núcleo central del control del robot. Debemos tomar las lecturas de los sensores y decidir en función de éstas, si el robot está en línea o si está desviado. En cualquiera de los casos, las lecturas deberán ir seguidas de una orden correspondiente:

Sensor

Sensor

   

izquierdo

derecho

Situación

Acción

<500

<500

Coche en línea

Los dos motores giran adelante

<500

>500

Coche se desvía a izquierda

Girar a derecha

>500

<500

Coche se desvía a derecha

Girar a izquierda

>500

>500

Coche llega a meta

Parar motores

En el programa de control del robot siguelíneas cobra una especial relevancia la orden if (si). If es un estamento que se utiliza para probar si una determinada condición se ha alcanzado, como en nuestro caso, averiguar si un valor analógico está por encima de un cierto número. Si la condición probada es verdadera (se cumple), se ejecutan una serie de operaciones que se escriben dentro de llaves y si la condición es falta (no se cumple) el programa salta y no ejecuta las operaciones que están dentro de las llaves. El formato para if es el siguiente:

if ( condición )

{

instrucciones;

}

Si la condición es cierta, se ejecutan las órdenes contenidas entre las llaves. Si no es así, el programa salta sobre ellas y continúa.

El programa de control quedaría así:

void setup () {

pinMode(4,OUTPUT);

pinMode(5,OUTPUT);

pinMode(6,OUTPUT);

pinMode(7,OUTPUT);

}

int valorsensor_i; int valorsensor_d;

Proyecto Profundiza. IES Cecilio Jiménez

void adelante () {

digitalWrite(4,LOW);

analogWrite(5,100);

analogWrite(6,100);

digitalWrite(7,LOW);

}

void paro () {

digitalWrite(4,LOW);

digitalWrite(5,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

void gira_der () {

digitalWrite(4,LOW);

analogWrite(5,80);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

void gira_izq () {

digitalWrite(4,LOW);

digitalWrite(5,LOW);

analogWrite(6,80);

digitalWrite(7,LOW);

}

void loop () { int valorsensor_i = analogRead(0); int valorsensor_d = analogRead(1);

if (valorsensor_i<500 && valorsensor_d<500)

{

adelante();

}

if (valorsensor_i>500 && valorsensor_d<500)

{

gira_izq();

}

if (valorsensor_i<500 && valorsensor_d>500)

{

gira_der();

}

if (valorsensor_i>500 && valorsensor_d>500)

{

paro();

}

}

Proyecto Profundiza. IES Cecilio Jiménez

10. CONTROLANDO EN PIEZOBUZER Y LOS LEDS.

En nuestro robot, hemos conectado un par de leds de alta intensidad en los pines 12 para el led izquierdo, y en el pin 8 para el derecho. La conexión de estos componentes a la placa arduino no encierra ya ningún misterio. Solo anotar la necesidad de conectar unas resistencias de protección para limitar la corriente.

El piezobuzer lo conectamos al pin 9. Tiene una polaridad claramente serigrafiada en el componente que habrá que respetar. Para hacerlo sonar hacemos uso de la función tone(). Esta función toma los siguiente argumentos:

tone(pin,frecuencia,duracion);

pin → número del pin al que está conectado el buzzer

frecuencia → genera una señal cuadrada de frecuencia (en Hz) igual a la especificada.

Duración → opcional. Puedes poner un valor en milisegundos para la duración del tono o no poner nada. En este caso, la señal seguirá hasta que la orden noTone()

Ejemplos:

int buz=9;

void aviso() { tone(buz,880,200); //generamos un tono de 880 Hz de 200 milisegundos de duración

}

void tonosalida() { for (int i=1;i<3;i++) {

tone(buz,784,200); //damos dos tonos de 200 milisegundos a una frecuencia de 784 Hz (Sol, 5ª octava)

}

tone(buz,1568,400); //un tono de 400 ms a 1568 Hz (Sol, 6ª octava)

}

¿y los leds? Para los leds inferiores, que tienen como función iluminar el suelo para reducir la influencia de las condiciones lumínicas de diferentes ambientes, programaremos un sencillo intermitente alternativo entre los led izquierdo y derecho. Prevemos que esta función la llamaremos cuando el robot llegue a meta.

int led_i=12; int led_d=8;

void led () { for (int i=1;i<20;i=i+1)

{

digitalWrite(led_d,HIGH);

delay(100);

Proyecto Profundiza. IES Cecilio Jiménez

digitalWrite(led_d,LOW); digitalWrite(led_i,HIGH);

delay(100);

digitalWrite(led_i,LOW);

}

}

11. PROGRAMA FINAL

Se ha programado un contador de vueltas, de forma que el robot debe completar 3 giros al circuito. Cada vez que pasa por meta el robot emite un pitido y aumenta su contador interno. Una vez que se completa los tres giros, el robot ilumina los leds inferiores de forma intermitente alternativa.

int buz=9; int led_i=12; int led_d=8; int valorsensor_i; int valorsensor_d; int vueltas=3; int contador=0; long tiempo;

void setup () {

pinMode(4,OUTPUT);

pinMode(5,OUTPUT);

pinMode(6,OUTPUT);

pinMode(7,OUTPUT);

pinMode(buz,OUTPUT);

pinMode(led_i,OUTPUT);

pinMode(led_d,OUTPUT);

}

void adelante () {

digitalWrite(4,LOW);

analogWrite(5,250);

analogWrite(6,250);

digitalWrite(7,LOW);

}

void led () { for (int i=1;i<20;i=i+1)

{

 

digitalWrite(led_d,HIGH);

delay(100);

digitalWrite(led_d,LOW); digitalWrite(led_i,HIGH);

delay(100);

digitalWrite(led_i,LOW);

}

Proyecto Profundiza. IES Cecilio Jiménez

}

void paro () {

digitalWrite(4,LOW);

digitalWrite(5,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

void gira_der () {

digitalWrite(4,LOW);

analogWrite(5,250);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

void gira_izq () {

digitalWrite(4,LOW);

digitalWrite(5,LOW);

analogWrite(6,250);

digitalWrite(7,LOW);

}

void aviso() {

tone(buz,880,200);

delay(200);

noTone(buz);

}

void tonosalida() {

for (int i=1;i<3;i++)

{

tone(buz,784,200);

delay(200);

noTone(buz);

delay(200);

}

tone(buz,1568,400);

delay(400);

noTone(buz);

}

void loop () { tiempo=millis(); if(tiempo<5) {

delay(2000);

tonosalida();

delay(1000);

}

Proyecto Profundiza. IES Cecilio Jiménez

int valorsensor_i = analogRead(0); int valorsensor_d = analogRead(1); digitalWrite(led_i,HIGH); digitalWrite(led_d,HIGH);

if (valorsensor_i<500 && valorsensor_d<500)

{

adelante();

}

if (valorsensor_i>500 && valorsensor_d<500)

{

gira_izq();

}

if (valorsensor_i<500 && valorsensor_d>500)

{

gira_der();

}

if ((valorsensor_i>500 && valorsensor_d>500) && contador<vueltas)

{

paro();

aviso();

adelante();

if(contador!=vueltas-1) {

delay(50);

}

contador++;

}

if ((valorsensor_i>500 && valorsensor_d>500) && contador==vueltas)

{

paro(); for(int i=1;i<4;i++) { aviso();

delay(100);

}

led();

}

}

El seguimiento de la línea del robot puede mejorarse mediante un control por PID (Proporcional Integrador Derivativo). En esta experiencia, la implementación de esta variante de control escapa a los objetivos del proyecto y a las posibilidades de comprensión para el nivel del alumnado al que va dirigido. Pero es una buena vía de investigación y mejora del proyecto. Su estudio conlleva el empleo de técnicas avanzadas de programación.

Proyecto Profundiza. IES Cecilio Jiménez

12. IMÁGENES Y RESULTADOS FINALES

El siguiente robot es un experiencia del profesor surgida a raíz del desarrollo del proyecto.

Dispone de un sónar de distancias montado sobre un servo, un barra de 10 leds conectados a un expansor de puertos por i2c, 6 sensores infrarrojos, brújula electrónica en bus i2c, conector para el control mediante el mando nunchuk de la consola wii, dos pulsadores, un display serie 16x2 caracteres, un piezo buzzer, dos led azules de alta intensidad y dos interruptores para el robot y el display, control por PID.

Vista lateral derecha
Vista lateral derecha
Detalle del chip puente H
Detalle del chip puente H
Vista lateral izquierda
Vista lateral izquierda
Detalle de las conexiones a Arduino
Detalle de las conexiones a Arduino
Detalle de los sensores
Detalle de los sensores
Montaje del motor en su soporte
Montaje del motor en su soporte