Skip to Content

Cómo controlar un servo con un mando IR

Cómo controlar un servo con un mando IR

En este tutorial, aprenderemos cómo controlar un motor servo usando un mando IR y un Arduino. Los motores servo se utilizan ampliamente en diversos proyectos, incluyendo robótica, automatización y vehículos controlados a distancia. Al integrar un sensor IR con una placa Arduino, podemos recibir comandos de un mando IR y usarlos para controlar la posición o la velocidad del motor servo.

Controlar un motor servo con un mando IR abre un mundo de posibilidades. Puedes usarlo para construir un brazo robótico controlado a distancia, crear un mecanismo de paneo e inclinación para una cámara, o incluso construir un coche controlado por mando. ¡Las posibilidades son infinitas!

Antes de entrar en detalles, echemos un vistazo a los componentes que necesitarás para este proyecto.

Componentes necesarios

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

A continuación encontrarás los componentes requeridos para este proyecto. Si ya tienes un mando IR, entonces no necesitarás el Kit receptor de mando IR, solo el módulo receptor IR. Sin embargo, no todos los mandos IR serán adecuados. Por otro lado, si compras o tienes el Kit, no necesitarás el módulo receptor IR, ya que forma parte del Kit.

Arduino Uno

Dupont wire set

Juego de cables Dupont

Half_breadboard56a

Protoboard

USB Data Sync cable Arduino

Cable USB para Arduino UNO

Infrared (IR) receiver module

Módulo receptor IR

Kit receptor de mando IR

Conexión de los componentes

En esta sección conectaremos los componentes al Arduino. La imagen a continuación muestra el cableado completo. Comenzamos con la alimentación de la protoboard.

Wiring of the components

Conexión de la protoboard

Primero, conecta el pin marcado como Ground (GND) en el Arduino con un cable negro o azul al riel de tierra de la protoboard (marcado con una línea azul). Luego conecta el pin marcado como 5V (Power) en el Arduino con un cable rojo al riel de alimentación de la protoboard (marcado con una línea roja).

Wiring of the power supply

Conexión del sensor IR

Comenzamos con el cable de señal para conectar el sensor IR. Encuentra el pin marcado como S o Signal en el módulo del sensor IR y conéctalo con un cable amarillo al pin 8 del Arduino.

A continuación conectamos la alimentación. Normalmente, el pin central del módulo del sensor IR es el positivo. Usa un cable rojo para conectar ese pin al riel de alimentación positivo de la protoboard. Finalmente, conecta el tercer pin restante del módulo del sensor IR al riel de tierra negativo de la protoboard.

Wiring of the IR Sensor

Conexión del motor servo

El último componente a conectar es el motor servo. Primero, conecta el cable marrón del servo al riel de tierra negativo de la protoboard con un cable marrón o negro. Luego conecta el cable rojo del servo al riel de alimentación positivo; preferiblemente con un cable rojo.

Wiring of the Servo

Finalmente conectamos el cable de señal naranja del servo al pin 9 de la placa Arduino.

Una vez que hayas terminado con el cableado de los componentes, es mejor revisar que todo esté correctamente conectado. Presta especial atención a las conexiones de alimentación. No queremos un cortocircuito.

A continuación, te mostraré el código necesario.

Escribiendo el código para Arduino

A continuación encontrarás el código completo para tener una visión general. Permite rotar el servo hacia la izquierda o derecha en pasos de 10 grados al presionar el botón NEXT o PREV en el mando. Vamos a desglosar este código y explicar su función.

#include <IRremote.hpp>
#include <Servo.h>

#define IR_RECEIVE_PIN 8
#define SERVO_PIN 9

Servo servo;
const int range = 780;
const int mid = 1600;

int pos = 90;
int speed = 10;

void rotate(int angle) {
  angle = map(angle, 0, 180, mid - range, mid + range);
  servo.writeMicroseconds(angle);
}

void setup() {
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  servo.attach(SERVO_PIN);
  rotate(pos);
}

