Skip to Content

Controla un motor paso a paso con un mando a distancia por infrarrojos

Controla un motor paso a paso con un mando a distancia por infrarrojos

En este tutorial, aprenderás cómo controlar un motor paso a paso usando un mando a distancia por infrarrojos (IR). Los motores paso a paso se utilizan ampliamente en diversas aplicaciones, como robótica, máquinas CNC e impresoras 3D, gracias a su control preciso y su capacidad para moverse en pequeños incrementos. Al combinar el motor paso a paso con un mando IR, podemos crear un sistema de control inalámbrico para nuestros proyectos.

Vamos a utilizar el ULN2003 módulo driver para conectar el motor paso a paso con el Arduino. El ULN2003 es un chip driver muy popular que simplifica el control de motores paso a paso proporcionando la amplificación de corriente y la protección necesarias. Nos permite controlar el motor usando solo unos pocos pines digitales del Arduino.

Para el motor paso a paso, usamos un 28byj-48 motor paso a paso. Es muy asequible, compacto y funciona con 5-12 voltios, lo que facilita su integración con Arduinos y proyectos alimentados por batería.

Al final de este tutorial, tendrás claro cómo conectar los componentes, escribir el código para Arduino y controlar el motor paso a paso usando un mando IR. En concreto, podrás controlar la velocidad y la dirección del motor, y también tendrás la función de pausa.

¡Así que vamos a empezar!

Componentes necesarios

A continuación encontrarás los componentes necesarios para este proyecto. Si ya tienes un mando IR, no necesitarás el Kit receptor 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 IR

ULN2003 28BYJ-48 4-Phase Stepper Motor

Motor paso a paso

Conexión de los componentes

En esta sección vamos a conectar los componentes al Arduino. Necesitarás conectar los pines de salida del Arduino al módulo driver, que a su vez está conectado al motor paso a paso. Como el motor consume más energía de la que el Arduino puede suministrar, añadimos una protoboard con una fuente de alimentación adicional. En la protoboard también irá el sensor IR, que debe conectarse a la alimentación y a un pin de entrada del Arduino. La imagen de abajo muestra el cableado completo.

Wiring of the IR sensor, stepper motor, driver and Arduino

Conexión del motor paso a paso y el driver

Empecemos conectando el motor paso a paso a la placa driver.

El motor paso a paso 28byj-48 suele venir con un conector que encaja directamente en el zócalo de la placa driver. Solo tienes que conectarlo. Solo encajará en una orientación.

Wiring stepper motor and driver

A continuación, conectamos las señales de entrada del driver a los pines de salida de la placa Arduino:

Wiring driver and Arduino

La siguiente tabla muestra los pines correspondientes:

Arduino Módulo driver
Pin 12 IN1
Pin 11 IN2
Pin 10 IN3
Pin 9 IN4

Terminamos el cableado del driver conectando la alimentación de la placa driver a la protoboard. Asegúrate de que el cable rojo conecta la entrada positiva de la placa driver con el carril positivo de la protoboard (marcado con una línea roja). El cable negro conecta el lado negativo a tierra (GND).

Power supply driver

Conexión de la fuente de alimentación adicional

Para mover un motor paso a paso normalmente se necesita más energía de la que puede suministrar una placa Arduino. Por eso conectamos una fuente de alimentación adicional (por ejemplo, una pila de 9V) a la protoboard. Mira el conector a continuación:

Additional power supply

¡NO alimentes el motor paso a paso directamente desde la salida de 5V del Arduino! Es probable que dañes el regulador de voltaje de tu placa.

Conexión del sensor IR

Ahora, coloquemos el sensor infrarrojo (IR) en la protoboard y conectémoslo. El pin negativo está marcado con un signo (-). Usamos un cable negro para conectar este pin al carril de tierra de la protoboard. Esto significa que el sensor y la placa driver comparten la misma tierra.

Wiring IR sensor

El pin central del sensor suele ser el positivo. Debemos conectarlo a la salida de 5V del Arduino. Abajo puedes ver el cable rojo que va desde el pin central del sensor IR a la salida de 5V de la placa Arduino.

Power supply IR sensor

¡NO conectes el pin central del sensor al carril positivo de la protoboard, ya que podría estar a un voltaje superior! Tampoco conectes el 5V del Arduino al carril positivo de la protoboard. .

