Libro



CURSO DE ARDUINO 5

Seguimos conociendo las posibilidades de la placa de Arduino.  Recuerda que puedes acceder a la web deArduino a través de la dirección: www.arduino.cc
Para realizar las prácticas con Arduino necesitamos el material electrónico que se  describe en la siguiente LISTA DE MATERIALES.
Muchas webs ofrecen circuitos y programas para experimentar con Arduino. Una de ellas, de la que hemos obtenido información es: www.fritzing.org siendo muy recomendable el programa libre Fritzing, que puede descargarse desde su web y que hemos utilizado para los diseños de circuitos con placa de prototipos. Este programa permite diseñar circuitos mediante placa de prototipos, obteniendo a la vez su esquema y pudiendo usar el diseño para crear una placa PCB (placa de circuito impreso) que puede fabricarse a partir del modelo resultante, e incluso encargarse a la web de Fritzing para que ellos lo fabriquen (previo pago en este caso, claro). También es muy interesante el KIT Fritzing basado en Arduino, pues contiene casi todo el material que se necesita para las prácticas propuestas.
Como en todos los capítulos, la idea del curso y los archivos de video han sido obtenidos de www.miriadax.net, de un curso de Xnergic-TecnoCampusMataró (TCM) dirigido y presentado por Marco Antonio Rodríguez, al cual agradecemos calurosamente su esfuerzo.

Simuladores de Arduino

SCRATCH
Se recomienda ver todos los videos en PANTALLA COMPLETA y usar unos AURICULARES. Los videos imprescindibles para realizar el curso se marcan con una tabla con fondo Naranja. Los ejercicios aparecen en color Verde.

PROYECTO CON ARDUINO

ROBOT CONTROLADO POR ARDUINO
DESCRIPCIÓN DEL PROYECTO

  • Se trata de diseñar y construir un robot que consiste en un móvil que se desplaza en función de la información que recibe de diversos sensores:
    • Sensor (o sensores) de infrarrojos tipo CNY70: Por ejemplo, Haciendo que el robot siga una línea de color negro sobre una pista de color blanco (o claro)
    • Sensor de ultrasonidos tipo HC-SR04: Como puede ser, evitando chocarse con obstáculos que se presenten durante el recorrido.
    • Sensor (o sensores) de luminosidad tipo LDR: Una de cuyas aplicaciones puede ser guiarse en su recorrido por una linterna, siguiendo el haz de luz cuando el robot pierda otro tipo de referencia.
  • Debe utilizarse al menos dos tipos de los sensores anteriores (o los tres), combinados, para obtener un funcionamiento lógico.
  • El movimiento del robot se conseguirá mediante:
    • Dos motores DC con reductora, con lo cual es necesario utilizar un driver de motores tipo L298N o bien L293D
    • También se puede usar dos servomotores de rotación continua, con lo cual no sera necesario el Driver de motores.
  • Para la programación del robot puede utilizarse cualquiera de las aplicaciones estudiadas: IDE de Arduino, Visualino o mBlock.
  • Se diseñará el chasis del robot mediante software de diseño 3D, obteniendo un archivo STL adecuado para ser impreso en una impresora 3D con tamaño máximo de 150x150mm. Para el diseño hay que tener en cuenta que:
    • El robot debe funcionar de modo autónomo, es decir, sin estar conectado al ordenador mediante un cable ni usando bluetooth o cualquier medio de transmisión de datos.
    • Por este motivo, todos los elementos que necesite debe llevarlos consigo en el chasis: placa Arduino, motores, sensores, driver, pilas, rueda loca para poder girar libremente, placa board,...
  • El robot participará en una competición con otros robots, en la que se valorará que termine un recorrido con líneas y obstáculos en el menor tiempo posible.

EL CHASIS DEL ROBOT: VILLABOT


Lo primero que tenemos que tener en cuenta para el chasis es que debe incorporar todos los elementos que podría a ser necesario llevar incorporado: placa de Arduino, Pila de 9V, motores DC, en cuyo caso sería necesaria una placa tipo Driver como la L298N.
Podría buscarse en internet un modelo que cumpliera todas las espectativas o intentar diseñar uno mediante un programa de edición 3D, diseño que debería imprimirse en una impresora 3D.
Desde el departamento de Tecnología de nuestro centro hemos diseñado un chasis que cumple con todos los requerimientos que se han descrito:
  • Su tamaño es reducido, pudiendo ser impreso en una impresora 3D de 150x150mm
  • Está diseñado para incorporar una placa de Arduino, un driver de motores L298N, dos motores DC con reductora en línea y dos ruedas de goma, una pila de 9V y una rueda loca.
  • También se ha previsto una pieza frontal que permita incorporar dos sensores CNY70 (de infrarrojos) y un sensor de ultrasonidos tipo HC-SR04.
  • Tiene orificios en la parte trasera para atornillar un portapilas de 5 pilas R3, si se considera necesario para separar la alimentación de Arduino de la de los motores.
  • Además tiene una tapa que puede situarse sobre Arduino, donde puede colocarse un par de mini-tableros board para realizar montajes auxiliares, que pueden incluir por ejemplo dos sensores LDR o un módulo Bluetooth para manejar el robot desde una aplicación móvil.
  • Se ha añadido una base para separar Arduino del posible contacto con los tornillos de la rueda loca que, en el último diseño, está situada debajo.
El diseño se ha realizado en Tinkercad, y es público, de modo que puede descargarse para su uso y modificación, basta buscar el modelo llamado Villabot3.

Asímismo, los archivos STL para la impresión 3D están alojados en la web de Thingiverse como aportación a la comunidad. En dicha web pueden descargarse las  distintas versiones y observar fotografías y explicaciones buscando también el modelo llamado Villabot.