void loop() {
  if (IrReceiver.decode()) {
    uint16_t command = IrReceiver.decodedIRData.command;
    if (command == 8) {  // NEXT
      pos = min(pos + speed, 180);
    } else if (command == 2) {  // PREV
      pos = max(pos - speed, 10);
    }
    rotate(pos);
    IrReceiver.resume();
  }
}

Definiciones

Primero incluimos dos librerías. La IRremote librería, que es necesaria para entender los comandos que envía el mando IR. Y la Servo librería, que nos ayuda a controlar el servo.

#include <IRremote.hpp>
#include <Servo.h>

Luego definimos constantes, IR_RECEIVE_PIN y SERVO_PIN que especifican qué pines del Arduino se usan para leer la señal IR y para controlar el servo.

#define IR_RECEIVE_PIN 8
#define SERVO_PIN 9

Después definimos el objeto servo y dos constantes (range y mid), que ajustan el rango de movimiento del servo, y mid define la posición central del servo. Además, declaramos dos variables (pos, speed) que describen la posición actual del servo y la velocidad (o pasos de ángulo) con la que gira.

Servo servo;
const int range = 780;
const int mid = 1600;

int pos = 90;
int speed = 10;

Rotando el servo

Para rotar el servo a un ángulo específico, definimos una función especial rotate(). Básicamente, mapea el ángulo dado, que debe estar entre 0 y 180 grados, a la longitud de pulso correspondiente necesaria para controlar el servo.

void rotate(int angle) {
  angle = map(angle, 0, 180, mid - range, mid + range);
  servo.writeMicroseconds(angle);
}

Para más detalles, consulta nuestro tutorial sobre las diferencias entre continuous and positional servos. Presta especial atención a la sección que explica cómo ajustar finamente tu servo.

Setup

En la función setup(), simplemente indicamos a la librería del receptor IR y a la librería Servo qué pines se usan para el receptor IR y el control del servo. Además, rotamos el servo a la posición de 90 grados. Ten en cuenta que aquí asumimos un servo posicional común.

void setup() {
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  servo.attach(SERVO_PIN);
  rotate(pos);
}

Bucle principal

Finalmente, implementamos la función loop() que se ejecuta continuamente.

void loop() {
  if (IrReceiver.decode()) {
    uint16_t command = IrReceiver.decodedIRData.command;
    if (command == 8) {         // NEXT
      pos = min(pos + speed, 180);
    } else if (command == 2) {  // PREV
      pos = max(pos - speed, 10);
    }
    rotate(pos);
    IrReceiver.resume();
  }
}

Comenzamos esperando una señal del receptor IR llamando a IrReceiver.decode(). Si recibimos un comando, lo decodificamos mediante IrReceiver.decodedIRData.command.

Dependiendo del valor del comando, aumentamos la posición, pero no más de 180 grados, o la disminuimos, pero no menos de 0 grados. Para eso sirven las funciones min() y max() .

Qué valor de comando corresponde a qué tecla del mando IR dependerá del mando que estés usando. ¡Consulta nuestro tutorial sobre How to use an IR receiver and remote with Arduino para aprender a identificar los códigos de comando de tu mando! En mi caso, 8 corresponde al botón de siguiente pista y 2 al botón de pista anterior en mi mando.

Finalmente, rotamos el servo a la posición usando rotate(pos) y le indicamos al receptor IR que busque un nuevo comando mediante IrReceiver.resume().

Consejos

Ten en cuenta que puedes aumentar el ángulo de paso o la velocidad con la que el servo se mueve entre posiciones aumentando o disminuyendo el valor de la variable speed . Incluso podrías hacer esto usando el mando añadiendo dos comandos más para reaccionar, por ejemplo:

void loop() {
  if (IrReceiver.decode()) {
    uint16_t command = IrReceiver.decodedIRData.command;
    if (command == 31) {  // VOL+
      speed = min(speed + 1, 90);
    } else if (command == 23) {  // VOL-
      speed = max(speed - 1, 1);
    } else if (command == 8) { // NEXT
      pos = min(pos + speed, 180);
    } else if (command == 2) {  // PREV
      pos = max(pos - speed, 10);
    }
    rotate(pos);
    IrReceiver.resume();
  }
}

Aquí uso los botones de volumen de mi mando para controlar la velocidad. Como antes, los códigos de comando para tu mando pueden ser diferentes y tendrás que ajustar el código en consecuencia.

Aplicaciones

Brazo robótico

Usa el motor servo para controlar el movimiento de un brazo robótico. El brazo puede programarse para realizar diversas tareas como recoger objetos, moverlos o incluso jugar.

Control de persianas

Automatiza la apertura y cierre de persianas usando el motor servo y el mando IR. Esto te permite controlar la cantidad de luz que entra en una habitación con solo pulsar un botón.

Comedero para mascotas

Crea un comedero automático para mascotas que dispense comida en horarios específicos usando el motor servo. Usa el mando IR para activar manualmente el proceso de alimentación si es necesario.

Sistema de riego para plantas

Construye un sistema de riego para plantas que use el motor servo para controlar el flujo de agua. Usa el mando IR para activar el sistema y regar tus plantas a distancia.

Cerradura inteligente

Construye un sistema de cerradura inteligente que use el motor servo para bloquear y desbloquear la puerta. Usa el mando IR para controlar la cerradura remotamente o configura un teclado para acceso seguro.

Iluminación ambiental

Crea un sistema de iluminación ambiental que use el motor servo para ajustar el brillo o el color de las luces. Usa el mando IR para cambiar la configuración de la iluminación y crear diferentes ambientes.

Cortinas automáticas

Controla la apertura y cierre de cortinas usando el motor servo y el mando IR. Esto te permite ajustar fácilmente la cantidad de luz que entra en una habitación o crear privacidad.

Limpiador robótico de acuario

Construye un limpiador robótico de acuario que use el motor servo para moverse y limpiar el tanque. Usa el mando IR para controlar sus movimientos y patrones de limpieza.

Instalación artística interactiva

Crea una instalación artística interactiva que use el motor servo para controlar partes móviles o esculturas. Usa el mando IR para activar diferentes movimientos y atraer a los espectadores.

Conclusiones

En este tutorial, hemos aprendido cómo controlar un motor servo usando un mando IR. Siguiendo los pasos descritos en esta guía, puedes implementar fácilmente esta funcionalidad en tus propios proyectos.

Comenzamos reuniendo los componentes necesarios, incluyendo un Arduino Uno, un juego de cables Dupont, una protoboard, un módulo receptor IR, un kit receptor de mando IR y el Arduino IDE. Estos componentes son esenciales para construir el circuito.

Luego conectamos los componentes. Conectamos la protoboard al Arduino Uno, asegurándonos de que todas las conexiones fueran correctas. Después, conectamos el sensor IR a la protoboard y el motor servo al Arduino Uno. Estas conexiones permiten que el Arduino reciba señales del mando IR y controle el motor servo en consecuencia.

Tras completar la configuración del hardware, pasamos a escribir el código para Arduino. Definimos las variables y librerías necesarias, y luego implementamos el código para rotar el motor servo según las señales recibidas del mando IR. También configuramos la posición inicial del servo en la función setup y comprobamos continuamente las señales del mando IR en el bucle principal.

Finalmente, proporcionamos algunos consejos para mejorar el control de tu motor servo con un mando IR. Estos consejos incluyen usar diferentes botones del mando para activar distintos movimientos del servo, ajustar la velocidad del servo e incorporar otros sensores o módulos en tu proyecto.

En conclusión, controlar un motor servo con un mando IR abre un amplio abanico de posibilidades para tus proyectos con Arduino. Ya sea que quieras construir un brazo robótico, un gimbal para cámara o cualquier otro proyecto que requiera control preciso del motor, este tutorial te ha proporcionado el conocimiento necesario para empezar.

