Tutorial - Driver L298N : Parte 1 / Motores DC

FUNCIONAMIENTO DE UN PUENTE H
Un "Puente H" nos permite hacer funcionar un motor en dos sentidos de giro y se utilizan al ser los microcontroladores incapaces de ofrecer una carga elevada de corriente. El funcionamiento de los mismos se puede resumir a partir de la siguiente figura.


En la figura observamos cuatro switches, cada uno conectado al motor y los mismos conectados a una fuente de alimentación. Podemos dividir los mismos en pares, siendo el primer par "S1 / S4" y el segundo "S2 / S3". En resumen tenemos dos movimientos:

# Al activar el primer par (S1 / S4): El motor se moverá en dirección de las agujas del reloj.
# Al activar el segundo par (S2 / S3): El motor se moverá en dirección contraria de las agujas del reloj.


En el primer caso, al cerrar circuito S1 y S4 la fuente "Vin" lleva corriente en la secuencia "S1 - M - S4". En el segundo caso, al cerrar circuito S2 y S3 la fuente "Vin" lleva corriente en la secuencia "S3 - M - S2".

Usando este principio, podemos visualizar lo mismo usando transistores. En este caso, se añaden diodos de protección que completan el circuito.


Como se observa, es posible construir un circuito por medio de transistores para poder manejar motores por medio de nuestro microcontrolador, pero hay drivers comerciales que pueden simplificar y mejorar el mismo circuito añadiendo un pin "Enable" y un Puente H adicional. Este pin "Enable" nos permite realizar con facilidad control de velocidad de los motores usando una señal "PWM".

DRIVER L298N
En el medio comercial encontramos el driver de manejo de motores DC y Paso a paso más usado, que es el L298N.



En el siguiente link puedes encontrar su "datasheet". El driver tiene los pines como se mira en la siguiente figura.


Las características principales del driver son:
# Voltaje de alimentación máximo: 46V.
# Corriente máxima total: 4A.
# Voltaje lógico máximo: 7V.
# Enable A: Activa Out 1 y Out 2.
# Enable B: Activa Out 3 y Out 4.
# Compatibilidad: Motores DC (2) o un motor Paso a Paso bipolar.

En cuanto a los pines físicos del driver, tenemos las siguientes características:
# El jumper en "A Enable" y "B Enable" activa permanentemente los dos puentes H.
# El jumper en "5V Enable" habilita la conversión de la alimentación externa en 5V.
# In 1 e In 2 corresponden a Out 1 y Out 2.
# In 3 e In 4 corresponden a Out 3 y Out 4

CONEXIÓN DEL DRIVER L298N A DOS MOTORES DC
Para este caso utilizaremos como referencia un motor "Smart Robot Wheel" que se muestra a continuación.



Las características de este motor son las siguientes:

# Rotación sin carga a 6V: 100 RPM.
# Corriente de consumo sin carga a 6V: 70mA.
# Corriente con motor bloqueado a 3V: 580 mA.
# Torque: 300 mg - cm.
# Peso: 40g.

La conexión para esta prueba es la siguiente:

# Pin 10: Arduino UNO => In 1: Driver L298N
# Pin 9: Arduino UNO => In 2: Driver L298N
# Pin 8: Arduino UNO => In 3: Driver L298N
# Pin 7: Arduino UNO => In 4: Driver L298N
# GND: Arduino UNO => GND: Driver L298N
# Batería 9V positivo => 12V: Driver L298N
# Batería 9V negativo => GND: Driver L298N

La siguiente figura nos ilustra de una mejor manera las conexiones:


PROGRAMA DE PRUEBA DEL DRIVER L298N
En el siguiente programa básico, usaremos la conexión anterior para hacer funcionar un motor en una dirección ingresando "a" por puerto serial y en la otra colocando "b"; de la misma manera para el otro motor ingresando la letra "c" y "d". En caso de ingresar la letra "e" los dos motores se detendrán.

