Driver Dual o Puente-H basado en el L298

Driver Dual o Puente-H basado en el L298

 

Este driver basado en L298, tiene un puente completo diseñado para cargas inductivas como reles, solenoides, motores unipolares y Steppers.
Permite conectar 2 motores, controlando la velocidad y sentido de giro en forma independiente.

Caracteristicas

  • Driven part of the terminal supply area Vs: +5 V ~ +35 V; such as the need to take power within the board, the supply area Vs: +7 V ~ +35 V
  • Driven part of the peak current Io: 2A
  • The logical part of the terminal supply area Vss: +5 V ~ +7 V (can take power within the board +5 V)
  • The logical part of the operating current range: 0 ~ 36mA
  • Control signal input voltage range:
    • Low:-0.3V ≤ Vin ≤ 1.5V
    • High: 2.3V ≤ Vin ≤ Vss
  • Enable signal input voltage range:
    • Low: -0.3 ≤ Vin ≤ 1.5V (control signal is invalid)
    • High: 2.3V ≤ Vin ≤ Vss (control signal active)
  • Maximum power consumption: 20W (when the temperature T = 75 ℃)
  • Storage temperature: -25 ℃ ~ +130 ℃
  • Other Extensions: control of direction indicators, the logic part of the plate to take power interface.
  • Driver Board Size: 55mm * 60mm * 30mm

JUMPERS

CSA: Entre éste pin y la Tierra, está conectado el sensor que controla la corriente de carga. Si el pin está cerrado se ignora la función de detección.

CSB: Entre éste pin y la Tierra, está conectado el sensor que controla la corriente de carga. Si el pin está cerrado se ignora la función de detección.

5V-EN: Si está cerrado, (Enabled) se produce una salida de 5V en la salida de los motores. Si está abierto, se necesita suplir de 5V.

U1—Enable In1 pull-up resistor [10k].

U2—Enable In2 pull-up resistor [10k].

U3—Enable In3 pull-up resistor [10k].

U4—Enable In4 pull-up resistor [10k].

IN1 IN2 : Señales para controlar el motor A

IN3 IN4 :Señales para controlar el motor B

ENA ENB: Habilita o no los motores.

 

Esquemas de conexiones:

Codigo Ejemplo

/*##### Motor Shield (L298N) #####*/
/*
* Conexión de los pines de Arduino --> L298N
* 5 --> ENA
* 6 --> ENB
* 2 --> IN1
* 3 --> IN2
* 4 --> IN3
* 7 --> IN4
*/

const int ENA = 5;
const int ENB = 6; 

/* Seteo de los INx para determinar la dirección del motor
* IN1: HIGH; IN2: LOW --> Direction 1 
* IN1: LOW; IN2: HIGH --> Direction 2
* IN3: HIGH; IN4: LOW --> Direction 1
* IN3: LOW; IN4: HIGH --> Direction 2
*/

const int IN1 = 2; 
const int IN2 = 3;
const int IN3 = 4;
const int IN4 = 7;
 
void setup()
{
 pinMode(ENA, OUTPUT);
 pinMode(ENB, OUTPUT);
 pinMode(IN1, OUTPUT);
 pinMode(IN2, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(IN4, OUTPUT);

 // Habilita Motor A y Motor B:
 digitalWrite(ENA, HIGH);
 digitalWrite(ENB, HIGH);

 // Serial communication
 Serial.begin(9600);
}
 
void loop()
{
 Serial.println("Motor A & B: Dirección 1");
 MotorAB_Direction1(1000);
 Serial.println("Motor A & B: FRENA");
 MotorAB_Brake(1000);
 Serial.println("Motor A & B: Dirección 2");
 MotorAB_Direction2(1000);
 Serial.println("Motor A & B: FRENA");
 MotorAB_Brake(1000);
}
 

/* FUNCIONES */
void MotorAB_Direction1(int milliseconds)
{
 digitalWrite(IN1, HIGH);
 digitalWrite(IN2, LOW);
 digitalWrite(IN3, HIGH);
 digitalWrite(IN4, LOW);
 if (milliseconds > 0)
 delay(milliseconds);
}
 
void MotorAB_Direction2(int milliseconds)
{
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, HIGH);
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, HIGH);
 if(milliseconds > 0)
 delay(milliseconds);
}
 
void MotorAB_Brake(int milliseconds)
{
 digitalWrite(IN1, HIGH);
 digitalWrite(IN2, HIGH);
 digitalWrite(IN3, HIGH);
 digitalWrite(IN4, HIGH);
 if(milliseconds > 0)
 delay(milliseconds); 
}

 

 

Ejemplo 2

Realicemos el siguiente circuito

Nótese como las dos tierras, la del Arduino y la segunda fuente de 7,4v están unidas.

En la siguiente tabla vemos los efectos de polarizar los pares (1,2) y (3,4) desde el Arduino.

In(x) In(y) Efecto en el motor
HIGH HIGH Apagado
HIGH LOW Gira izqierda
LOW HIGH Gira Derecha
LOW LOW No se usa

 

Aqui mostrando que la polarización de In1 e In2, hace que en motor gire en un sentido u otro.

Programa:

/*	
 L298N Driver motor
 Demonstrates functions of L298N Motor Controller
 
 Gustavo Dutour 2017
 https://roboticadelacosta.uy
*/
 
 
// Motor A
 
int enA = 9;
int in1 = 8;
int in2 = 7;
 
// Motor B
 
int enB = 3;
int in3 = 5;
int in4 = 4;
 
void setup()
{
  // Seteamos los pines de salida
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}
 
void demoUno()
{
  // Ambos motores a la misma velocidad
  // Encender Motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
 
  // Setear velocidad a 200 ... Rangos posibles: 0~255
  analogWrite(enA, 200);

  // Encender Motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
 
  // Setear velocidad a 200 ... Rangos posibles: 0~255
  analogWrite(enB, 200);
  delay(2000);
 
  // Cambiar dirección de giro
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH); 
  delay(2000);
 
  // Detener Motores
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}
 
void demoDos()
{
 
  // Variamos la velocidad de los motores
  // Note que la maxima velocidad está dada por el voltage
 
  // Encender Motores
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH); 
 
  // Acelerar de minimo a Maximo
  for (int i = 0; i < 256; i++)
  { analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  } 
 
  // Desacelerar de Maximo a Minimo
  for (int i = 255; i >= 0; --i)
  { analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  } 
 
  // Detener Motores
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);  
}
 
void loop()
{ demoUno();
  delay(1000);
  demoDos();
  delay(1000);
}