Lección 1.9: Motor paso a paso con mando
Esta lección junta dos piezas: el receptor infrarrojo de la lección 1.7 y un motor paso a paso. Al pulsar una tecla del mando, el motor da una vuelta exacta en un sentido o en el otro.
Material
- 1×Arduino Uno
- 1×Protoboard
- 1×Módulo de alimentación
- 1×Motor paso a paso 28BYJ-48
- 1×Driver ULN2003
- 1×Receptor infrarrojo y mando
- Cables de puente
Librerías
- Stepper — incluida con el IDE
- IRremote
Cómo funciona
Un motor paso a paso tiene varias bobinas alrededor del rotor. Activándolas en orden, el rotor avanza un paso cada vez, y contar pasos equivale a medir el ángulo sin ningún sensor.
El 28BYJ-48 da 32 pasos por vuelta de su eje interno y lleva una reductora de aproximadamente 64:1, así que el eje de salida necesita unos 2048 pasos por vuelta. A cambio, es lento: unas 15 vueltas por minuto como máximo.
Cada bobina consume más de lo que da un pin, por eso entre el Arduino y el motor va el ULN2003. Y el motor se alimenta de una fuente aparte: desde los 5V del Arduino puede provocar reinicios.
Datos técnicos
- Pasos por vuelta
- 2048, con la reductora
- Reductora
- ≈ 64:1
- Alimentación
- 5 V
- Velocidad máxima
- ≈ 15 rpm
Conexiones
| Componente | Se conecta a | Nota |
|---|---|---|
| ULN2003, IN1 | Pin 8 | |
| ULN2003, IN2 | Pin 9 | |
| ULN2003, IN3 | Pin 10 | |
| ULN2003, IN4 | Pin 11 | |
| ULN2003, + | Raíl de 5V del módulo de alimentación | |
| ULN2003, − | Raíl GND del módulo de alimentación | |
| Motor | Conector blanco del ULN2003 | |
| Receptor IR, S | Pin 12 | |
| Receptor IR, + y − | 5V y GND del Arduino | |
| GND del Arduino | Raíl GND del módulo de alimentación | Imprescindible: sin GND común, las señales no tienen referencia |
Código
// Una vuelta en cada sentido según la tecla del mando.
#include <Stepper.h>
#include <IRremote.hpp>
const int STEPS_PER_REV = 2048; // una vuelta del eje de salida
const int IR_PIN = 12;
// Cambia estos códigos por los que leíste en la lección del receptor.
const uint16_t KEY_CLOCKWISE = 0x46;
const uint16_t KEY_COUNTERCLOCKWISE = 0x15;
// Orden IN1, IN3, IN2, IN4: es el que necesita el 28BYJ-48.
Stepper stepper(STEPS_PER_REV, 8, 10, 9, 11);
void setup() {
stepper.setSpeed(10); // vueltas por minuto
IrReceiver.begin(IR_PIN);
}
void release() {
// Corta la corriente de las bobinas para que no se calienten en reposo.
for (int pin = 8; pin <= 11; pin++) digitalWrite(pin, LOW);
}
void loop() {
if (!IrReceiver.decode()) return;
uint16_t command = IrReceiver.decodedIRData.command;
bool repeat = IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT;
IrReceiver.resume();
if (repeat) return;
if (command == KEY_CLOCKWISE) stepper.step(STEPS_PER_REV);
if (command == KEY_COUNTERCLOCKWISE) stepper.step(-STEPS_PER_REV);
release();
}Qué hace el código
- Stepper stepper(2048, 8, 10, 9, 11); lleva los pines en el orden IN1, IN3, IN2, IN4. Con el orden natural el motor vibra sin girar.
- setSpeed(10) son vueltas por minuto del eje de salida. Por encima de 15 el motor empieza a perder pasos.
- step() bloquea el programa hasta terminar la vuelta: mientras gira, el mando no se atiende.
- release() apaga las bobinas al acabar. Sin ella, el motor sigue consumiendo y calentándose aunque esté quieto.
Paso a paso
- Encaja el módulo de alimentación en la protoboard, con su − sobre la línea azul y su + sobre la roja, y elige 5 V con los puentes.
- Conecta el motor al ULN2003, y el ULN2003 al Arduino y al módulo según la tabla.
- Une el GND del Arduino con el raíl GND del módulo.
- Sustituye en el código los dos códigos de tecla por los de tu mando.
- Conecta el adaptador al módulo, sube el código y pulsa las teclas.
Resultado
Una tecla da una vuelta completa en un sentido y la otra, en el contrario. Mientras gira, los LEDs del driver se encienden en secuencia.
Si no funciona
- Si el motor vibra pero no gira, el orden de los pines en el código no es IN1, IN3, IN2, IN4.
- Si los LEDs del driver se encienden y el motor no se mueve, revisa el conector blanco y el puente de encendido de la placa del driver.
- Si no reacciona a las teclas, comprueba sus códigos con el sketch de la lección 1.7.
- Si la placa se reinicia al girar, el motor está tirando de los 5V del Arduino: aliméntalo desde el módulo.