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.
Arduino Code
/* 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).