Sin embargo, debemos asegurarnos de que el sensor y la placa driver comparten la misma tierra. Por eso llevamos un cable negro desde el pin GND del Arduino al carril negativo de la protoboard (marcado con una línea azul. Ver arriba.

Por último, conectamos la señal de salida del sensor IR, que es el pin marcado con (S), al pin 8 del Arduino usando un cable blanco.

Las dos cosas más importantes a recordar son: (1), no conectar la fuente de alimentación del motor paso a paso directamente al Arduino. Pero (2), conectar la alimentación del sensor IR al Arduino. Y, por supuesto, asegúrate de respetar la polaridad correcta.

Escribiendo el código para Arduino

En esta sección vamos a escribir el código para controlar el motor paso a paso desde un mando IR. En concreto, queremos poder controlar la velocidad y la dirección del motor. Además, estaría bien poder parar y arrancar el motor con solo pulsar un botón.

El código de abajo hace todo eso. Lo dividiremos en partes y explicaremos cada sección a continuación.

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

#define IR_RECEIVE_PIN 8

#define IN1_PIN 12
#define IN2_PIN 11
#define IN3_PIN 10
#define IN4_PIN 9

#define TYPE AccelStepper::HALF4WIRE

#define MAXSPEED 1000
#define MINSPEED 100

int currspeed = 500;
int prevspeed = 500;
int inc = 100;
int dir = +1;

// Note the pin order 1,3,2,4!
auto stepper = AccelStepper(TYPE, IN1_PIN, IN3_PIN, IN2_PIN, IN4_PIN);

void setup() {
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  stepper.setMaxSpeed(MAXSPEED);
}

void loop() {
  if (IrReceiver.decode()) {
    uint16_t command = IrReceiver.decodedIRData.command;
    if (command == 31) {         // VOL+
      prevspeed = currspeed;
      currspeed = min(currspeed + inc, MAXSPEED);
    } else if (command == 23) {  // VOL-
      prevspeed = currspeed;
      currspeed = max(currspeed - inc, MINSPEED);
    } else if (command == 21) { // MODE
      dir = -dir;
      delay(200);
    } else if (command == 7) {  // PLAY or PAUSE
      currspeed = currspeed > 0 ? 0 : prevspeed;
      delay(200);
    }
    IrReceiver.resume();
  }
  stepper.setSpeed(dir * currspeed);
  stepper.runSpeed();
}

Instalando las librerías

Primero, necesitamos dos librerías. IRremote, que se usa para leer e interpretar las señales enviadas desde el mando IR. Y AccelStepper, que nos facilitará mucho el control del motor paso a paso. Si no tienes ya estas dos librerías instaladas, tendrás que instalarlas.

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

Definiendo las constantes

A continuación, definimos las constantes que usaremos en el resto del código. Primero, definimos los pines para el sensor IR (PIN 8) y los cuatro pines de salida de la placa Arduino que están conectados a los pines de entrada del driver del motor paso a paso (IN1_PIN, …, IN4_PIN)

#define IR_RECEIVE_PIN 8

#define IN1_PIN 12
#define IN2_PIN 11
#define IN3_PIN 10
#define IN4_PIN 9

Además, necesitamos indicar a la librería del motor paso a paso qué tipo de motor hemos conectado (HALF4WIRE). También queremos especificar una velocidad máxima y mínima (1000…100). Para más detalles, consulta nuestro tutorial 28BYJ-48 Stepper Motor with ULN2003 Driver and Arduino.

#define TYPE AccelStepper::HALF4WIRE

#define MAXSPEED 1000
#define MINSPEED 100

Definiendo las variables

Como queremos poder controlar la velocidad del motor paso a paso, necesitamos algunas variables además de las constantes anteriores. En concreto, necesitamos la velocidad actual (currspeed), la velocidad anterior del motor (lastspeed), y el incremento (inc) para acelerar o frenar el motor. También tenemos una variable dir, que puede ser +1 o -1 y determina la dirección de giro.

int currspeed = 500;
int prevspeed = 500;
int inc       = 100;
int dir       = +1;

Un consejo: si quieres cambiar la velocidad del motor más rápido o más lento, la variable inc es la que tienes que ajustar.

Por último, creamos el objeto del motor paso a paso (stepper), que necesitaremos para enviar comandos al motor.

auto stepper = AccelStepper(TYPE, IN1_PIN, IN3_PIN, IN2_PIN, IN4_PIN);

Ten en cuenta que las entradas están NO en orden secuencial, sino en el orden 1, 3, 2, 4. ¡Esto es así a propósito!

La función Setup

La función setup, donde inicializamos la placa, es muy sencilla. Solo indicamos a la librería del sensor qué pines se usan para el sensor IR y establecemos la velocidad inicial del motor paso a paso en MAXSPEED.

void setup() {
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  stepper.setMaxSpeed(MAXSPEED);
}

La función Loop

Toda la acción ocurre en el bucle principal. Aquí, primero esperamos al receptor IR. Si recibe una señal para decodificar, la decodificamos y extraemos el comando específico que ha enviado el mando IR. Dependiendo del valor de la variable command , aceleramos, frenamos, cambiamos de dirección o alternamos entre parar y arrancar.

void loop() {
  if (IrReceiver.decode()) {
    uint16_t command = IrReceiver.decodedIRData.command;
    if (command == 31) {         // VOL+
      prevspeed = currspeed;
      currspeed = min(currspeed + inc, MAXSPEED);
    } else if (command == 23) {  // VOL-
      prevspeed = currspeed;
      currspeed = max(currspeed - inc, MINSPEED);
    } else if (command == 21) { // MODE
      dir = -dir;
      delay(200);
    } else if (command == 7) {  // PLAY or PAUSE
      currspeed = currspeed > 0 ? 0 : prevspeed;
      delay(200);
    }
    IrReceiver.resume();
  }
  stepper.setSpeed(dir * currspeed);
  stepper.runSpeed();
}

Los códigos de comando están asignados a teclas específicas (Vol+->31, Vol–>23, Mode->21, Play/Pause->7) del mando IR. ¡Esta asignación dependerá del mando IR que estés usando! Para averiguar qué teclas corresponden a qué códigos de comando en tu mando, consulta nuestro tutorial sobre How to use an IR receiver and remote with Arduino.

Hay algunos detalles interesantes en el código. Primero, si aceleramos, debemos evitar superar MAXSPEED. La función min() se encarga de eso. De forma similar, cuando frenamos, usamos la función max() para asegurarnos de no bajar de MINSPEED.

Cambiar de dirección es fácil: cada vez que pulso MODE en mi mando, el receptor IR lee el código de comando 21 y simplemente cambiamos el signo de la variable dir . Ten en cuenta que la variable dir se usa más adelante en el código cuando se establece la velocidad mediante stepper.setSpeed(dir*currspeed), y determina la dirección de giro (+1 = sentido horario, -1 = antihorario).

El último comando es alternar entre marcha y parada usando la tecla PLAY/PAUSE de mi mando. Usamos un ternary condition (c ? a : b) aquí para comprobar si la velocidad actual es mayor que cero. Si es así, significa que el motor está funcionando y ponemos la velocidad actual a cero para parar. Si el motor no está funcionando (velocidad cero), ponemos la velocidad a la última velocidad conocida (prevspeed).

Aplicaciones

Se pueden hacer muchas cosas con un motor paso a paso controlado por IR. Aquí tienes algunas ideas divertidas y posibles aplicaciones:

Persianas o cortinas automáticas

Usa el motor paso a paso para controlar la apertura y cierre de persianas o cortinas en respuesta a comandos del mando IR. Puede ser una adición muy práctica para sistemas de domótica.

Brazo robótico

Construye un pequeño brazo robótico que puedas controlar con el mando IR. El motor paso a paso puede usarse para mover el brazo y permitirle recoger y manipular objetos.

Comedero automático para mascotas

Crea un comedero automático para mascotas que dispense comida a horas específicas o en respuesta a comandos del mando IR. El motor paso a paso puede controlar el mecanismo de liberación de la comida.

Sistema de riego automático para plantas

Construye un sistema que riegue las plantas automáticamente según un horario o por comandos del mando IR. El motor paso a paso puede controlar el flujo de agua o el movimiento de un brazo de riego.

Abridor de puerta de garaje

Usa el motor paso a paso para controlar la apertura y cierre de una puerta de garaje en respuesta a comandos del mando IR. Puede ser una mejora útil para un sistema de domótica.

Aspiradora robótica

Crea una pequeña aspiradora robótica que puedas controlar con el mando IR. El motor paso a paso puede controlar el movimiento de la aspiradora, permitiéndole moverse por la habitación.

Comedero automático para peces

Construye un comedero automático para peces que dispense comida a horas específicas o en respuesta a comandos del mando IR. El motor paso a paso puede controlar el mecanismo de liberación.

Cerradura inteligente

Usa el motor paso a paso para controlar el cierre y apertura de una puerta en respuesta a comandos del mando IR. Puede ser una adición muy cómoda para un sistema de domótica.

Abridor automático de ventanas

Crea un sistema que abra y cierre ventanas automáticamente según la temperatura o comandos del mando IR. El motor paso a paso puede controlar el movimiento de la ventana.

Barman robótico

Construye un barman robótico que pueda mezclar y servir bebidas según comandos del mando IR. El motor paso a paso puede controlar el movimiento del mecanismo dispensador de bebidas.

Conclusiones

En este tutorial, hemos aprendido cómo controlar un motor paso a paso 28byj-48 usando un mando IR y un driver ULN2003 con la ayuda de una placa Arduino. Siguiendo los pasos de esta guía, ahora deberías poder integrar estos componentes en tus propios proyectos y crear movimientos precisos de motor.

Empezamos reuniendo las piezas necesarias, incluyendo el motor paso a paso 28byj-48, un mando IR, un driver ULN2003 y una placa Arduino. Después conectamos estos componentes, asegurándonos de que el cableado era correcto y seguro.

A continuación, escribimos el código para Arduino para recibir señales del mando IR y traducirlas en movimientos específicos del motor. Utilizando la librería IRremote, pudimos capturar e interpretar fácilmente las señales enviadas por el mando. Luego usamos el driver ULN2003 para controlar el motor paso a paso, proporcionando la energía y señales necesarias para mover el motor en la dirección y velocidad deseadas.

En resumen, controlar un motor paso a paso 28byj-48 con un mando IR usando un driver ULN2003 es un proyecto divertido y práctico que abre un mundo de posibilidades para la automatización y la robótica. Ya sea que estés construyendo un slider para cámara, un brazo robótico o cualquier otro proyecto que requiera control preciso de motores, este tutorial te ha dado los conocimientos y habilidades necesarios para empezar.

Esperamos que este tutorial te haya resultado útil y que te haya inspirado a explorar más posibilidades con motores paso a paso y Arduino. No dudes en consultar la sección de Enlaces para más recursos y proyectos relacionados con el control de motores paso a paso. ¡Feliz creación!

Preguntas frecuentes

Aquí tienes algunas preguntas frecuentes sobre cómo controlar un motor paso a paso 28byj-48 con un mando IR usando un driver ULN2003:

P: ¿Puedo usar un motor paso a paso diferente con este montaje?

R: Sí, puedes usar un motor paso a paso diferente siempre que tenga especificaciones compatibles. Asegúrate de comprobar el voltaje, la corriente y los pasos por revolución del motor para garantizar la compatibilidad con el driver ULN2003. Consulta nuestros tutoriales sobre alternativas driver boards and stepper motors.

P: ¿Puedo usar un driver diferente en vez del ULN2003?

R: Sí, puedes usar un driver diferente como el A4988 o el DRV8825. Sin embargo, tendrás que modificar el código para que coincida con la configuración de pines y señales de control del nuevo driver.

P: ¿Puedo controlar varios motores paso a paso con este montaje?

R: Sí, puedes controlar varios motores paso a paso conectando cada motor a un driver ULN2003 diferente y usando distintos pines del Arduino para cada driver. Tendrás que modificar el código para controlar cada motor por separado.

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

R: Sí, puedes usar un microcontrolador diferente como ESP32 o Raspberry Pi. Sin embargo, tendrás que adaptar el código al lenguaje de programación y la configuración de pines del microcontrolador elegido.

P: ¿Cómo puedo alimentar el motor paso a paso?

R: El motor paso a paso puede alimentarse usando una fuente de alimentación externa. Asegúrate de conectar el terminal positivo de la fuente al pin VCC del driver ULN2003 y el terminal negativo al pin GND. El voltaje de la fuente debe coincidir con el voltaje nominal del motor (5-12V).

P: ¿Puedo controlar el motor paso a paso de forma inalámbrica?

R: Sí, puedes controlar el motor paso a paso de forma inalámbrica usando un módulo de comunicación inalámbrica como Bluetooth o Wi-Fi. Tendrás que integrar el protocolo de comunicación adecuado en tu código y establecer la conexión entre el microcontrolador y el módulo inalámbrico.

Si tienes cualquier otra pregunta o duda, no dudes en preguntar en la sección de comentarios de abajo o consulta los enlaces proporcionados para más información.

Enlaces

Aquí tienes algunos enlaces a tutoriales relacionados: