Proyecto 9.2

KEYES L298 Motor Driver

25 de agosto de 2016

En el siguiente tutorial vamos a ver como funciona el driver L298 de KEYES. Como su nombre indica, está basado en el CI L298 de ST Micro, un doble puente en H capaz de trabajar con alta corriente y tensión.

Con este driver podemos controlar cargas inductivas tales como relés, solenoides, un motor  paso a paso bipolar de cuatro hilos, y hasta dos motores de CC simultáneamente, pudiendo seleccionar por separado la velocidad y el sentido de giro.

En tutoriales anteriores trabajamos con el L293D, también de ST Micro. Este driver funciona a un máximo de 36V y 600mA. Comparado con su hermano pequeño, el L298 opera a 46V y 2A. En esta página podéis ver una descripción más detallada del módulo.

Descripción

Cada motor de CC se controla mediante tres entradas: ENA (Enable Motor A), IN1 (Input 1), IN2 (Input 2), para el motor A y ENB (Enable Motor B), IN3 (Input 3), IN4 (Input 4), para el motor B.

Los motores de CC se conectan en los terminales marcados como MOTOR A y MOTOR B.

Los jumpers J1, 2, 3 y 4 son para habilitar / deshabilitar las resistencias pull-up integradas.

J8 y 9 son para medir la corriente que suministra el driver, si así lo deseamos.

Para trabajar con Arduino lo mejor es dejar los jumpers como se muestra en la imagen, es decir, quitamos J1, 2, 3 y 4, y dejamos puestos los jumpers J8 y J9.

Hay otro jumper +5V_EN para habilitar / deshabilitar el regulador interno de +5V. Lo explico con detalle más abajo.

Como alimentar el módulo

Como la mayoría de drivers para motores, éste también necesita de dos alimentaciones para funcionar. Una de +5V para las señales lógicas y otra VMS de hasta 35V para los motores. Aunque el CI L298 soporta tensiones de 46V, se recomienda no sobrepasar los 35V.

Cuando colocamos el jumper en los pines +5V_EN, lo que hacemos es habilitar el regulador interno de +5V, con lo cual el módulo suministra 5V en los pines así marcados, para alimentar Arduino o lo que nuestro proyecto necesite, hasta un máximo de 500mA.

Hay dos formas de conectar la alimentación.

Esquema

En el ejemplo de aplicación vamos a controlar un solo motor. Se trata de un motor de CC desmontado del carro de una impresora de tinta HP, junto con el soporte de los inyectores.

He colocado dos microswitch como finales de carrera, uno a la derecha y otro a la izquierda.

Con un potenciómetro en A0, variamos la velocidad. Para ello la entrada ENA debe estar conectada en un pin PWM del Arduino. También se puede conectar ENA a un pin digital del Arduino y mediante la instrucción digitalWrite(ENA, HIGH)el motor gira a la velocidad nominal.

Mediante los pulsadores SW1 y SW2, damos la orden de movimiento a derechas o a izquierdas.

Con una fuente externa de 12V alimentamos en módulo en los terminales VMS y GND. El Arduino se alimenta del puerto USB del ordenador.

Sketch

LLegamos a la parte de control. Como explicaba más arriba, el driver necesita de tres entradas para cada motor de CC. ENA habilita el motor A, con IN1 e IN2 seleccionamos el sentido de giro.

La siguiente tabla de la verdad resume el funcionamiento del módulo. La tabla es válida también para las entradas ENA, IN3, IN4.

El sentido de giro depende además, de cómo se conectan los terminales del motor al módulo.

Coasting significa que el motor se puede girar manualmente. Brake quiere decir que el motor está frenado. Estas dos situaciones dependen del motor empleado.

Con los pulsadores SW1 y SW2 movemos el carro hacia la derecha y hacia la izquierda. En caso de llegar al final de recorrido, se activa el final de carrera correspondiente, deshabilitando el motor.

Cada final de carrera deshabilita el sentido de giro que le corresponde, es decir, si el motor se mueve hacia la derecha y pulsamos el FC de la izquierda, el motor se sigue moviendo hacia la derecha, hasta que llegue el final del recorrido y pulse el FC de la derecha.

Solo queda subir el sketch al Arduino.

/* 

    KEYES L298N Motor Shield

    PWM mode w potentiometer & FC´s

    Angel M. https://sites.google.com/site/angmuz

*/

#define ENA 6 // connect ENA to pin 6

#define IN1 5 // connect IN1 to pin 5

#define IN2 4 // connect IN2 to pin 4

#define SW1 8 // connect SW1 to pin 8 

#define SW2 9 // connect SW2 to pin 9

#define FC1 3 // connect Left End of Travel uSW FC1 to pin 3

#define FC2 2 // connect Right End of Travel uSW FC2 to pin 2

int motorSpeed = 0;

int pot = 0;

 

void setup()

{

 

 pinMode(ENA, OUTPUT);

 pinMode(IN1, OUTPUT);

 pinMode(IN2, OUTPUT);

 pinMode(SW1, INPUT);

 pinMode(SW2, INPUT);

 pinMode(FC1, INPUT);

 pinMode(FC2, INPUT);

 digitalWrite(ENA, LOW);

 digitalWrite(IN1, LOW);

 digitalWrite(IN2, LOW); 

 

}

 

void loop()

{

 pot = analogRead(A0);

 motorSpeed = pot/4; 

 // SW1 moves the grantry to the left

 // FC1 = Left End of Travel uSW

 if (digitalRead(FC1)==LOW && digitalRead(SW1)==HIGH)

 {

  MotorA_Direction1(motorSpeed); // CW

 }

 if (digitalRead(FC1)==HIGH && digitalRead(SW1)==HIGH)

 {

  MotorA_Brake();

 }

 // SW2 moves the grantry to the right

 // FC2 = Right End of Travel uSW

 if (digitalRead(FC2)==LOW && digitalRead(SW2)==HIGH)

 {

  MotorA_Direction2(motorSpeed); // CCW

 }

  if (digitalRead(FC2)==HIGH && digitalRead(SW2)==HIGH)

 {

  MotorA_Brake();

 }

 if (digitalRead(SW1)==LOW  && digitalRead(SW2)==LOW)

 {

  MotorA_Brake();

 }

 

 if (digitalRead(SW1)==HIGH  && digitalRead(SW2)==HIGH)

 {

  MotorA_Brake();

 } 

  

 

}

 

void MotorA_Direction1(int motorSpeed)

 analogWrite(ENA, motorSpeed);

 digitalWrite(IN1, HIGH);

 digitalWrite(IN2, LOW);

}

 

void MotorA_Direction2(int motorSpeed)

{

 analogWrite(ENA, motorSpeed);

 digitalWrite(IN1, LOW);

 digitalWrite(IN2, HIGH);

}

 

void MotorA_Brake()

{

 digitalWrite(ENA, LOW);

 digitalWrite(IN1, LOW);

 digitalWrite(IN2, LOW); 

}


En el siguiente gif puedes ver una animación con el resultado.

Links

Geek on Fire: Dual H Bridge Motor Driver