Receptor de infrarrojos


Estamos tan acostumbrados a los mandos a distancia infrarrojos que no dedicamos un momento a pensar en ellos y simplemente nos parece normal, algo que a nuestros abuelos les hubiera parecido magia.
Nos parece normal que los equipos electrónicos, televisores, cadenas de música, aires acondicionados, respondan a nuestras instrucciones sin levantarnos del sofá, pero esto no ha sido siempre así, es más, es relativamente reciente, que estos mandos se popularizaron.
Pero el concepto de la emisión y recepción de señales infrarrojas no es, ni mucho menos trivial, y exige tener nociones de ondas electromagnéticas (energía, frecuencia, longitud, etc...) que sobrepasan nuestro nivel. No obstante para aquellos que queráis profundizar más en el tema os recomiendo la excelente descripción del artículo de Prometec sobre sensores infrarrojos.

Un típico receptor de infrarrojos, es el AX-1838HS, que se consigue por poco más de unos euros. En su hoja de normas encontráis este diagrama, y son relativamente fáciles de encontrar, en dos formas. Independientes y montados en un soporte para utilizar sin complicaciones con nuestros Duinos. 





El esquema de conexión nuevamente es trivial, pues el AX-1838HS solo tiene 3 pines: Vcc, GND y señal.

El objetivo de este ejercicio es aprender a recibir señales infrarrojas mediante un sensor/receptor IR emitidas por un mando a distancia de infrarrojo.

Circuito eléctrico



Con lo que bastará con conectar la patilla GND al pin GND de Arduino, la patilla VCC al pin 5V de Arduino y la patilla DAT (señal) a cualquier salida digital de Arduino, en nuestro caso, lo haremos al pin digital 9.

Ejemplos de código
Existen múltiples librerías para emplear mandos a distancia con Arduino. Nosotros usaremos la librería Arduino-IRremote desarrollada por Rafi Khan (z3t0) disponible en este enlace.

El siguiente código realiza la lectura del valor recibido por el mando, y lo muestra por pantalla. El código se muestra en formato hexadecimal.
 
// Incluir la librería para trabajar con el sensor IR

#include "IRremote.h"

// Definición de variables y constantes relacionadas con el sensor infrarrojos

const int RECV_PIN=9; // Pin digital 9 para conectar el sensor

IRrecv irrecv(RECV_PIN);  // Se crea un nuevo objeto para trabajar con el sensor

decode_results results;


void setup()
{
Serial.begin(9600);  // Se inicia el puerto de comunicaciones en serie

irrecv.enableIRIn(); // Se inicia el receptor IR

}
void loop()
{
if(irrecv.decode)(&results)
{
Serial.println(results.value, HEX);
irrecv.resume();
}
}

Armazón o esqueleto del robot

El armazón es como el esqueleto de un ser humano. Es la parte que soporta los componentes del que esta compuesto el robot. Una característica es su robustez, el tipo de material, facilidad para el cambio y del tipo de trabajo a desempeñar.

En nuestro caso, vamos a montar el siguiente armazón:

Base, para la base vamos a utilizar una madera de DM de 3 mm de grosor, debido a que no se pandea y es muy rígida.

Realizar el siguiente dibujo:

Cortar la pieza utilizando una sierra de marquetería, para así obtener la base del robot.

Lijar los bordes y después pintar la pieza obtenida.


Pegar con cola termofusible los motores reductores a la base de la estructura, por su parte inferior.

Motor reductor con neumático

Fijar mediante tornillos la rueda loca a la base.

Rueda loca
En la siguiente imagen se muestra el esqueleto del robot.

Esqueleto del robot

Por último colocar la placa de Arduino UNO, la placa protoboard y la batería sobre la base del robot.

Esqueleto del robot

Este esqueleto nos va a permitir  implementar diferentes robots cuyo funcionamiento siempre va a depender del sensor o sensores instalados.


Robot móvil que sea capaz de detectar y salvar obstáculos


