En este proyecto, aprenderemos a controlar un motor paso a paso 28BYJ-48 utilizando un control remoto infrarrojo y un Arduino. El motor podrá girar en ambas direcciones, detenerse, y ajustar su velocidad mediante comandos enviados desde el control remoto. Este proyecto es ideal para aplicaciones donde se necesite control inalámbrico y preciso de un motor paso a paso, como en robots, cámaras, o sistemas de automatización.
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagramas
El 28BYJ-48 es un motor paso a paso de bajo costo que funciona con el driver ULN2003. Este driver nos permite controlar el motor fácilmente desde un microcontrolador como el Arduino. Además, empleamos la librería IRremote para recibir las señales infrarrojas del control remoto, lo que nos permite manejar el motor de manera inalámbrica y sin botones físicos.
En este proyecto, implementamos los siguientes controles:
- Giro a la derecha: Presionando un botón específico, el motor girará continuamente en la dirección de las agujas del reloj hasta que se envíe otro comando.
- Giro a la izquierda: Con otro botón, el motor girará en sentido contrario.
- Parada: Un tercer botón detendrá el motor.
- Ajuste de velocidad: Se puede aumentar o disminuir la velocidad del motor en un rango de 1 a 10 utilizando dos botones adicionales del control remoto.
Durante el proyecto, utilizamos el monitor serial del Arduino para mostrar el código infrarrojo recibido, lo que nos permite identificar fácilmente los botones de control y verificar su funcionamiento. Este proyecto es modular y permite ajustes según las necesidades del usuario, como cambiar la velocidad máxima o ajustar los códigos del control remoto.
Componentes electrónicos
Arduino mini pro
El Arduino Pro Mini es una placa de microcontrolador basada en el ATmega328 .
Tiene 14 pines de entrada / salida digital (de los cuales 6 se pueden usar como salidas PWM), 6 entradas analógicas, un resonador integrado, un botón de reinicio y orificios para montar encabezados de pines. Se puede conectar un encabezado de seis pines a un cable FTDI o una placa de conexión Sparkfun para proporcionar alimentación USB y comunicación a la placa.
El Arduino Pro Mini está diseñado para su instalación semipermanente en objetos o exposiciones. La placa viene sin encabezados pre montados, lo que permite el uso de varios tipos de conectores o la soldadura directa de cables. El diseño del pin es compatible con el Arduino Mini.
Hay dos versiones del Pro Mini. Uno corre a 3.3V y 8 MHz, el otro a 5V y 16 MHz.
Microcontrolador | ATmega328 * |
Fuente de alimentación de la placa | 3,35-12 V (modelo de 3,3 V) o 5-12 V (modelo de 5 V) |
Voltaje de funcionamiento del circuito | 3.3V o 5V (dependiendo del modelo) |
Pines de E / S digitales | 14 |
Pines PWM | 6 6 |
UART | 1 |
SPI | 1 |
I2C | 1 |
Pines de entrada analógica | 6 6 |
Interrupciones externas | 2 |
Corriente CC por pin de E / S | 40 mA |
Memoria flash | 32 KB de los cuales 2 KB utilizados por el gestor de arranque * |
SRAM | 2 KB * |
EEPROM | 1 KB * |
Velocidad de reloj | 8 MHz (versiones de 3.3V) o 16 MHz (versiones de 5V) |
Pines hembra
Zócalo para arduino nano
Módulo receptor infrarrojo ky-022
Tamaño: 6.4 * 7.4 * 5.1MM, ángulo de aceptación 90 °, voltaje de trabajo 2.7-5.5V.
Frecuencia 37.9KHZ, recibiendo la distancia 18 m.
Rechazo de luz diurna hasta 500LUX, capacidad de interferencia electromagnética, IC dedicado de infrarrojos incorporado.
Ampliamente utilizado: estéreo, TV, VCR, CD, decodificadores, marco de fotos digital, audio para el automóvil, juguetes de control remoto, receptores de satélite, disco duro, aire acondicionado, calefacción, ventiladores, iluminación y otros electrodomésticos.
Pinout:
1 …. GND (-)
2 …. + 5V
3 …. Salida (S)
Motor paso a paso 28BYJ-48
Los parámetros de este motor paso a paso son:
- Modelo: 28BYJ-48 – 5V
- Tensión nominal: 5V (o 12 V, valor indicado en la parte trasera).
- Cantidad de fases: 4.
- Reductor de velocidad: 1/64
- Ángulo de paso: 5,625° / 64
- Frecuencia: 100Hz
- Resistencia en CC: 50Ω ±7 % (25° C)
- Frecuencia con tracción: > 600Hz
- Frecuencia sin tracción: > 1000Hz
- Torque con tracción: >34,3mN.m (120Hz)
- Torque en autoposicionamiento: >34,3mN.m
- Torque con fricción: 600-1200 gf.cm
- Arrastre en torque: 300 gf.cm
- Resistencia de aislación > 10MΩ (500V)
- Aislación eléctrica: 600VAC/1mA/1s
- Grado de aislación: A
- Aumento de temperatura: < 40K (120Hz)
- Ruido: < 35dB (120Hz, sin carga, 10cm)
ULN2003APG
Especificaciones principales:
- 500 mA de corriente de colector nominal (de salida única)
- 50 V de salida (hay una versión que soporta 100 V de salida)
- Incluye diodos de retorno de salida
- Entradas compatibles con TTL y 5-V CMOS lógica
Control remoto x infrarrojo
Circuito
Esquema de conexión:
- Conecta los 4 pines del motor a las salidas del driver ULN2003. Estas suelen ser los pines IN1, IN2, IN3 e IN4.
- Conecta los pines IN1 a D6, IN2 a D7, IN3 a D8, e IN4 a D9 en la placa Arduino.
- Conecta el pin de señal del receptor IR al pin D2 del Arduino.
- Conecta la alimentación y la tierra del motor y el receptor IR a 5V y GND respectivamente.
Instalación de librerías:
- IRremote: Esta librería se utiliza para recibir señales infrarrojas del control remoto. Para instalarla, abre el IDE de Arduino y ve a Sketch > Incluir Librería > Administrar Bibliotecas. Busca “IRremote” e instálala.
- Stepper: Es una librería estándar que ya viene incluida en el IDE de Arduino, por lo que no necesitas instalar nada adicional para controlar el motor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#include <IRremote.h> #include <Stepper.h> // Pines del motor paso a paso #define IN1 6 #define IN2 7 #define IN3 8 #define IN4 9 // Configuración del motor const int pasosPorRevolucion = 2048; // Pasos para una revolución completa Stepper motor(pasosPorRevolucion, IN1, IN3, IN2, IN4); // Pines del receptor IR const int receptorIR = 2; // Variables para el control remoto IRrecv irrecv(receptorIR); decode_results resultados; // Códigos IR para las funciones (ajusta estos códigos según tu control remoto) unsigned long codigoDerecha = 0x7EC31EF7; // Cambia estos códigos por los de tu control unsigned long codigoIzquierda = 0xC101E57B; unsigned long codigoStop = 0x5B83B61B; unsigned long codigoAumentarVelocidad = 0xF63C8657; // Código para aumentar la velocidad unsigned long codigoDisminuirVelocidad = 0x2A89195F; // Código para disminuir la velocidad // Variables de control enum EstadoMotor { PARADO, GIRANDO_DERECHA, GIRANDO_IZQUIERDA }; EstadoMotor estadoActual = PARADO; int velocidad = 6; // Velocidad inicial, valor entre 1 y 12 void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Iniciar receptor IR motor.setSpeed(velocidad); // Ajusta la velocidad inicial del motor } void loop() { // Leer señal del control remoto if (irrecv.decode(&resultados)) { unsigned long codigo = resultados.value; Serial.print("Código IR recibido: "); Serial.println(codigo, HEX); // Mostrar el código en hexadecimal if (codigo == codigoDerecha) { estadoActual = GIRANDO_DERECHA; Serial.println("Cambiar a giro hacia la derecha"); } else if (codigo == codigoIzquierda) { estadoActual = GIRANDO_IZQUIERDA; Serial.println("Cambiar a giro hacia la izquierda"); } else if (codigo == codigoStop) { estadoActual = PARADO; Serial.println("Detener motor"); } else if (codigo == codigoAumentarVelocidad) { cambiarVelocidad(true); // Aumentar velocidad } else if (codigo == codigoDisminuirVelocidad) { cambiarVelocidad(false); // Disminuir velocidad } irrecv.resume(); // Preparar el receptor para la próxima señal } // Ejecutar acción según el estado actual switch (estadoActual) { case GIRANDO_DERECHA: motor.step(1); // Mover en pasos pequeños en dirección derecha break; case GIRANDO_IZQUIERDA: motor.step(-1); // Mover en pasos pequeños en dirección izquierda break; case PARADO: // No hacer nada, el motor está detenido break; } } void cambiarVelocidad(bool aumentar) { if (aumentar && velocidad < 12) { velocidad++; Serial.print("Aumentar velocidad: "); } else if (!aumentar && velocidad > 1) { velocidad--; Serial.print("Disminuir velocidad: "); } motor.setSpeed(velocidad); // Actualizar velocidad del motor Serial.println(velocidad); } |
Explicación del código:
- Control por infrarrojo: El receptor IR recibe las señales del control remoto, y el código IR se imprime en el monitor serial para verificar que es el correcto.
- Giro del motor: Dependiendo del botón que se presiona en el control, el motor gira hacia la derecha o la izquierda. También se puede detener con el botón correspondiente.
- Control de velocidad: Hay dos botones configurados para aumentar o disminuir la velocidad del motor en un rango de 1 a 10.
- Máquina de estados: El motor está en uno de los tres estados: PARADO, GIRANDO_DERECHA, o GIRANDO_IZQUIERDA, y actúa según el estado actual.
Ajustes adicionales:
- Códigos IR: Si los códigos proporcionados no coinciden con los de tu control remoto, puedes identificarlos abriendo el monitor serial y presionando los botones del control.
- Velocidad del motor: Si necesitas ajustar la velocidad del motor, puedes cambiar la variable
velocidad
entre 1 (mínima) y 10 (máxima). - Pasos del motor: La configuración de
motor.step(1)
define el tamaño del paso que el motor hace en cada ciclo delloop
. Puedes ajustarlo si necesitas que el motor gire más rápido o más lento.
Pruebas y configuración final:
- Verifica los códigos IR: Abre el monitor serial para asegurarte de que los códigos que imprime coinciden con los botones que quieres usar.
- Ajusta la velocidad: Usa los botones del control remoto para ajustar la velocidad del motor según tu necesidad.
No te pierdas ningún video más suscríbete a nuestro canal de telegram https://t.me/carlosvolt_electronica_robotica
PROYECTO RECOMENDADO