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:
- Buscar un diseño 3D del chasis, adecuado para la idea
de robot que queremos realizar.Aunque puedes escoger el que desees, si
tienens poco tiempo y optas por esta alternativa, te proponemos Villabot3 (la versión Villabot3
es la última, aunque Villabot2
también puedes obtenerlo)
- Diseñar tú mismo el chasis y el resto de piezas,
empezando desde cero o partiendo de algún diseño obtenido de internet
- Adquirir
un chasis que pueda servir para incorporar las piezas requeridas. En
este caso podemos sugerirte varias opciones interesantes:
|
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)
|
- Obtener el chasis impreso.
|
- Colocar la bola loca y situar las tuercas en sus
posiciones.
|
- Darle la vuelta al chasis y atornillar la placa de
Arduino, usando sólo tres tornillos, los que no chocan con los
componentes.
|
|
- 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.
|
|
- Dar la vuelta de nuevo a la placa. Situar los motores
DC en su posición y atornillarlos.
|
|
- Colocar las ruedas en los ejes.
|
|
- Preparar la carcasa de Sensores. Situar
el sensor de ultrasonidos HC-SR04 en primer lugar
|
|
- Colocar los cables en los terminales y colocar los
sensores CNY70 en sus huecos correspondientes.
|
- 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.
|
- Sólo quedaría, si se desea, situar el soporte
para la miniboard, (o las miniboard, si se colocan dos).
|
- De este modo queda ya terminado el montaje de las
piezas de Villabot3, a falta de realizar las conexiones de los
componentes.
|
|
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:
- En primer lugar creamos las variables MotorD y MotorI
- Tenemos que asignarles un valor al principio del
programa. Como hemos decidido previamente:
- MotorD será el PIN 5
- MotorI será el PIN
6
- Ahora vamos a crear uno de los bloques. Esto se hace,
al igual que con Scratch, con la opción de "Crear un Bloque"
- Tenemos que asignarle un nombre
- Y definimos las órdenes que lo componen
- Del mismo modo, definimos el resto de bloques que
vamos a usar:
- En el apartado Datos
y Bloques aparecerán todos los bloques que hayamos creado, que
quedarán disponibles para usarlos en nuestro programa:
- Ya podemos completar el programa, con la secuencia de
movimientos que queremos que ejecute el robot:
- 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:
- 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:
- A continuación podemos crear las Funciones que
necesitemos, que utilizan estos PINES:
- Una vez creadas las Funciones, podemos utilizarlas en
la sección "Repetir", creando
la secuencia que deseemos
- La pantalla de Visualino nos muestra tanto el
programa como las funciones definidas:
|
Instrucciones: |
- Monta el circuito
- Crea el programa en
Arduino, mBlock o Visualino
- 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.
- ¿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: |
- Crea junto con tus
compañeros un circuito con cajas. Procura que el recorrido tenga giros en ambas
direcciones.
- Diseña el programa
para que tu
robot recorra el circuito en el menor tiempo posible.
- ¿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: |
- Monta el circuito
- Crea el programa en
Arduino, mBlock o Visualino
- 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: |
- Monta el circuito
- Crea el programa en
mBlock, Arduino o Visualino
- 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: |
- Monta
el circuito
- Modifica el programa anterior en
mBlock, Arduino o Visualino, para obtener el resultado deseado
- Comprueba su
funcionamiento ¿Qué ocurre al acercarse el robot a un obstáculo?
- Construye un Laberinto y sitúa al robot en
su interior, para ver cómo es su comportamiento:
- 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: |
- Usa
el montaje de la práctica anterior
- Introduce las novedades en el programa
anterior para conseguir el efecto esperado
- Comprueba su
funcionamiento
- y sitúa el robot en el laberinto,
para ver si hay mejoras en el tiempo que tarda en recorrerlo.
- 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.
|
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: |
- Realiza
uno de los dos montajes propuestos
- Escribe el programa en mBlock
- 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: |
- Realiza
el montaje propuesto
- 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
|
|
|
- Básate
en esta tabla de Verdad para realizar el programa, de forma
similar a como se hizo en la práctica anterior.
- Comprueba que su
funcionamiento es correcto. Si no funciona como debiera, verifica que
el orden de las conexiones es el adecuado.
- Realiza un circuito de prueba y observa cómo
evoluciona el robot. Puedes tomar como modelo el siguiente:
|
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:
- Cada robot partirá
de un punto equidistante de la pista (está marcado en el diseño)
- Otro compañero o el profesor darán una señal de
salida, empezando entonces la carrera.
- 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.
- 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:
( 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:
- El robot debe seguir
una línea negra
- La línea negra, cada cierto tiempo se bifurca en 2,
con el mismo ángulo, una hacia la derecha y otra hacia la izquierda.
- 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:
- 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:
Circuito propuesto para practicar las bifurcaciones ( PDF de
tamaño real):
( 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:
- 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.
- Habrá dos robots
evolucionando por la pista.
- 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:
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:
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:
- El robot avanzará por el circuito siguiente siguiendo la línea negra.
- 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.
- 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.
- 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.
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:
|
|