Se trata de diseñar y construir un robot móvil que sea capaz de detectar y salvar obstáculos, con objeto de que busque la salida de un reciento cerrado.

Condiciones iniciales

  • El robot dispondrá de dos ruedas motrices y una rueda loca.
  • Los obstáculos los detectará con un sensor de ultrasonidos.
  • Tendrá dos ojos que se implementaran con diodos led. Cuando el robot gire hacia un lado lo indicará el ojo correspondiente.

Partes de un robot

Estructura general de un robot

 Se componen de cuatro partes fundamentales, donde la importancia de cada una de ellas dependerá de la tarea concreta para la que fue construido. Presentamos en la imagen las siguientes partes que se describen a continuación:

Partes de un robot

a) Armazón o esqueleto del robot

El armazón es como el esqueleto de un ser humano. Es la parte que soporta los componentes del que esta compuesto el robot. Una característica es su robustez, el tipo de material, facilidad para el cambio y del tipo de trabajo a desempeñar.

b) Sensores o receptores de estimulos

Todo robot debe tener un desenvolvimiento  adecuado gracias a los estímulos  externos que recibe del exterior. Para estos los sensores deben ser adecuado a la tarea a realizar y colocados de manera estratégica sobre la estructura. Los principales tipos de sensores son:
  • Sensor infrarrojo.- Mide distancia, basado en un sistema de emisión/recepción de radiación en el espectro de los infrarrojos (menor que las ondas de radio y mayor que la luz).
  • Sensor de proximidad (Rango).- Se utilizan para la detección de presencia de obstáculos sin necesidad de contacto y se utilizan para medir distancias. Esta información es de vital importancia en los robots, especialmente si se mueven en entornos no estructurados que requieran de la capacidad para construir mapas del entorno y evitar obstáculos cercanos.
  • Sensor de ultrasonido.- Son muy frecuentes en los robots móviles (particularmente) y de forma significativa en los AUVs (Vehículos autónomos bajo el agua) por sus buenas propiedades de medición en entornos acuáticos y sirven para detectar objetos y medir distancias. Se utilizan para construir mapas del entorno y evitar obstáculos.
c) Actuadores

El robot después de captar y procesar los datos del entorno, el  robot deberá procesar los datos recibidos ara desempeñar la tarea programada. Esto se lleva a cabo mediante el uso de actuadores que comúnmente son motores eléctricos. La  función del motor es darle desplazamiento para lograr su objetivo. De igual manera como ocurre con la estructura o los sensores, va a depender del trabajo a realizar. Es asi que unos va necesitar mas potencia y otros como un rastreador necesita mas velocidad.

d) Tarjeta de control o cerebro del robot Para que exista el movimiento o acción del robot por parte de los estímulos externo, se hace a través de un lógica de control que rije el comportamiento de la maquina. Por lo general se trata de sistemas basado en microcontroladores que programados de manera conveniente resuelven de forma optima los objetivos de una aplicacion. Hoy en dia ya viene insertados en tarjetas de desarrollo de múltiple propósito como por ejemplo las tarjetas Arduino que no es mas que una placa compuesta por microcontroladores y microprocesadores.

SERVOMOTOR

Fuente:https://www.luisllamas.es/controlar-un-servo-con-arduino/
Fuente: https://programarfacil.com/tutoriales/fragmentos/servomotor-con-arduino/
¿Qué es un servo?
Servomotor

Normalmente los motores habituales lo que hacen es transformar la energía eléctrica en un giro continuo que podemos usar para desarrollar trabajo mecánico.

Los servos son también motores de corriente continua, pero en lugar de diseñarse para obtener un giro continuo que podamos aprovechar ( para mover una rueda por ejemplo), se diseñan para que se muevan un ángulo fijo en respuesta a una señal de control, y se mantengan fijos en esa posición.