VILLABOT
PIEZAS BÁSICAS:
(Puedes descargar los archivos STL pinchando en la fotografía)
Chasis:

Carcasa de sensores:
Soporte de 2 mini-board:
*REFERENCIAS*
En cualquier caso, es necesario indicar que el modelo es una adaptación de varias ideas que se han recogido en distintos lugares:




6.1
. CONSEGUIR UN DISEÑO DEL CHASIS

6.1. CONSEGUIR UN DISEÑO DEL CHASIS
En esta actividad debes optar por alguna de estas opciones:



6.2. MONTAJE DEL ROBOT

6.2. MONTAJE DEL ROBOT:
(VILLABOT)

Una vez conseguido el chasis, hay que realizar el montaje de las distintas piezas.

Si has escogido VillaBot puedes seguir estas instrucciones de montaje:


PROCESO DE MONTAJE:

(En este PDF puedes ver el Material necesario para el Montaje de Villabot)

  1. Obtener el chasis impreso.

  1. Colocar la bola loca y situar las tuercas en sus posiciones.
  1. Darle la vuelta al chasis y atornillar la placa de Arduino, usando sólo tres tornillos, los que no chocan con los componentes.


  1. Atornillar también la placa del controlador de motores L298N. Es suficiente colocar dos tornillos en diagonal, aunque el diseño permite poner hasta tres.

  1. Dar la vuelta de nuevo a la placa. Situar los motores DC en su posición y atornillarlos.
  1. Colocar las ruedas en los ejes.
  1. Preparar la carcasa  de  Sensores. Situar el sensor de ultrasonidos HC-SR04 en primer lugar
  1. Colocar los cables en los terminales y colocar los sensores CNY70 en sus huecos correspondientes.


  1. Atornillar la carcasa de sensores en la parte frontal.

Aquí se muestra el detalle de cómo quedan los sensores de infrarrojos, vistos desde abajo.
  1.  Sólo quedaría, si se desea, situar el soporte para la miniboard, (o las miniboard, si se colocan dos).



  1. De este modo queda ya terminado el montaje de las piezas de Villabot3, a falta de realizar las conexiones de los componentes.






EL FUNCIONAMIENTO DEL ROBOT

Vamos a repasar algunos de los elementos que se necesita incluir en el proyecto:
EL MOVIMIENTO DE LOS MOTORES

Una vez montados los componentes del robot, estudiaremos los movimientos que va a hacer el robot y cómo vamos a conseguirlos con los elementos de los que disponemos. Basándonos en el diseño de Villabot tenemos los siguientes componentes que afectan al movimiento:
    • Una placa de Arduino para controlar el movimiento
    • Dos motores DC con reductora
    • Un Driver de motores tipo L298N (equivalente al L293D)
    • Posibilidad de utilizar una pila común o dos baterías independientes para Arduino y para el bloque de motores.
    • Una rueda loca para permitir el giro con dos  motores
Teniendo en cuenta esto, podemos optar por distintas configuraciones de conexión de los motores:
    • Motores conectados en modo Directo
    • Modo Inverso
    • Modo Push-Pull
Y por último, decidir cómo se realizarán los movimientos a derecha e izquierda del robot:
    • El robot trazará una curva si un motor está activo y el otro está parado. Esto produce un ángulo de giro más abierto.
    • El robot trazará una curva si un motor avanza mientras el otro retrocede. El ángulo de giro será más cerrado en este caso. Esto sólo puede hacerse en modo Push-pull, ya que permite cambiar el sentido de giro.
Para empezar por el caso más simple, nuestro criterio va a ser el siguiente:
  • Utilizaremos dos motores DC conectados en modo Directo.
  • El giro del robot se producirá cuando un motor avance y el otro esté parado.
  • El robot podrá avanzar, pararse y girar a derecha o a izquierda, pero no ir hacia atrás, ya que el modo directo no permite invertir el sentido de giro de los motores.


6.3
.A. CONTROL DEL MOVIMIENTO DEL ROBOT CON 2 MOTORES DC EN MODO DIRECTO

6.3.A. CONTROL DEL MOVIMIENTO DEL ROBOT CON 2 MOTORES DC EN MODO DIRECTO
Montaje:

L298N con 2 Motores DC en modo  Directo:


Los motores no se conectan a Arduino directamente, sino que se hace a través del Driver L298N, que nos proporciona la potencia suficiente de forma independiente de Arduino, evitando sobrecargar a éste.
Para controlar los motores, el L298N tiene 4 tomas:
  • IN1 e IN2 para el motor Izquierdo
  • IN3 e IN4 para el motor Derecho
Estas dos tomas están pensadas para una conexión Push-Pull, pero como vamos a usar conexión Directa, sólo necesitamos una para cada motor, habiendo escogido:
  • IN2 conectada al PIN#6  para el motor Izquierdo y
  • IN3 conectada al PIN#5  para el motor Derecho

Programa para Arduino:

Como novedad, en lugar de incluir los movimientos de los motores en el programa principal, hemos creado unas funciones aparte donde almacenaremos las órdenes necesarias para cada movimiento. Esto se realiza con el comando void NOMBRE_de_la_FUNCION()y hay que ponerlo como mínimo dos veces:
  • Una vez para Declarar la función.
    • Por ejemplo void GiroDerecha();
  • Una segunda vez, para Definir la función, es decir, indicar qué órdenes la componen.
    • Por ejemplo void GiroDerecha() {digitalWrite(5,LOW);digitalWrite(6,HIGH);}


Una vez creadas las nuevas funciones, pueden utilizarse en la zona del bucle void loop(){...}

Por otra parte, es interesante resaltar que, en digitalWrite no vamos a usar directamente los valores de los PINES digitales que estamos usando (5 y 6), sino que hemos creado al principio del programa unas variables para guardar este dato. La ventaja de esto es que si, por la razón que sea, deseamos cambiar en el circuito la posición de los pines que controlarán los motores, basta con cambiar al principio del programa la asignación de pines en la definición de variables globales:
int MotorD = 5;
int MotorI = 6;



