Ir al contenido
← Volver a Formación Arduino Avanzado

23. Control de velocidad de motor DC con PWM y relé

Arranca, para e invierte un motor DC controlando su velocidad por PWM. Base de coches, ventiladores y cintas transportadoras.

Dificultad: Avanzado · Tiempo: 70 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Genera PWM y dirección
sin foto
Motor DC cepillado 130
Motor DC cepillado 130
sin foto
Módulo relé 1 canal 5 V
Inversión de sentido (opcional)
sin foto
Potenciómetro rotativo B5K (5 kΩ)
Control de velocidad
sin foto
Portapilas 6×AA barrel
Alimentación del motor
Breadboard 830 puntos
Breadboard 830 puntos
Montaje

🎯 Qué vas a aprender

A manejar un actuador de potencia inductiva con seguridad: control de velocidad por PWM a través de un transistor/driver, protección con diodo y la importancia de aislar la electrónica de control. Opcionalmente, inversión de sentido con relé.

📚 Teoría: PWM en motores y diodo de protección

Igual que atenuábamos un LED (proyecto 04), el PWM regula la velocidad de un motor variando la potencia media. Pero un motor es inductivo: al cortar la corriente genera un pico de tensión inverso que puede dañar al transistor. Por eso se pone un diodo volante (flyback) en paralelo con el motor.

⚠ AtenciónNo conectes el motor directamente a un pin de Arduino: lo destruirías. Usa un transistor (MOSFET/NPN) o un módulo driver entre el pin PWM y el motor. El motor se alimenta de su pack; el Arduino solo controla la base/puerta del transistor. GND común.

🔌 Conexiones (con transistor NPN)

ComponenteConexión
Pin PWM D9→ resistencia 1 kΩ → base del transistor
Emisor transistorGND común
Colector→ motor (−)
Motor (+)Pack pilas (+)
Diodoen paralelo con el motor (cátodo a +)
Potenciómetro cursorA0

💻 Código completo

// Control de velocidad de motor DC por PWM
const int PIN_PWM = 9;    // a la base del transistor (vía 1k)
const int PIN_POT = A0;

void setup() {
  pinMode(PIN_PWM, OUTPUT);
}

void loop() {
  int lectura = analogRead(PIN_POT);
  int vel = map(lectura, 0, 1023, 0, 255);

  // pequeño umbral de arranque: por debajo no gira, solo zumba
  if (vel < 40) vel = 0;

  analogWrite(PIN_PWM, vel);
  delay(20);
}
💡 ConsejoLos motores tienen un umbral de arranque: con muy poco PWM solo vibran. El código fuerza 0 por debajo de 40 para evitar ese zumbido inútil.

🛠️ Montaje paso a paso

  1. Monta el transistor: base (vía 1 kΩ) a D9, emisor a GND, colector al motor.
  2. Conecta el motor entre el colector y el (+) del pack.
  3. Coloca el diodo de protección en paralelo con el motor.
  4. Une GND del pack con GND del Arduino.
  5. Sube el sketch y regula la velocidad con el potenciómetro.

🧩 Resolución de problemas

SíntomaCausaSolución
Arduino se reiniciaSin GND común o motor en la placaAliméntalo aparte, GND común
Motor no arrancaUmbral altoBaja el límite de arranque
Transistor se calientaCorriente excesivaUsa MOSFET o motor de menos consumo

🚀 Para ir más lejos

  • Añade un relé DPDT para invertir el sentido de giro.
  • Usa dos motores para un coche (base del proyecto 24).
  • Lee el encoder de la rueda Conga para medir velocidad real.
← Volver a Formación Arduino