Control de Motores DC con el Módulo L298N - pensactius/Tutoriales GitHub Wiki

Información extraída de Last Minute ENGINEERS

Si queremos construir un robot, es probable que necesitemos usar motores de corriente continua. Una forma fácil y barata de controlar motores de corriente continua (DC) es usando un módulo L298N. Este módulo puede controlar la velocidad y sentido de dos motores DC.

Además puede controlar un motor paso a paso (como p.ej. un paso a paso tipo NEMA 17).

Control de Motores DC

Para controlar un motor DC completamente deberíamos poder determinar su velocidad y sentido de giro. Esto puede conseguirse combinando dos técnicas:

  • PWM - Para controlar la velocidad de rotación
  • Puente en H - Para controlar el sentido de rotación

PWM - Control de velocidad

La velocidad de un motor DC puede controlarse variando su voltaje de entrada. Una técnica común para hacer esto es usar PWM (Pulse Width Modulation)

PWM es una técnica en la que se ajusta la media del voltaje de entrada enviando una serie de pulsos ENCENDIDO / APAGADO.

La media del voltaje es proporcional al ancho de los pulsos, conocido como ciclo de trabajo (duty cycle en inglés).

Cuanto mayor sea el ciclo de trabajo, mayor será el voltaje aplicado al motor DC (mayor velocidad) y cuanto menor sea el ciclo de trabajo, menor será el voltaje medio aplicado al motor (menor velocidad).

La siguiente figura ilustra la técnica del PWM usando varios ciclos de trabajo y las medias de voltajes resultantes.

Puente en H - Control de sentido de giro

El sentido de giro de un motor DC se puede controlar cambiando la polaridad del voltaje de entrada. Una técnica común para realizar esto es usar un puente en H.

Un puente en H es un circuito que contiene cuatro interruptores con el motor en el centro, formando una distribución en H (de ahí su nombre).

Cerrando dos interruptores concretos al mismo tiempo se invierte la polaridad del voltaje aplicada al motor. Esto provoca un cambio en el sentido de rotación del motor.

La animación siguiente muestra un puente en H en funcionamiento.

IC Controlador de Motor L298N

El núcleo del módulo lo forma este chip grande con ese aparatoso disipador, el chip L298N.

Este chip es un puente en H de dos canales, capaz de controlar un par de motores DC. Eso significa que puede controlar de forma individual cada motor, ideal para controlar robots de dos ruedas.

Fuente de Alimentación

El módulo L298N se alimenta a través de un terminal de tornillo (3.5mm) de tres pines. Consiste en un pin para alimentación de entrada de los motores (Vs), tierra (Gnd) y entrada de 5V para alimentar la lógica (Vss).

Atención El módulo L298N tiene dos pines de entradas de alimentación: Vss y Vs.

A través del pin Vs el puente en H obtiene la alimentación para mover los motores y puede variar entre 5 a 35V. Vss se usa normalmente para alimentar la lógica (señales de control ENA, IN1, IN2, etc.) y pueden variar entre 5 a 7V. Y ambos completan el circuito a través del ground común GND.

El módulo contiene un regulador de tensión de 5V que puede habilitarse o deshabilitarse con un jumper. Cuando el jumper está colocado, el regulador de 5V está habilitado. La alimentación de la lógica Vss proviene de la misma alimentación de los motores Vs. En este caso, el terminal 5V actúa como pin de salida y provee de 5V/0.5A.

Cuando el jumper no está puesto, el regulador de 5V está deshabilitado y debemos proporcionar los 5V para alimentar la lógica Vss por separado a través del terminal 5V.

AVISO:

Si la alimentación de motores está por debajo de 12V puedes colocar el jumper. Si es mayor de 12V, deberías quitar el jumper para evitar dañar el regulador interno de 5V.

Además NUNCA alimentes ambas entradas de 5V y de los motores cuando el jumper está colocado.

Caída de Tensión del L298N

El módulo L298N tiene una caída de tensión de unos 2V. Esto se debe a la caída de voltaje interna propia de los transistores que forman el puente en H.