Programa para mBlock:

En mBlock también podemos definir variables y Funciones, que en este caso se llaman Bloques. Todo ello se hace en el apartado Datos y Bloques:
  1. En primer lugar creamos las variables MotorD y MotorI
  2. Tenemos que asignarles un valor al principio del programa. Como hemos decidido previamente:
    • MotorD será el PIN 5
    • MotorI será el PIN 6
  3. Ahora vamos a crear uno de los bloques. Esto se hace, al igual que con Scratch, con la opción de "Crear un Bloque"
  4. Tenemos que asignarle un nombre
  5. Y definimos las órdenes que lo componen
  6. Del mismo modo, definimos el resto de bloques que vamos a usar:
  7. En el apartado  Datos y Bloques aparecerán todos los bloques que hayamos creado, que quedarán disponibles para usarlos en  nuestro programa:
  8. Ya podemos completar el programa, con la secuencia de movimientos que queremos que ejecute el robot:
  9. El aspecto completo de la pantalla de trabajo mostrará tanto el programa como los bloques definidos:



Programa para Visualino:

En Visualino existe también una opción para crear funciones que agrupen varias órdenes. Hay dos tipos:
  • Funciones con retorno. Cuando el objetivo de la función es obtener un dato, como por ejemplo, la lectura en el monitor serie o una operación matemática:
  • Funciones sin retorno: La función es simplemente un conjunto de órdenes que se agrupan para no tener que repetirlas cada vez que se usan:
En nuestro caso, para el control de los motores vamos a usar Funciones sin retorno:

  1. Aunque esto no es obligatorio para crear la función, vamos a utilizar dos variables para indicar el Número de PIN desde el que controlaremos cada motor:
    • el MotorD en el PIN5
    • y el MotorI en el PIN6.
Esto tiene la ventaja de que si necesitamos cambiar la asignación de PINES, no hay que cambiar todos los sitios del programa donde aparecen estos PINES. Los cambiaríamos sólamente en esta declaración de variables inicial sólamente:
  1. A continuación podemos crear las Funciones que necesitemos, que utilizan estos PINES:
  2. Una vez creadas las Funciones, podemos utilizarlas en la sección "Repetir", creando la secuencia que deseemos
  3. La pantalla de Visualino nos muestra tanto el programa como las funciones definidas:

Instrucciones:
  1. Monta  el circuito
  2. Crea el programa en Arduino, mBlock o Visualino
  3. Comprueba que funciona correctamente. Si es necesario Realiza los ajustes necesarios al circuito o al programa para que funcione adecuadamente:
    • Avance
    • Giro a Derecha
    • Giro a Izquierda y
    • Parada correctos.
  4. ¿Qué ocurre si en lugar de conectar el PIN#11 al IN1 del Driver L298N lo conectamos a IN2?


6.3.B. INTERRUPTOR DE INICIO DEL PROGRAMA
6.3.B. INTERRUPTOR DE INICIO DEL PROGRAMA
Vamos a mejorar el circuito anterior, incorporando un interruptor que nos permita:
  • Hacer que el robot esté parado, mientras el interruptor esté abierto
  • Que el ciclo comience en un momento concreto, pudiendo de esta forma situar al robot en un punto de "salida"



6.3.C. TRAZADO DE UN RECORRIDO EN FORMA DE 8
6.3.C. RECORRIDO EN FORMA DE 8
Instrucciones: Usando el circuito anterior, programa al robot para que haga un recorrido en forma de 8 en torno a las patas de una de las mesas del taller:



6.3.D. PROGRAMACIÓN DE UN RECORRIDO POR UN CIRCUITO
6.3.D. RECORRIDO POR UN CIRCUITO
Instrucciones:
  1. Crea junto con tus compañeros un circuito con cajas. Procura que el recorrido tenga giros en ambas direcciones.
  2. Diseña el programa para que tu robot recorra el circuito en el menor tiempo posible.

  1. ¿Qué ocurre si cambias de posición alguna de las piezas del laberinto?




DE AUTOMATISMO A ROBOT: LA REALIMENTACIÓN
Este tipo de programas es típico de lo que se conoce como automatismo: Un sistema que sigue una secuencia de instrucciones dada, pero no es capaz de reaccionar a un cambio en el entorno.
Un paso más en la programación será crear un móvil que sea capaz de moverse en un entorno cambiante o desconocido, reaccionando a los obstáculos que se encuentra. ¿Y ésto como se consigue? Pues dotando al móvil de algún tipo de sensor que le permita detectar información del entorno y reaccionar en consecuencia. Esta captación de la información externa para actuar en consecuencia es lo que se conoce como realimentación, y es una característica fundamental para que un móvil se considere un Robot.

