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); }