Si tienes más preguntas o necesitas aclaraciones sobre alguno de los pasos descritos en este tutorial, consulta la sección de Preguntas Frecuentes a continuación. ¡Feliz creación!

Preguntas frecuentes

Aquí tienes algunas preguntas comunes relacionadas con el control de un motor servo con un mando IR:

P: ¿Puedo usar cualquier mando IR con este proyecto?

R: Sí, puedes usar cualquier mando IR siempre que sea compatible con Arduino. La mayoría de los mandos IR usan el protocolo NEC, que es compatible con la librería IR de Arduino. Sin embargo, si tienes un tipo diferente de mando IR, puede que necesites modificar el código en consecuencia. Lo más probable es que tengas que ajustar el código a los códigos de comando de tu mando. Para más detalles, consulta here.

P: ¿Cómo encuentro los códigos de los botones de mi mando IR?

R: Para encontrar los códigos de los botones de tu mando IR, puedes usar el IRrecvDumpV2 example sketch proporcionado por la librería IR de Arduino. Alternativamente, sigue nuestro tutorial.

Sube el sketch a tu Arduino, abre el Monitor Serial y pulsa los botones de tu mando. Los códigos se mostrarán en el Monitor Serial. Luego puedes usar estos códigos en tu código Arduino para asignar los botones a movimientos específicos del motor servo.

P: ¿Puedo controlar varios motores servo con un solo mando IR?

R: Sí, puedes controlar varios motores servo con un solo mando IR. Necesitarás conectar cada motor servo a un pin diferente del Arduino y modificar el código para controlar cada motor servo de forma independiente. Puedes asignar diferentes botones del mando IR para controlar distintos motores servo.

P: ¿Cómo ajusto el rango de movimiento del motor servo?

R: El rango de movimiento del motor servo puede ajustarse modificando los valores en las funciones servo.attach() y servo.write() en el código Arduino. La función servo.attach() establece el rango de movimiento del motor servo, mientras que la función servo.write() especifica el ángulo al que debe moverse el motor servo. Para métodos alternativos, consulta nuestro tutorial sobre continuous and positional servos.

P: ¿Puedo usar un microcontrolador diferente en lugar de Arduino?

R: Sí, puedes usar un microcontrolador diferente en lugar de Arduino siempre que soporte las librerías necesarias y tenga suficientes pines digitales para conectar el motor servo y el receptor IR. El código proporcionado en este tutorial es específico para Arduino, pero puedes adaptarlo para que funcione con otros microcontroladores.

P: ¿Puedo usar un tipo diferente de motor en lugar de un motor servo?

R: No, este proyecto específico está diseñado para controlar motores servo. Los motores servo tienen control de posición incorporado, lo que los hace ideales para esta aplicación. Si quieres controlar otro tipo de motor, necesitarás un circuito y código diferentes.

P: ¿Puedo controlar la velocidad del motor servo?

R: Depende. Para servos continuos o de 360 grados puedes controlar la velocidad y dirección (pero no la posición). Para servos posicionales, que son los usados en este tutorial, no puedes controlar directamente la velocidad, pero puedes cambiar los pasos de ángulo, lo que modifica la velocidad de forma aproximada, aunque resulta en un movimiento entrecortado.

P: ¿Hay precauciones de seguridad que deba tener al trabajar con motores servo?

R: Sí, al trabajar con motores servo, asegúrate de proporcionar suficiente alimentación a los motores y evita sobrecargarlos. También, ten cuidado con las partes móviles y evita tocarlas mientras el motor está en funcionamiento.

Espero que estas preguntas frecuentes hayan ayudado a aclarar cualquier duda que pudieras tener. Si tienes más preguntas, no dudes en preguntar en la sección de comentarios abajo.

Enlaces

Finalmente, una selección de enlaces a material relacionado que puede resultarte útil.