Estos servomotores son muy frecuentes en Aeromodelismo y en robótica, por la capacidad que presentan para moverse a un ángulo concreto y mantenerse allí. De hecho se suelen diseñar para que giren un ángulo proporcional a una señal PWM, de forma que su control es muy preciso. Típicamente los servos disponen de un rango de movimiento de entre 0 a 180º. Es decir, no son capaces de dar la vuelta por completo (de hecho disponen de topes internos que limitan el rango de movimiento). 

Existen modelos comerciales de todas la características imaginable. El modelo que vamos a utilizar en clase es el SG90,  a continuación se describe dicho servomotor.

SG 90

Es el servo de tamaño "pequeño" estándar dentro de los proyectos de electrónica. Es un servo pequeño, ligero, y barato, que dispone de engranajes de plástico. Muchos dispositivos, como torretas y partes de robots, están diseñados para servos de este tamaño.
  • Torque: 1.4 kg·cm
  • Velocidad: 0.1 seg/60º (4.8V) y 0.08 seg/60º (6V)
  • Dimensiones: 21.5 x 11.8 x 22.7mm
  • Peso: 9g
  • Precio: 1.20€
¿Cómo funciona un servo?

Internamente un servo frecuentemente consta de un mecanismo reductor, acoplado a un reductor para reducir la velocidad de giro, junto con la electrónica necesaria para controlar su posición. Por tanto proporcionan un alto par y un alto grado de precisión. Por contra, las velocidades de giro son pequeñas frente a los motores de corriente continua. 
 

La comunicación de la posición deseada se realiza mediante la transmisión de un señal pulsada con periodo de 20ms. El ancho del pulso determina la posición del servo.
La relación entre el ancho del pulso y el ángulo depende del modelo del motor. Por ejemplo, algunos modelos responden con 0º a un pulso de 500 ms, y otros a un pulso de 1000 ms.

En general, en todos los modelos:
  • Un pulso entre 500-1000 us corresponde con 0º
  • Un pulso de 1500 ms corresponde con 90º (punto neutro)
  • Un pulso entre 2000-2500us corresponde con 180º
Estos motores funcionan con una señal PWM, con un pulso de trabajo entre 1 ms y 2 ms y con un periodo de 20 ms (50 Hz). ¿Qué quiere decir todo esto? Este dato nos indica la velocidad máxima a la que podemos mover el servomotor con Arduino. Solo podremos cambiar de posición cada 20 ms. Esto dependerá del tipo y marca de nuestro servo.

Por tanto, variando la señal en microsegundos podemos disponer de una precisión teórica de 0.18-0.36º, siempre que la mecánica del servo acompañe.

 Esquema de montaje

Conectar un servo a Arduino es sencillo. El servo dispone de tres cables, dos de alimentación (GND y Vcc) y uno de señal (Sig).
El color de estos cables suele tener dos combinaciones:
  • Marrón (GND), Rojo (Vcc) y Naranja (Sig)
  • Negro (GND), Rojo (Vcc) y Blanco (Sig)
Por un lado, alimentamos el servo mediante el terminal GND ( Marrón / Negro) y Vcc (Rojo).




En general, la alimentación a los servos se realizará desde una fuente de tensión externa (una batería o fuente de alimentación) a una tensión de 5V-6.5V, siendo 6V la tensión idónea.

Arduino puede llegar a proporcionar corriente suficiente para encender un servo pequeño (SG90), suficiente para hacer unos cuantos proyectos de prueba.

Sin embargo no dispone de corriente suficiente para actuar un servo grande (MG996R). Incluso varios servos pequeños, o hacer excesiva fuerza con ellos puede exceder la capacidad de corriente de Arduino, provocando su reinicio.

Por otro lado, finalmente, para el control conectamos el cable de señal (naranja / blanco) a cualquier pin digital de Arduino.

Ejemplos de código

El control de servos en Arduino es muy sencillo, ya que el IDE Standard proporciona la librería "servo.h", que permite controlar simultáneamente hasta 12 servos en Arduino Uno/Nano. Para incorporar la librería tenemos que ir a Programa/Include Library/Servo.

De la librería Servo.h hemos declarado un objeto o variable servoMotor y hacemos uso de dos métodos. Por un lado el attach, que nos permite indicar en que pin tenemos conectado nuestro servo, y por otro lado el write, donde indicamos en qué ángulo queremos posicionar nuestro servomotor.

Entre los ejemplos típicos para ilustrar el funcionamiento de servos tenemos el Sketch "Sweep", que realiza un barrido continuo con el servo. Leer más..

Robot que busca la luz (Robot polilla)

Propuesta

Diseñar y construir un robot de juguete que busca la luz. El robot  debe "buscar" un haz luminoso (de una linterna),  seguirlo y desplazarse hacia él. Si el haz de luz se mueve o se interrumpe, el robot tiene que dejar de desplazarse hacia delante y empezar a buscar la luz otra vez.

Solución

Vamos a realizar un vehículo que busca la luz: girará en redondo sobre si mismo hasta que detecte un haz de luz, en ese caso, se moverá en línea recta hacia ella.
 
Sin luz solo funciona el motor 1 provocando que el vehículo gire sobre la rueda izquierda.


Con luz, además del motor 1, también funciona el motor 2 y el vehículo se mueve recto hacia delante.


Arduino debe encargarse de mantener siempre en movimiento el motor 1 y activar el motor 2 sólo cuando la lectura analógica del voltaje en la LDR sea inferior a un valor determinado.

Circuito eléctrico


Montaje en placa protoboard







Algoritmo para obtener el valor mayor de las medidas realizadas por un sensor de ultrasonidos.

Vamos a analizar el algoritmo para obtener el mayor de tres números

Algoritmo para obtener el mayor de tres números

Fuente: Hazaelocielx's Blog

ALGORITMO INFORMAL


INICIO.

1.- Pedir al usuario tres números diferentes.

2.- Comparar el primero con el segundo.

3.- Al mayor de los anteriores, compararlo con el tercero. El número más grande es el mayor de los tres.

4.- Imprimir el resultado en la pantalla.

FIN


ALGORITMO COMPUTACIONAL

INICIO

1.- Solicitar a usuario n1, n2 y n3

2.- Comparar n1 con n2

3.- Si n1 > n2

                Si n1 > n3

                     Imprimir n1

                Si no
                     Imprimir n3
     Si no, comparar n2 con n3
                Si n2 > n3
                     Imprimir n2
                Si no
                     Imprimir n3
FIN

En nuestro caso lo vamos a adaptar a para obtener la distancian mayor obtenida por un sensor de ultrasonidos que realiza tres medidas:

Se posiciona en 0º y realiza una medida. distancia_0
Se posiciona en 90º y realiza una segunda media. distancia_90
Se posiciona en 180º y realiza una tercera medida distancia_180

El valor obtenido, la distancia mayor se va  a utilizar para indicar al robot la dirección en la que tiene que avanzar.



ALGORITMO INFORMAL


INICIO.

1.- Realizar las medidas de distancia (distancia_0, distancia_90 y distancia_180).

2.- Comparar el primero con el segundo.

3.- Al mayor de los anteriores, compararlo con el tercero. El número más grande es el mayor de los tres.

4.- Imprimir el resultado en la pantalla.

FIN


ALGORITMO COMPUTACIONAL

INICIO

1.- Realizar las medidas de distancia (distancia_0, distancia_90 y distancia_180).

2.- Comparar distancia_0 con distancia_90

3.- Si distancia_0 >distancia_90

                Si distancia_0 > distancia_180

                     avanzar();

                Si no

                     girarDerecha();

     Si no, comparar distancia_90 con distancia_180
              
           Si distancia_90 > distancia_180
       
            girarIzquierda();
       
       Si no
                    girarDerecha();

FIN

Las funciones avanzar(), girarDerecha() y girarIzquierda(), han sido creadas para controlar el funcionamiento del robot.