Introducción
Material necesario
| Nombre | Imagen | Descripción |
| Placa Arduino Uno | ![]() |
Placa Arduino Uno (o cualquier otra versión) |
| Protoboard, breadboard o placa de conexiones | ![]() |
Placa de conexiones o protoboard que usaremos en el montaje de circuitos eléctrico-electrónico para ahorrar y simplificar el cableado. Para aprender algo más sobre el uso de este dispositivo pulsa aquí |
| 1 driver L298n |
![]() |
El driver L298n nos permitirá gobernar los motores de corriente continua con las ruedas acopladas y, por tanto, gobernar el movimiento de nuestro vehículo. Se recomienda leer el artículo para más información. |
| Receptor/sensor de infrarrojos | ![]() |
Un receptor de infrarrojos integrado como el AX1838HS. Independiente o con breakout board |
| Un mando a distancia (emisor infrarrojos) |
![]() |
Cualquier mando a distancia puede ser usado para probar la señal infrarroja. |
| Cables de conexiones entre los componentes, la placa de pruebas y Arduino | ![]() |
Estos cables nos permiten conectar de manera sencilla todos los elementos del circuito. |
Circuito eléctrico (diagrama de conexiones)
Dado que en otras sesiones ya trabajamos con el driver L298n para controlar 2 motores de corriente contínua y con el sensor de infrarrojos para detectar señales procedentes de un mando a distancia, combinaremos la circuitería de ambos circuitos para crear nuestro proyecto conjunto.
Código programa Arduino
Para poder detectar señales lo mejor es usar una librería (código generado que permite usar determinaciones funciones que no pertenecen al IDE de Arduino). No entraremos en profundidad en el uso de dichas librerías (vitales para cualquier programador en cualquier idioma) (leer artículo de Prometec sobre librerías) pero en este caso usaremos la librería Arduino-IRremote desarrollada por Rafi Khan (z3t0) disponible en este enlace.
/*
Nombre: Robot Mando Distancia
Autor: Daniel Pascual Gallegos
Fecha: Diciembre 2016
Funcionalidad: Este subproyecto forma parte de la construcción de nuestro robot autónomo.
En este subproyecto usaremos un mando a distancia y un sensor infrarrojos
para accionar nuestro robot móvil de manera inalámbrica.
En este caso, usaremos 5 botones del robot:
- Flecha arriba: el robot avanzará recto y 2 LEDs verdes ON
- Flecha abajo: el robot irá marcha atrás y 2 LEDs rojos ON
- Flecha derecha: el robot irá hacia la derecha
- Flecha izquierda: el robot irá hacia la izquierda
- Botón OK: el robot parará y se apagarán todos los LEDs
*/
// Inclusión de librería para trabajar con el sensor IR
#include "IRremote.h"
// Definición de variables y constantes relacionadas con el motor izquierdo
const int IN1 = 13; // Pin digital 13 para controlar sentido giro motor izquierdo
const int IN2 = 12; // Pin digital 12 para controlar sentido giro motor izquierdo
// Definición de variables y constantes relacionadas con el motor derecho
const int IN3 = 11; // Pin digital 11 para controlar sentido giro motor izquierdo
const int IN4 = 10; // Pin digital 10 para controlar sentido giro motor izquierdo
// Definición de variables y constantes relacionadas con los LEDs
const int ledVerde1 = 4; // Pin digital 4 para conectar el LED verde 1
const int ledVerde2 = 5; // Pin digital 5 para conectar el LED verde 2
const int ledRojo1 = 6; // Pin digital 6 para conectar el LED rojo 1
const int ledRojo2 = 7; // Pin digital 7 para conectar el LED rojo 2
// Definición de variables y constantes relacionadas con el zumbador
const int zumbadorPiezo = 8; // Pin digital 8 para conectar el zumbador
// Definición de variables y constantes relacionadas con el sensor infrarrojos
const int sensorInfrarrojos = 9; // Pin digital 9 para conectar el sensor
IRrecv irrecv(sensorInfrarrojos); // Se crea un nuevo objeto para trabajar con el sensor
decode_results results;
// Definición de códigos asociados al mando Keyes más sencillo
const unsigned long BOTON_ARRIBA = 0xFF629D;
const unsigned long BOTON_ABAJO = 0xFFA857;
const unsigned long BOTON_IZQ = 0xFF22DD;
const unsigned long BOTON_DER = 0xFFC23D;
const unsigned long BOTON_OK = 0xFF02FD;
// Función que se ejecuta una sola vez al cargar el programa
void setup()
{
// Se declaran todos los pines como salidas
// Pines asociados a los motores
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
// Pines asociados a los LEDS
pinMode (ledVerde1, OUTPUT);
pinMode (ledVerde2, OUTPUT);
pinMode (ledRojo1, OUTPUT);
pinMode (ledRojo2, OUTPUT);
// Pines asociados al zumbador
pinMode (zumbadorPiezo, OUTPUT);
// Se inicia el receptor IR
irrecv.enableIRIn();
// Se inicia el puerto de comunicaciones en serie
Serial.begin(9600);
}
// Función que se repite de manera periódica
void loop()
{
lecturaSensor(); // Se lee la señal del sensor IR
}
/*
Función robotAvance: esta función hará que ambos motores se activen a máxima potencia
por lo que el robot avanzará hacia delante
*/
void robotAvance()
{
// Motor izquierdo
// Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
// Motor derecho
// Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
}
/*
Función robotRetroceso: esta función hará que ambos motores se activen a máxima potencia en sentido contrario al anterior
por lo que el robot avanzará hacia atrás
*/
void robotRetroceso()
{
// Motor izquierdo
// Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
// Motor derecho
// Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
}
/*
Función robotDerecha: esta función acccionará el motor izquierdo y parará el derecho
por lo que el coche girará hacia la derecha (sentido horario)
*/
void robotDerecha()
{
// Motor izquierdo
// Se activa el motor izquierdo
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
// Motor derecho
// Se para el motor derecho
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
}
/*
Función robotIzquierda: esta función acccionará el motor derecho y parará el izquierdo
por lo que el coche girará hacia la izquierda (sentido antihorario)
*/
void robotIzquierda ()
{
// Motor izquierdo
// Se para el motor izquierdo
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
// Motor derecho
// Se activa el motor derecho
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
}
/*
Función robotParar: esta función parará ambos motores
por lo que el robot se parará.
*/
void robotParar()
{
// Motor izquierdo
// Se para el motor izquierdo
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
// Motor derecho
// Se para el motor derecho
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
}
/*
Función enciendeLEDVerde: esta función hará que ambos LED verdes se enciendan
y se apaguen los LED rojos (en caso de que estuvieran encendidos)
y el zumbador (en caso de que estuviera sonando)
*/
void enciendeLEDVerde()
{
// Manda 5 V a los pines por lo que enciende los 2 LED verdes
digitalWrite (ledVerde1, HIGH);
digitalWrite (ledVerde2, HIGH);
// Quita 5V de los otros pines por lo que apaga los 2 LED rojos y el zumbador
digitalWrite (ledRojo1, LOW);
digitalWrite (ledRojo2, LOW);
digitalWrite (zumbadorPiezo, HIGH);
}
/*
Función enciendeLEDRojoZumbador: esta función hará que ambos LED rojos se enciendan
y que empiece a sonar el zumbador. Además de que se apaguen los LED verdes
*/
void enciendeLEDRojoZumbador()
{
// Manda 5 V a los pines por lo que enciende los 2 LED rojos y el zumbador
digitalWrite (ledRojo1, HIGH);
digitalWrite (ledRojo2, HIGH);
digitalWrite (zumbadorPiezo, HIGH);
// Quita 5V de los otros pines por lo que apaga los 2 LED verdes
digitalWrite (ledVerde1, LOW);
digitalWrite (ledVerde2, LOW);
}
/*
Función lecturaSensor: esta función recibirá los valores del mando a distancia
*/
void lecturaSensor()
{
if (irrecv.decode(&results))
{
Serial.println (results.value, HEX); //display HEX
Serial.println (results.value);
switch (results.value)
{
case BOTON_ARRIBA:
Serial.println("Boton arriba");
robotAvance();
enciendeLEDVerde();
break;
case BOTON_ABAJO:
Serial.println("Boton abajo");
robotRetroceso();
enciendeLEDRojoZumbador();
break;
case BOTON_IZQ:
Serial.println("Boton izquierda");
robotIzquierda();
break;
case BOTON_DER:
Serial.println("Boton derecha");
robotDerecha();
break;
case BOTON_OK:
Serial.println("Boton OK");
robotParar();
break;
}
irrecv.resume();
}
}
Código mBlock
Para poder recibir señales mediante nuestro sensor infrarrojo usando el sofware mBlock lo primero que debemos hacer es instalar una extensión de mBlock que nos permita usar los bloques de programación asociados al control de señales infrarrojas (pulsa para obtener más información sobre la Administración de Extensiones que ofrece mBlock). En este caso la extensión que vamos a instalar se llama IRremote y ha sido creada por el usuario Abaddon).
Una vez que hayamos instalado la extensión IRremote nos aparecerán una serie de nuevos comandos para poder realizar la comunicación infrarroja. En nuestro caso hemos usado los siguientes códigos asociados al mando más sencillo (en caso de que sea usado otro mando convendría comenzar conociendo la codificación asociada al citado mando para lo que se recomienda la lectura del siguiente artículo Receptor de infrarrojos (ver artículo)). Para el citado mando los códigos usados son:
- Flecha arriba: 16718055 (en este caso se arrancarán los 2 motores por lo que el coche avanzará recto).
- Flecha abajo: 16730805 (en este caso se arrancarán los 2 motores en sentido contrario por lo que el coche avanzará hacia atrás).
- Flecha derecha: 16734885 (en este caso se parará el motor derecho y activará el izquierdo por lo que el coche girará a la derecha).
- Flecha izquierda: 16716015 (en este caso se parará el motor izquierdo y activará el derecho por lo que el coche girará a la izquierda).
- Botón OK: 16726215 (en este caso se pararán ambos motores por lo que el coche se detendrá).
El programa que se muestra a continuación, permite dirigir nuestro robot hacia delante, atrás, derecha e izquierda usando los botones del mando de infrarrojos. Si quieres descargar el fichero mBlock con el código pulsa este enlace (RobotMandoDistancia.sb2))
- Flecha derecha: 16734885 (en este caso se parará el motor derecho y activará el izquierdo por lo que el coche girará a la derecha).