Vamos a estudiar diversos sensores que nos pueden permitir utilizar esta realimentación para el control de nuestro robot:
SENSOR DE ULTRASONIDOS HC-SR04
Este dispositivo emite ondas de ultrasonidos (ondas acústicas cuya frecuencia está por encima de la capacidad de audición del oído humano (por encima de 20000 Hz).
 
En función del tiempo que tarde en recibir la onda reflejada (Eco) se puede calcular la distancia hasta el obstáculo situado frente a él.




FUNCIONAMIENTO DEL SENSOR DE ULTRASONIDOS HC-SR04 (Observar la gráfica adjunta):

(pulsar en la imagen para ver en grande)


  • Se resetea el Transmisor poniendo el PIN Trigger a nivel bajo (LOW) durante 4us (4 microsegundos)
  • Se "dispara" el Transmisor aplicando al PIN Trigger un pulso de valor alto (HIGH) durante 10us (10 microsegundos)
  • El Transmisor, al ser disparado, crea una señal ultrasónica de 8 pulsos (Onda Original)
  • El Receptor queda a la espera de recibir la Onda Reflejada (Echo)
  • El PIN Echo genera un pulso de nivel alto (HIGH) y duración prolongada... hasta que se recibe el Echo.
  • Cuando se recibe el Echo en el Receptor, el PIN Echo vuelve a ponerse a nivel bajo (LOW).
    • De este modo, la duración del pulso que ha producido depende del tiempo que ha tardado en recibirse la señal y por tanto es proporcional a la distancia a la que está el objeto.
    • La duración del pulso puede variar entre 100us y 25ms (25 milisegundos, o sea, 25000 microsegundos). 
    • Si no se detecta objeto, el pulso se interrumpe pasados 36ms
  • Hay que dejar un tiempo mínimo de10ms antes de volver a emitir un disparo por el Trigger. Como mínimo deberían pasar 29ms entre un disparo y otro. Para evitar interferencias y dar tiempo suficiente a todo el proceso, se disparará el Trigger, como mucho cada 60ms
En la siguiente gráfica simplificada, se muestra sólo las señales que nos interesan, que son las que nosotros  podemos manejar:
  • La que hay que emitir por el PIN Trigger (en azul)
  • y las que se reciben por el PIN Echo (en naranja)
(pulsar en la imagen para ver en grande)


CÁLCULO DE LA DISTANCIA HASTA EL OBJETO:
(Información tomada de la web de Luis Llamas)
Sabemos que la velocidad del sonido es de 343 m/s en condiciones de temperatura 20º, 50% de humedad y presión a nivel del mar. Si transformamos unidades resulta:


Es decir, el sonido tarda 29,2 microsegundos en recorrer un centímetro. Por tanto, podemos obtener la distancia a partir del tiempo entre la emisión y la recepción del pulso mediante la siguiente ecuación:


El motivo de dividir por dos el tiempo es porque la medida que hemos obtenido corresponde a lo que tarda el ultrasonido en ir y volver del obstáculo, por lo que la distancia recorrida resultante es el doble de la que queremos medir:


RESUMEN HC-SR04
En la gráfica siguiente aparece un resumen de los aspectos básicos del control del HC-SR04 y la medida de la distancia:



6.4
.A. REALIZAR UN MEDIDOR DE DISTANCIA con Arduino. Vamos a utilizar para ello el sensor de ultrasonidos HC-SR04.

6.4.A. MEDIDOR DE DISTANCIA con HC-SR04
Esquema:
Hemos utilizado el PIN#13 para el Trigger (Transmisor)
y el PIN#12 para el Echo (Receptor)
Proto-Board:
Es el mismo montaje anterior, tal como quedaría mediante una placa board.
No es necesario que los PINES usados para Trigger o Echo sean PWM, podría usarse cualquier PIN Digital.


Programa para Arduino:


A lo largo del programa se ofrece la explicación del mismo.

Como se ve, se trata de manejar las señales en los PINES 13 (Trigger) y 12 (Echo) de la forma que se ha explicado más arriba.


Programa para mBlock:


Como se ve, el programa resulta mucho más simple. Sólo se necesita hacer referencia a los PINES a los que se conecta el sensor de ultrasonidos.
Esto es así porque al incluir el bloque que lee el sensor ultrasónico, se genera automáticamente el programa de Arduino que emite y recibe las ondas que controlan el HC-SR04 mediante los PINES indicados:

Además, al utilizar este bloque, también se calcula automáticamente la distancia. Todo ello se  puede observar en el extracto  del programa de Arduino que se genera.


En definitiva, este bloque de mBlock nos proporciona directamente la Distancia al objeto, que podemos guardar en una variable y luego sacar este dato por el puerto serie.
Primero hay que crear la variable que vamos a usar
Y después completamos los bloques

Por último, se añade un tiempo de espera de 60ms (0.006 seg) para evitar la sobresaturación del HC-SR04, que se evidencia sino se pone este tiempo de espera, mediante un pitido que puede llegar a escucharse. Es posible que no se observe este efecto, como puede ocurrir si el programa incluya otras órdenes que hagan que Arduino permanezca opupado un tiempo antes de volver a disparar el HC-SR04. En este caso podría eliminarse este bloque de retardo:

Recuerda que, para leer la información del puerto Serie, conviene indicar "modo de caracteres":



Programa para Visualino:


Al igual que ocurre con mBlock, el programa en Visualino se simplifica enormemente, ya que al incluir el bloque "Sensor de Ultrasonidos", se genera automáticamente el programa que controla a dicho sensor:
Bloque que controla el Sensor de Ultrasonidos
Programa generado en código Arduino

El programa de Arduino incluye también el cálculo automático de la distancia (Distance).
Por tanto, al utilizar el bloque del Sensor de Ultrasonidos, obtenemos directamente el valor de la Distancia. Es conveniente crear una variable para almacenar el dato de la distancia. En este caso se utiliza un tipo de variable denomidado long o Entero largo:

A esta variable se le asigna directamente el valor obtenido en el sensor de ultrasonidos:


Para visualizar la lectura por el puerto serie, se construye una frase con el texto "Distancia: " y el valor de la variable Distancia:


Finalmente, si se satura el sensor de ultrasonidos (lo cual puede evidenciarse si se escucha un pitido), se puede añadir un bloque para detener el programa durante 60ms. Si el programa es más complejo y no llega a saturarse el sensor, puede eliminarse este bloque:

Instrucciones:
  1. Monta  el circuito
  2. Crea el programa en Arduino, mBlock o Visualino
  3. Comprueba su funcionamiento
    • ¿Cuál es la máxima distancia que es capaz de detectarse?
    • ¿Cuál es la mínima distancia que puede leer de forma correcta?



6.4.B
. PROGRAMA CONDICIONAL: Ilumina un LED VERDE o uno ROJO según la distancia al objeto.

6.4.B.. CONDICIONAL: Ilumina un LED VERDE o uno ROJO según la distancia al objeto.
Utilizando el mismo montaje anterior, vamos a ampliar el programa de modo que en función de la lectura de la distancia del sensor HC-SR04 el programa actúe de una forma u otra.
Para ello utilizaremos los condicionales.
Esquema:
Hemos utilizado de nuevo el
  • PIN#13 para el Trigger y el
  • PIN#12 para el Echo.
Montaje:

Como se ve en el circuito, utilizamos la placa board,. que irá situada en el soporte correspondiente del robot, y el sensor HC-SR04 conectado con latiguillos, ya que su ubicación es en la parte frontal del robot.
La masa (GND) es común, pudiendo usar tomas distintas de Arduino o usando la placa board para centralizar la masa.


Programa para mBlock:


Vamos a ver la versión para mBlock. Nos hemos basado en el programa anterior pero realizando los cambios siguientes:
  • Hemos eliminado la parte de sacar el dato por el Monitor Serie
  • En su lugar hemos añadido una orden condicional del tipo SI...(ocurre tal cosa)...(haz esto) SI.NO...(haz esto otro)
  • En cada uno de los casos hemos hecho que se encienda un led u otro
  • Además, se ha aumentado el tiempo de espera a 100mseg (0.1 seg) para evitar ruido excesivo en la lectura del sensor ultrasónico.
Si queremos ver la versión del código para Arduino, no es necesario hacer correr el programa. Basta escoger la opción Editar -> Modo Arduino para que aparezca el código correspondiente



Programa para Visualino:


Esta es la versión de Visualino. Fijándonos en el programa anterior pero cambiando los siguentes elementos:
  • Eliminamos las órdenes que escribían el valor de la Distancia en el Monitor Serie.
  • Añadimos una orden condicional del tipo SI...(ocurre tal cosa)...EJECUTA...(esto)...EN CASO CONTRARIO...(haz esto otro)
Como observarás, en Visualino sólo aparece la orden Si...Ejecutar...
Para conseguir que esta orden incluya la opción de ejecutar algo distinto si no se cumple, tenemos que pinchar en el asterisco
Escoger entre las opciones que se despliegan en el "bocadillo" la orden "de lo contrario"
Y añadirla junto a la cabecera "si" que aparece a la derecha, en el mismo "bocadillo".
Ahora, podemos hacer click de nuevo en el asterisco para ocultar el "bocadillo" y, como vemos, al hacer esto, la orden original aparece completada con el nuevo añadido:


Una vez preparada la orden SI...DE LO CONTRARIO... realizamos los añadidos siguientes:
  • En cada uno de los casos hemos hecho que se encienda un led u otro
  • Además, se ha aumentado el tiempo de espera a 100mseg (0.1 seg) para evitar un ruido continuo en la lectura del sensor ultrasónico.



Programa para Arduino:


El programa utiliza el control de las entradas del sensor de ultrasonidos como se vió en la práctica anterior.
El principal cambio respecto el programa anterior es que no se calcula la Distancia. ¿Por qué no? En realidad podría hacerse pero no es necesario, porque consumiría espacio y memoria en Arduino ¿Qué se hace entonces para saber si el objeto está a distancia mayor o menor de 10cm? Como hemos visto cuando se expuso el funcionamiento del sensor HC-SR04, la distancia se calcula en función de la duración del pulso en el PIN Echo:

Para calcular la distancia se divide el pulso por 58 (aproximadamente)
Por tanto, el Echo que corresponde a una distancia de 10cm es de 10*58 = 580 microsegundos (useg)






Para indicar que se encienda un LED u otro, en función de la distancia al objeto, se usa la orden:
if (condición) {...órdenes...}   que significa que, si se cumple la condición, se ejecuten unas órdenes.
este comando se completa con su complementario:
else {...órdenes...} que indica que, si no se cumplen las condiciones anteriores, se ejecute otras instrucciones.

Por otra parte, se ha aumentado a 100mseg el tiempo de espera hasta volver a lanzar un pulso por el módulo de ultrasonidos, debido a que se ha comprobado que se producía un ruido continuo en este sensor.


Instrucciones:
  1. Monta el circuito
  2. Crea el programa en mBlock, Arduino o Visualino
  3. Comprueba su funcionamiento
    • ¿Qué ocurre al acercar un objeto al sensor?
    • ¿Y al alejarlo?



6.4.C
. MOVIMIENTO CONDICIONAL: Cambio de dirección si se detecta un obstáculo.
6.4.C. CONDICIONAL: Cambio de dirección si se detecta un obstáculo.
Vamos a utilizar la información que aporta el sensor de ultrasonidos HC-SR04 para hacer que un robot modifique su movimiento si detecta obstáculos en frente.
Montaje: (pincha en la imagen para verla más grande)

Programa: En el programa anterior se encendía un LED Rojo si se detectaba un objeto a menos de 10cmm y un LED Verde en caso contrario.
Ahora vamos a modificar el programa para que haga lo siguiente:
  • El robot avanzará normalmente
  • Cuando se detecte un obstáculo a menos de 10 cm, el robot debe girar. Al no disponer de más datos, en principio escogemos siempre la misma dirección de giro: a la derecha.
Instrucciones:
  1. Monta  el circuito
  2. Modifica el programa anterior en mBlock, Arduino o Visualino, para obtener el resultado deseado
  3. Comprueba su funcionamiento ¿Qué ocurre al acercarse el robot a un obstáculo?
  4. Construye un Laberinto y sitúa al robot en su interior, para ver cómo es su comportamiento:

  1. Ajusta el funcionamiento del robot si es necesario para el correcto trazado de las rectas y curvas, por ejemplo:
    • Si el ángulo de giro quedara corto, puedes ajustarlo añadiendo un tiempo de espera tras la orden de hace girar al robot.
    • Si el robot no avanza en línea recta modifica el valor PWM que se envía a cada motor.



6.4.D. MOVIMIENTO CONDICIONAL Y ALEATORIO: El robot cambiará su dirección al detectar un obstáculo, pero no siempre escogerá el mismo sentido de giro.
6.4.D. MOVIMIENTO CONDICIONAL Y ALEATORIO
En el montaje anterior decidimos que, al detectar un obstáculo, el robot girase siempre a la derecha. Ahora esa decisión se hará de forma aleatoria; unas veces el giro se hará a la derecha y otras a la izquierda.
Programa para mBlock:

  • Incluiremos una variable: GIRO que podrá tomar, aleatoriamente dos valores: 0 ó 1.
  • Para conseguirlo, usamos la orden que asigna un número aleatorio, entre 0 y 1:
  • Incluiremos estos dos elementos nuevos, junto con un condicional SI... entonces....  y SI NO... añadiendo las condiciones y órdenes necesarias para conseguir que:
    • cuando la distancia sea menor de 10cm:
      • unas veces gire  a la derecha
      • y otras gire a la izquierda

Instrucciones:
  1. Usa el montaje de la práctica anterior
  2. Introduce las novedades en el programa anterior para conseguir el efecto esperado
  3. Comprueba su funcionamiento
  4. y sitúa el robot en el laberinto, para ver si hay mejoras en el tiempo que tarda en recorrerlo.
  5. Puedes utilizar otros modelos de laberinto para realizar pruebas más complejas:








6.5.
SEGUIMIENTO DE UNA LÍNEA NEGRA

Se puede conseguir una mejora en la conducción del robot si hacemos que vaya siguiendo una línea trazada en el suelo. Dado que éste suele ser de color claro y más o menos reflectante, lo más fácil es pegar una banda de cinta aislante de color negro en el suelo haciendo un recorrido. Usando un sensor tipo CNY70 podemos detectar la diferencia entre las zonas claras y las oscuras, ya que las claras reflejarán la luz infrarroja que emite el sensor, incidiendo en el fototransistor que lleva incluido.

La explicación de las características y funcionamiento de este sensor ya se han estudiado en el apartado 4 anterior y pueden consultarse allí para afianzarse.


Inicialmente, la línea se va a realizar usando cinta aislante negra. La cinta estándar suele tener una anchura de unos 19mm, por tanto, no llega a los 2cm (20mm).

En nuestro robot Villabot vamos a utilizar dos sensores CNY70 para seguir la línea negra. Hay dos posibles formas de disponer los sensores:
  • Por el exterior de la línea negra
  • En el interior de la línea negra
En nuestro caso, colocaremos los sensores por el exterior, a ambos lados de la cinta aislante, por tanto, deben estar a una distancia de separación de unos 20mm. Para ello situaremos los sensores en la carcasa dejando dos huecos de separación entre ambos, lo que se corresponde con unos 2cm de distancia entre



Es conveniente situar los LED infrarrojos (ventana de color azulado) en posición de marcha, para que se detecte cuanto antes el cambio en la reflexión de la luz infrarroja cuando varíe el color de la superficie sobre la que están situados



Detalle de uno de los sensores CNY70 con los cables conectados en sus patillas:

Es conveniente echar unas gotas de pegamento térmico para evitar que los cables se suelten de las patillas. La ventaja de este pegamento es que fija lo suficiente los materiales pero es fácil de quitar si se desea.

Los sensores CNY70 se situarán en la carcasa dejando dos huecos entre medias, si queremos que la distancia entre ambos sea de 2cm. Los colocaremos preferiblemente con la "ventanilla azul" (que es donde está el fotodiodo) en la posición delantera, para detectar cuanto antes el cambio de color, dado que son los elementos que emiten la luz infrarroja que sirve para medir el cambio de color de la superficie.


Para que la posición sea correcta, los rótulos de CNY0 deben quedar hacia el interior.



Observa la posición del fotodiodo (la ventanita azul) en la parte frontal:






6.5.A. DETECCIÓN DE CINTA NEGRA: Efecto sobre un "Semáforo" de LEDS en función de la posición de la línea negra.
6.5.A. DETECCIÓN DE CINTA NEGRA: Efecto sobre un "Semáforo" de LEDS en función de la posición de la línea negra.
Inicialmente realizaremos un montaje de prueba para comprobar el funcionamiento de los sensores CNY70. Dispuestos los sensores CNY70 en la carcasa, habrá que conectarlos a la placa Board mediante extensiones de cables conectados a sus patillas.
Circuito: Se utilizan dos sensores CNY70 y 3 diodos LED de distintos colores para indicar diversos estados en la recepción de los sensores

Montaje:
pincha en la imagen para verla más grande


Montaje en Mini-Board: El siguiente montaje es el mismo que el anterior, pero realizado en placa Board tamaño "Mini", que es la que incorpora el diseño de Villabot. Esta placa no tiene línea de alimentación +/- por lo que hay que unir con cables los elementos que necesitan conectarse a los polos + y -
Bases del Programa:
La idea es que, en función de la posición de la línea negra, los LEDs se enciendan, indicando el estado de la forma siguiente:
  • Si ambos sensores CNY70 están sobre la superficie clara, se encenderá el LED verde
  • Si el sensor de la derecha está sobre la línea negra, se encenderá el LED rojo
  • Si el sensor de la izquierda está situado sobre la línea negra, se encenderá el LED naranja
  • Cuando ambos sensores estén sobre la línea negra, todos los LEDs estarán apagados


Es importante indicar que no basta con definir en el programa cuándo debe encenderse un LED, hay que decirle también cuándo debe estar apagado. Esto implica pensar en todas las situaciones posibles y definir el estado de los LEDs en todos los casos:








El problema principal es definir cuándo un sensor CNY70 detecta una línea negra. Al utilizar entradas Analógicas (A4 y A5) tenemos que definir el umbral a partir del cual se considera que la línea es negra o blanca. Para ello tenemos que fijarnos en el montaje que hemos propuesto para cada sensor CNY70 y la salida resultante del mismo:

  • Si CNY70 se sitúa sobre un color Negro, el fototransistor no recibe luz reflejada, por tanto no deja pasar la corriente y la entrada Analógica recibe un valor de tensión bajo (cercano a 0V).
  • En cambio, si CNY70 está sobre un color claro, el fototransistor sí recibe el reflejo de la luz del diodo infrarrojo. Por tanto, el fototransistor se activa, deja pasar la corriente y la entrada Analógica recibe un valor de tensión alto (cercano a 5V).
Teniendo en cuenta que las entradas analógicas tienen un margen de variación entre 0 (nivel bajo) y 1023 (nivel alto), podríamos considerar la siguiente regla para distinguir colores:
  • Si CNY70 detecta color Negro, entonces Entrada Analógica < 512 (nivel BAJO)
  • Si CNY70 detecta color Blanco, entonces Entrada Analógica > 512 (nivel ALTO)
Evidentemente, esto depende en parte del nivel de luz ambiental, de que la superficie sea o no reflectante o de que haya más o menos diferencia de color entre los colores blanco y negro utilizados, pero como primera aproximación puede valer. En todo caso se puede ajustar según las condiciones reales de la prueba. Uniendo toda la información aportada, puede realizarse la siguente "Tabla de Verdad", que servirá para realizar el programa:


Programa para mBlock:

El programa replica la "Tabla de Verdad" anterior. Como tenemos que unir varias condiciones, hacemos uso de los operadores lógicos "Y", "O" o "NO" que ofrece mBlock.
  • Operador "Y": En nuestro caso requerimos del operador "Y" porque queremos que el efecto deseado se produzca cuando coincidan ambas condiciones de las entradas analógicas (Cuando A5 Y A4 tengan el valor que indica la tabla).
  • Operador "O": Si quisiésemos que el efecto se produzca cuando se cumpla alguna de ambas condiciones (o ambas), usaríamos el operador "O" (Cuando A5 O A4 tengan el valor que indica la tabla)
  • Operador "NO": En el caso de que queramos que se produzca un efecto cuando NO se cumple una condición, usaríamos el operador NO (Cuando NO se cumpla la condición para A4, por ejemplo)
El programa a realizar debe tener un aspecto similar al mostrado a continuación:

Instrucciones:
  1. Realiza uno de los dos montajes propuestos
  2. Escribe el programa en mBlock
  3. Comprueba su funcionamiento. Si no funciona correctamente, verifica que las conexiones son correctas y están en el orden adecuado.




6.5.B. DETECCIÓN DE CINTA NEGRA: Giro en un sentido u otro en función de la posición respecto la línea negra.
6.5.B. DETECCIÓN DE CINTA NEGRA: Giro en un sentido u otro en función de la posición respecto la línea negra.
Basándonos en el circuito anterior, realizaremos las modificaciones necesarias para que, en lugar de encenderse un LED u otro, lo que ocurra es que el Robot AVANCE o GIRE, lo cual dependerá de que se active un motor, el otro o ambos. Todo ello ocurrirá en función de la información que recojan los sensores CNY70 acerca de la posición de la línea negra.
Circuito: Se utilizan dos sensores CNY70, Arduino y el Driver de motores L298N para controlar 2 motores DC que se conectan en configuración Directa.
Fíjate en que para conectar los motores DC en modo Directo, no es necesario conectar uno de sus bornes a GND (Masa, 0V) como ocurría con el L293D. Tampoco se conecta las entradas sobrantes IN1 e IN4 a GND, quedando al aire. El diseño de la placa L298N permite esto. Simplemente basta conectar cada motor a sus bornes adecuados y conectar sólo las entradas (IN1, IN2, IN3 o IN4) que vayamos a usar, para cambiar el modo de funcionamiento entre Directo, Inverso y Push-Pull.
En el diagrama se ha querido representar tambien que debe colocarse los jumpers en las entradas ENABLE (ENA y ENB), fijándolos a nivel alto (5V) para que así se activen los amplificadores correspondientes
Como en este caso estamos usando un Voltaje para el motor inferior a 12V, conectamos también el Jumper en la toma de +12V


Montaje: Las mismas características del circuito anterior se muestran en el montaje, que es igual al de la práctica anterior pero eliminando los LEDs y usando las salidas ~5 y ~6 para manejar los motores. Se ha utilizado la placa mini-board por ser la que incorpora el diseño de Villabot:


Bases del Programa: De forma similar al apartado anterior, hay que estudiar todas las posibles posiciones del robot respecto a la línea negra. Y en función de esta posición, debe moverse el motor derecho (MD), el Motor Izquierdo (MI) o ambos. Según qué motor gire, el robot avanzará, girará a izquierda o derecha, o se parará.
Instrucciones:
  1. Realiza el montaje propuesto
  2. Completa esta "Tabla de Verdad" con los estados de los CNY70 y el movimiento deseado de los motores:
NIVEL DE TENSIÓN EN LAS
ENTRADAS ANALÓGICAS
A LAS QUE SE CONECTAN LOS CNY70
ACTIVACIÓN DE LOS
MOTORES
(CONECTADOS A LAS SALIDAS DE ARDUINO)
Completar con: ON u OFF
A5
A4 MI (~6) MD (~5)
BAJO
BAJO


BAJO
ALTO


ALTO
BAJO


ALTO
ALTO


  1. Básate en esta tabla de Verdad  para realizar el programa, de forma similar a como se hizo en la práctica anterior.
  2. Comprueba que su funcionamiento es correcto. Si no funciona como debiera, verifica que el orden de las conexiones es el adecuado.
  3. Realiza un circuito de prueba y observa cómo evoluciona el robot. Puedes tomar como modelo el siguiente:

Circuito-ROBOT
Aquí puedes descargar el modelo en tamaño real (PDF), para imprimirlo en una lona. La anchura de la línea negra es de 19mm





6.6.
RETOS: Se trata de retos y competiciones de diseño y programación como las que se proponen a continuación:

6.6.A. CARRERA DE 2 SEGUIDORES DE LÍNEA
Usando un circuito similar al anterior, pero un poco más largo, se puede hacer una carrera que consiste en lo siguiente:
  1. Cada robot partirá de un punto equidistante de la pista (está marcado en el diseño)
  2. Otro compañero o el profesor darán una señal de salida, empezando entonces la carrera.
  3. Los robots empezarán a seguir la línea negra, de modo que el que tenga mejor diseño y programación, seguirá la línea negra con más velocidad.
  4. Ganará el robot (y el equipo que lo diseñó) que consiga lo siguiente:
    • Alcanzar al otro robot.
    • O bien el que, pasado un cierto número de vueltas (10 por ejemplo), se acerque más al otro robot.
El circuito propuesto es el siguiente, que puede descargarse a tamaño real en PDF para imprimir en una lona:
Circuito ROBOT línea 19mm
(La anchura de la línea negra es de 19mm)



6.6.B. CIRCUITO CON BIFURCACIONES
El siguiente circuito está diseñado para seguidores de línea, a los que se les plantea un reto más:
  1. El robot debe seguir una línea negra
  2. La línea negra, cada cierto tiempo se bifurca en 2, con el mismo ángulo, una hacia la derecha y otra hacia la izquierda.
  3. El programa se diseñará para que, si el robot encuentra una bifurcación, escoja uno de los caminos posibles (derecha o izquierda). El camino a escoger será siempre el mismo.
6.6.B2. AVANZADO:
  1. Como opción más avanzada, se puede hacer que se escoja cada vez una de las bifurcaciones. La primera a la derecha, la siguiente a la izquierda.
Ejemplo de bifurcación y la correspondiente decisión:
Bifurcación y elección

Circuito propuesto
para practicar las bifurcaciones (PDF de tamaño real):
Circuito Hexágonos
(La anchura de la línea es de 19mm)





6.7.SENSORES COMBINADOS: En los retos siguientes se trata de COMBINAR la información del SENSOR de PROXIMIDAD (ultrasonidos) y los DETECTORES DE LÍNEA (sensores de infrarrojos) en un PROGRAMA que supere el RETO planteado:

6.7.A. PISTA DE 2 AUTOS DE CHOQUE
El programa debe utilizar los datos que proporcionan los sensores CNY70 (que detectan la línea negra), con el valor de la distancia que proporciona el sensor HC-SR04 de forma combinada para conseguir lo siguiente:
  1. En lugar de seguir la  línea negra, cada robot avanzará por el interior del circuito SIN SALIRSE de la LÍNEA NEGRA. Es decir, el límite del movimiento es la línea negra.
  2. Habrá dos robots evolucionando por la pista.
  3. Si un robot se encuentra con el otro, debe reaccionar para no chocar con él.
El circuito siguiente se ha diseñado como pista para los 2 autos de choque. Puede descargarse a tamaño real en PDF para ser impreso en una lona:
Pista 2 autos de choque
Cada robot debe partir del interior de uno de los hexágonos.



6.7.B. PISTA DE 3 AUTOS DE CHOQUE
El mismo programa anterior puede utilizarse combinando 3 ROBOTS que evolucionan por EL INTERIOR de la pista tratando de NO CHOCAR uno con otro.
El circuito siguiente es adecuado para 3 robots. Aquí puedes descargarlo a tamaño real en PDF para ser impreso en una lona:
Pista 2 autos de choque
Cada robot debe partir del interior de uno de los 3 hexágonos de los extremos.



6.7.C. SEGUIDOR DE LINEA CON OBSTÁCULOS
En esta ocasión hay que combinar lo aprendido con el seguidor de línea cuando se enfrenta a caminos que se bifurcan, unido a la información que proporciona el sensor de distancia. Se trata de lograr superar el reto siguiente:
  1. El robot avanzará por el circuito siguiente siguiendo la línea negra.
  2. Existe una serie de bifurcaciones con el mismo ángulo a derecha e izquierda, de modo que cuando llegue a ese punto tendrá que escoger cuál de las dos seguir.
  3. Al principio de una de las bifurcaciones se situará un obstáculo de suficiente tamaño para que lo detecte el sensor de obstáculos HC-SR04.
  4. En el momento de llegar a la bifurcación debeá ser capaz de "leer" hacia un sentido u otro, detectando el camino que está libre de obstáculos, continuando entonces por el mismo.
Bifurcación con obstáculo

El circuito que se usará es el mismo del ejercicio 6.6.B. Puedes descargarlo aquí en tamaño real e imprimirlo. Como en todos los casos, el resultado debe ser una línea negra de unos 19mm de grosor.

A continuación se muestra un ejemplo en que se han situado unas cajas, a modo de obstáculos, para impedir que el robot tome ciertas bifurcaciones. Tal como están situadas las cajas, se espera que el robot siga el recorrido marcado con las flechas. Observa que unas veces el obstáculo está a la derecha y otras a la izquierda:
Circuito Hexágonos



Otros recursos:



arriba
libro