El programa es el siguiente:
/*
   PROGRAMA DE PRUEBA DEL DRIVER L298N CON DOS MOTORES DC
  
   CONEXION:
             In1 (Driver L298N): Pin 10 (Arduino UNO)
             In2 (Driver L298N): Pin 9 (Arduino UNO) 
             In3 (Driver L298N): Pin 8 (Arduino UNO)
             In4 (Driver L298N): Pin 7 (Arduino UNO)              
             GND: Conectar los dos GND del Arduino UNO, driver L298N y la bateria
             12V: Positivo de una batería o fuente de 9 o 12V
   
   En el siguiente programa probaremos el funcionamiento del driver L298N usando dos motores DC. Al
   ingresar la letra "a" por puerto serial, el motor 1 rota en direccion de las agujas del reloj;
   al ingresar la letra "b" lo hace en sentido contrario. El mismo principio se aplica al siguiente
   motor usando las letras "c" y "d". La letra "e" para los dos motores.
   
   NOTA: Los pines "Enable" deben estar habilitados en la placa del driver
   
   Autor: Renato H.
   http://beetlecraft.blogspot.pe/
   
   El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera 
   ocasionar el mal funcionamiento de la plataforma de uso de la misma no es responsabilidad del autor
*/
const int in1 = 10, in2 = 9; // Pines asignados al primer motor
const int in3 = 8, in4 = 7;  // Pines asignados al segundo motor

void setup() {
  Serial.begin(9600); // Configuracion del puerto serial de comunicacion
  pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); // Configuracion de salida de los pines del primer motor
  pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); // Configuracion de salida de los pines del segundo motor
  
  Serial.println("Tenemos los siguientes comandos:"); // Mensaje inicial
  Serial.println("Letra a: Rotacion del primer motor en sentido horario");
  Serial.println("Letra b: Rotacion del primer motor en sentido antihorario");
  Serial.println("Letra c: Rotacion del segundo motor en sentido horario");
  Serial.println("Letra d: Rotacion del segundo motor en sentido antihorario");
  Serial.println("Letra e: Detener motores");
}

void loop() {
  if (Serial.available()) { // Verificaion que el puerto serial recibe datos                                  
   delay(10);                                              
   rotacion_motor(); // Rutina rotacion de motor                        
    while (Serial.available() > 0){Serial.read();} // Rutina de limpieza del buffer del puerto serial
  }
}

void rotacion_motor(){          // RUTINA DE PRUEBA DE MOTORES DC

                                // RUTINA DE ROTACION 1
  if (Serial.peek() == 'a'){ // Discriminacion de la letra correspondiente a la primera rutina
    Serial.println("Motor 1: Rotancion horaria"); // Indicacion por pantalla de la rotacion  
    digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Activacion del motor 1 en sentido horario
    digitalWrite(in3, LOW); digitalWrite(in4, LOW);  // Desactivacion del motor 2  
  }

                                // RUTINA DE ROTACION 2
  if (Serial.peek() == 'b'){ // Discriminacion de la letra correspondiente a la segunda rutina
    Serial.println("Motor 1: Rotancion antihoraria"); // Indicacion por pantalla de la rotacion    
    digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // Activacion del motor 1 en sentido horario
    digitalWrite(in3, LOW); digitalWrite(in4, LOW);  // Desactivacion del motor 2  
  }

                                // RUTINA DE ROTACION 3
  if (Serial.peek() == 'c'){ // Discriminacion de la letra correspondiente a la tercera rutina 
    Serial.println("Motor 2: Rotancion horaria"); // Indicacion por pantalla de la rotacion    
    digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Activacion del motor 1 en sentido horario
    digitalWrite(in1, LOW); digitalWrite(in2, LOW);  // Desactivacion del motor 2  
  }

                                // RUTINA DE ROTACION 4
  if (Serial.peek() == 'd'){ // Discriminacion de la letra correspondiente a la cuarta rutina  
    Serial.println("Motor 2: Rotancion antihoraria"); // Indicacion por pantalla de la rotacion    
    digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // Activacion del motor 1 en sentido horario
    digitalWrite(in1, LOW); digitalWrite(in2, LOW);  // Desactivacion del motor 2  
  }
                                // RUTINA DE ROTACION 5
  if (Serial.peek() == 'e'){ // Discriminacion de la letra correspondiente a la quinta rutina 
    Serial.println("Detener motores"); // Indicacion por pantalla de la rotacion    
    digitalWrite(in1, LOW); digitalWrite(in2, LOW); // Activacion del motor 1 en sentido horario
    digitalWrite(in3, LOW); digitalWrite(in4, LOW);  // Desactivacion del motor 2  
  }  
}

Como resultado en pantalla obtendremos lo siguiente:


Al ingresar la letra "a".



Al ingresar la letra "b".


Al ingresar la letra "c".


Al ingresar la letra "d".


Al ingresar la letra "e".



Autor: 

1 comentario: