Saltar al contenido
Contenido de Arduino

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

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

ComponenteSe conecta aNota
ULN2003, IN1Pin 8
ULN2003, IN2Pin 9
ULN2003, IN3Pin 10
ULN2003, IN4Pin 11
ULN2003, +Raíl de 5V del módulo de alimentación
ULN2003, −Raíl GND del módulo de alimentación
MotorConector blanco del ULN2003
Receptor IR, SPin 12
Receptor IR, + y −5V y GND del Arduino
GND del ArduinoRaíl GND del módulo de alimentaciónImprescindible: 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

  1. 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.
  2. Conecta el motor al ULN2003, y el ULN2003 al Arduino y al módulo según la tabla.
  3. Une el GND del Arduino con el raíl GND del módulo.
  4. Sustituye en el código los dos códigos de tecla por los de tu mando.
  5. 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.