Por tanto, si conectas una fuente de 12V por el terminal de alimentación de los motores, estos recibirán un voltaje de unos 10V. Para obtener la máxima velocidad del motor de 12V deberías alimentar el módulo con unos 14V.

Pines de Salida

El módulo L298N dispone de salidas para dos motores A y B, distribuidos en cada extremo con dos terminales de tipo tornillo de 3.5mm.

Se pueden conectar dos motores DC de voltajes entre 5 y 35V mediante estos terminales.

Cada canal del módulo puede dar hasta 2A a cada motor. No obstante, la corriente real suministrada dependerá del tipo de fuente de alimentación utilizada.

TODO: Fuentes de alimentación y Baterías

Pines de Control

Para cada canal del L298N hay dos tipos de pines de control que nos permiten controlar velocidad y sentido de rotación del motor DC.

Pines de Control de Sentido

Con los pines de control de sentido podemos controlar si el motor gira en un sentido o en otro. Estos pines controlan los interruptores internos del puente en H dentro del chip L298N.

El módulo tiene dos pines de control de sentido para cada canal. Los pines IN1 y IN2 controlan el sentido de giro del motor A, mientras que IN3 y IN4 el del motor B.

El sentido de giro del motor se controla aplicando o bien un 1 lógico (5V) o 0 (Gnd) a estas entradas. La siguiente table ilustra cómo afecta al movimiento del motor.

Entrada 1 Entrada 2 Sentido de Giro
L (0) L (0) Motor Parado
H (1) L (0) Adelante
L (0) H (1) Atrás
H (1) H (1) Motor Parado

Pines de Control de Velocidad

Los pines ENA y ENB se usan para encender o apagar cada motor, pero también se pueden usar para el control de velocidad.

Aplicando un 1 a estos pines los motores giran a máxima velocidad, aplicando un 0 los motores se paran. Pero usando PWM se puede controlar la velocidad de los motores.

El módulo suele venir de fábrica con un jumper en estos pines. Cuando el jumper correspondiente está colocado, el motor está habilitado y gira a máxima velocidad. Si quieres controlar la velocidad de giro mediante programación, deberás quitar el jumper y conectarlo a un pin que permita salida PWM.

Código Arduino - Controlando Dos Motores DC

// Conexiones Motor A
int enA = 9;
int in1 = 8;
int in2 = 7;
// Conexiones Motor B
int enB = 3;
int in3 = 5;
int in4 = 4;

void setup() {
    // Establece todos los pines de los motores como salida
    pinMode(enA, OUTPUT);
    pinMode(enB, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    
    // Estado inicial - Motores apagados
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
}

void loop() {
    // Máxima potencia para ambos motores
    setPower (255, 255);

    // Mueve ambos motores hacia adelante
    Forward ();
    delay (2000);

    // Para los dos motores
    Stop ();
    delay (2000);

    // Mueve ambos motores hacia atrás
    Backwards ();
    delay (2000);

    // Para ambos motores
    Stop ();
    delay (2000);
}

void setPower (int pwrA, int pwrB) {
    // Aplicamos PWM a ENA y ENB para controlar la velocidad de ambos motores.
    analogWrite (enA, pwrA);
    analogWrite (enB, pwrB);
}

void Stop () {
    digitalWrite (in1, LOW);
    digitalWrite (in2, LOW);    
    digitalWrite (in3, LOW);
    digitalWrite (in4, LOW);    
}

void Forward () {
    // Movemos ambos motores en el mismo sentido. 
    // Si los motores no se mueven ambos en la misma dirección simplemente
    // cambia el sentido de los cables OUT1, OUT2 o OUT3, OUT4.
    digitalWrite (in1, LOW);
    digitalWrite (in2, HIGH);

    digitalWrite (in3, LOW);
    digitalWrite (in4, HIGH);
}

void Backwards () {
    // Movemos ambos motores en sentido contrario
    // Si los motores no se mueven ambos en la misma dirección simplemente
    // cambia el sentido de los cables OUT1, OUT2 o OUT3, OUT4.
    digitalWrite (in1, HIGH);
    digitalWrite (in2, LOW);

    digitalWrite (in3, HIGH);
    digitalWrite (in4, LOW);
}