Saltar al contenido
Contenido de Arduino

Lección 1.13: Motor DC

El motor DC es el actuador más común: ventiladores, ruedas, bombas. Para manejarlo desde el Arduino hacen falta dos cosas que un pin no tiene: corriente y la posibilidad de invertir la polaridad.

Material

Cómo funciona

Un motor pequeño consume cientos de miliamperios, y bastantes más al arrancar. Un pin da unos 20 mA, así que conectarlo directamente dañaría la placa. Además, al cortarle la corriente, el motor devuelve picos de tensión que hay que absorber.

Un puente H son cuatro interruptores dispuestos en forma de H alrededor del motor: cerrando dos en diagonal, la corriente lo atraviesa en un sentido; cerrando los otros dos, en el contrario. El L293D tiene dos puentes H y los diodos de protección dentro.

Las entradas 1A y 2A eligen el sentido: HIGH y LOW gira hacia un lado, LOW y HIGH hacia el otro, y con las dos iguales el motor frena. La velocidad se regula con PWM en EN1: analogWrite() entre 0 y 255.

El L293D se queda con algo más de un voltio en sus transistores, así que el motor recibe menos de lo que da la fuente. Para un motor de 3–6 V alimentado a 5 V es suficiente.

Conexiones

ComponenteSe conecta aNota
L293D, EN1 (1)Pin 5Pin con PWM
L293D, 1A (2)Pin 7
L293D, 1Y (3)Motor, terminal 1
L293D, GND (4, 5, 12, 13)GND
L293D, 2Y (6)Motor, terminal 2
L293D, 2A (7)Pin 8
L293D, VCC2 (8)Raíl de 5V del módulo de alimentaciónAlimentación del motor
L293D, VCC1 (16)Raíl de 5V del módulo de alimentaciónAlimentación de la lógica
GND del ArduinoRaíl GND del módulo de alimentaciónGND común

Código

// Acelera en un sentido, se detiene e invierte el giro.
const int ENABLE_PIN = 5; // EN1, con PWM
const int IN1_PIN = 7;    // 1A
const int IN2_PIN = 8;    // 2A

void setup() {
  pinMode(ENABLE_PIN, OUTPUT);
  pinMode(IN1_PIN, OUTPUT);
  pinMode(IN2_PIN, OUTPUT);
}

void spin(bool forward, int speed) {
  digitalWrite(IN1_PIN, forward ? HIGH : LOW);
  digitalWrite(IN2_PIN, forward ? LOW : HIGH);
  analogWrite(ENABLE_PIN, speed); // de 0 a 255
}

void stopMotor() {
  analogWrite(ENABLE_PIN, 0);
}

void loop() {
  // Rampa de aceleración hacia delante.
  for (int speed = 80; speed <= 255; speed += 5) {
    spin(true, speed);
    delay(50);
  }
  delay(2000);

  stopMotor();
  delay(1000); // deja que se pare antes de invertir

  spin(false, 180);
  delay(3000);

  stopMotor();
  delay(1000);
}

Qué hace el código

  • spin() fija el sentido con 1A y 2A y la velocidad con el PWM de EN1.
  • La rampa empieza en 80 y no en 0: por debajo de cierto valor el motor no tiene fuerza para arrancar y solo zumba.
  • stopMotor() pone EN1 a 0: el motor queda suelto y se para por inercia.
  • La pausa antes de invertir evita cambiar de sentido a toda velocidad, que dispara la corriente.

Paso a paso

  1. Encaja el módulo de alimentación con su − sobre la línea azul y su + sobre la roja, y elige 5 V.
  2. Coloca el L293D a caballo sobre el canal central. La muesca marca el lado de los pines 1 y 16.
  3. Cablea según la tabla y une el GND del Arduino con el del módulo.
  4. Conecta el adaptador al módulo y sube el código.

Resultado

El motor acelera durante unos segundos, gira a toda velocidad, se para y gira en sentido contrario a velocidad media.

Si no funciona

  • Si el motor zumba pero no gira, la velocidad es demasiado baja o la fuente no da corriente suficiente.
  • Si gira siempre en el mismo sentido, revisa los cables de 1A y 2A.
  • Si el Arduino se reinicia al arrancar el motor, este está tomando corriente de la placa: VCC2 tiene que ir al módulo de alimentación.
  • Si no pasa nada, comprueba que los puentes del módulo no estén en OFF y que su LED está encendido.