Ir al contenido
← Volver a Formación Arduino Intermedio

22. Motor paso a paso: posicionador angular

Controla la posición exacta de un motor 28BYJ-48 con un potenciómetro. La base de impresoras 3D, CNC y robots de precisión.

Dificultad: Intermedio · Tiempo: 55 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Genera las secuencias de paso
sin foto
Motor paso a paso 28BYJ-48 5 V
Motor 28BYJ-48 unipolar
sin foto
Driver ULN2003
Driver del motor
sin foto
Potenciómetro rotativo B5K (5 kΩ)
Selecciona la posición
sin foto
Portapilas 4×AA
Alimenta el motor (5 V)
Breadboard 830 puntos
Breadboard 830 puntos
Montaje

🎯 Qué vas a aprender

La diferencia entre un motor DC (gira, sin saber dónde) y un motor paso a paso (gira en incrementos exactos y conoce su posición). Usarás el driver ULN2003 y mapearás un potenciómetro a un ángulo concreto.

📚 Teoría: pasos y driver ULN2003

Un stepper avanza en pasos discretos energizando sus bobinas en secuencia. El 28BYJ-48 da 2048 medios-pasos por vuelta (con su reductora), o sea ~0,176° por paso: muy preciso. El ULN2003 es un array de transistores que amplifica las señales del Arduino para mover las bobinas (que piden más corriente de la que da un pin).

⚠ AtenciónEl motor consume hasta ~250 mA. Aliméntalo con un pack de pilas o fuente de 5 V independiente, con GND común con el Arduino. El driver lleva un LED de alimentación.

🔌 Conexiones

ULN2003Conexión
IN1–IN4D8, D9, D10, D11
VCC motorPack 5 V (+)
GNDPack (−) + GND Arduino
Motorconector blanco del 28BYJ-48
Potenciómetro cursorA0

💻 Código completo

// Posicionador con stepper 28BYJ-48 y potenciómetro
#include 

const int PASOS_VUELTA = 2048;   // 28BYJ-48 con reductora
// orden IN1, IN3, IN2, IN4 (cruzado, típico de esta placa)
Stepper motor(PASOS_VUELTA, 8, 10, 9, 11);

const int PIN_POT = A0;
int posActual = 0;

void setup() {
  motor.setSpeed(10);   // rpm
}

void loop() {
  int lectura = analogRead(PIN_POT);
  int objetivo = map(lectura, 0, 1023, 0, PASOS_VUELTA); // posición deseada

  int diff = objetivo - posActual;
  if (abs(diff) > 5) {          // zona muerta para no vibrar
    motor.step(diff > 0 ? 1 : -1);
    posActual += (diff > 0 ? 1 : -1);
  }
}
💡 ConsejoEl orden de pines 8,10,9,11 (cruzado) es el correcto para la mayoría de placas ULN2003 del 28BYJ-48. Si el motor vibra sin girar, prueba el orden 8,9,10,11.

🛠️ Montaje paso a paso

  1. Enchufa el motor al conector del ULN2003.
  2. Cablea IN1–IN4 a D8–D11.
  3. Alimenta el driver con el pack de 5 V (GND común).
  4. Conecta el potenciómetro a A0 y sube el sketch.
  5. Gira el potenciómetro: el eje sigue la posición.

🧩 Resolución de problemas

SíntomaCausaSolución
Vibra sin girarOrden de bobinas erróneoCambia el orden de pines
Gira a tironesVelocidad altaBaja setSpeed
No se mueveSin alimentación de motorRevisa el pack y el LED del driver

🚀 Para ir más lejos

  • Construye un reloj de agujas o un slider de cámara.
  • Controla la posición desde un menú en la OLED.
← Volver a Formación Arduino