Controlar motores – L298N con Arduino

Controlar motores – L298N con Arduino

Y si, sé que algunos dirán ¡Por Fin!, así que acá les dejo el primer instructivo sobre como manejar motores de corriente contínua usando L298N con Arduino (y algunos trucos). Resulta que tanto los motores de corriente continua para robots, como el módulo L298N son bien famosos ya que vienen con casi todos los kits de iniciación y los kits robóticos, por lo que aprender a controlarlos es siempre un muy buen aporte a nuestro aprendizaje.

Motor con reducción Motor con reducción y rueda típica Módulo driver de motor L298N con Arduino

Los motores

Los motores de la prueba son los típicos motores con reducción que se usan en robots Arduino. Los venden por separado, y también vienen en los kits de robots y en los kits de aprendizaje (a veces vienen el driver L298N con Arduino también). El instructivo vale para cualquier motor, pero lo importante de revisar el que usamos en el ejemplo es darles a ustedes el ejemplo de como deben controlar voltajes y consumos para sus propias necesidades y usos.

Las especificaciones técnicas de los mismos son:

Voltaje de operación: 3V a 6V
Consumo: 200mA a 6V y 150mA a 3V
Reducción: 1:48 (1 vuelta del eje por cada 48 vueltas del motor)
Velocidad: 90RPM a 3V a 200RPM a 6V ±10%

Módulo driver de motor L298N

Este driver es muy común como ya dijimos, y en muchos casos es más de lo que se necesita pero funciona bien y es muy versatile. Primero veamos las especificaciones técnicas y luego hablaremos de sus capacidades prácticas.

Voltaje lógico: 5V (posee regulador de 5V propio)
Consumo lógica: 0mA a 36mA
Modo de operación: puente H (doble)
Voltaje del driver: 5V a 35V
Corriente del driver: 2A (max. un puente)
Potencia máxima del módulo: 25W

Lo primero que debemos observar al buscar un driver para nuestros motores, o al buscar motores para nuestro driver, es que el voltaje y corriente de los motores no superen la capacidad del driver. El L298N es dual por lo que puede manejar 2 motores en ambas direcciones o 4 motores en una sola dirección. Nuestros motores consumen 200mA a 6V (que es el voltaje máximo al que pueden trabajar) y nuestro driver maneja voltajes de 5V a 35V (estamos bien) y hasta 2A por puente con una potencia máxima de 25W. Con la corriente estamos bien (200mA = 0,2A, nos sobra).

La potencia responde a una formulita simple que dice: W = V x A, en nuestro caso la potencia máxima de nuestros motores es: 6V x 0,2A = 1,2W c/u, y como usualmente manejamos 2, entonces serán 2,4W en total para nuestro driver que es mucho menos de los 25W que puede manejar. Así que estamos bien!

Veamos el módulo más de cerca

Descripción L298N

Como se observa en la foto desde arriba, el módulo posee 4 salidas de potencia que están vinculadas a sus respectivas 4 entradas lógicas y responden a ellas de manera que si en la entrada lógica hay 5V, entonces en la salida habrá el voltaje que nosotros suministremos para el driver, y si hay 0V en la entrada (equivalente a nuestro estado LOW o nivel lógico 0), entonces en la salida del driver habrá 0V que para nosotros será GND que es nuestra referencia.

Lo bueno del puente H es que nos permite cambiar el uso de cada salida y usarlas tanto para positivo como para negativo o masa indistintamente y así es como lograremos invertir el sentido de giro de nuestro motor, usando 2 salidad para 1 solo motor.

Lo otro interesante a observar es que el módulo del ejemplo posee un regulador de voltaje de 5V. Si usted por ejemplo alimenta el módulo con 7V o más (tenga cuidado que su motor trabaje bien a ese volyaje que NO es nuestro caso), el módulo entregará 5V regulados en el pin que dice 5V. Esto solo ocurrirá si tiene el jumper del regulador puesto. Si esto no ocurre, usted deberá proveer de 5V mediante el mismo pin, por lo que el pin de 5V del módulo actua como una entrada de voltaje lógico si el regulador no se usa, y como una salida de alimentación de 5V si usa el regulador de voltaje.

Esto es muy cómodo por ejemplo para usar el L298N con Arduino donde el módulo hace de fuente de alimentación para nuestro Arduino. En ese caso, deberá tener en cuenta que la corriente del voltaje de entrada del módulo, deberá ser suficiente para alimentar los motores, la lógica del módulo y el Arduino (y otros módulos que el mismo alimente también).

Como conectaremos nuestro L298N con Arduino

Para el ejemplo yo usaré un módulo L298N con Arduino UNO, un motor como el del ejemplo, alimentaré con una bateria de 9V el Arduino aunque lo conectaré al USB también (debido a que el USB no provee suficiente corriente para alimentar todo), y por lo tanto le quitaré el jumper del regulador de voltaje al módulo, quitaré el jumper Enable A, y usaré las salidas 1 y 2, Enable A y las entradas 1 y 2. Conectaré el módulo de la siguiente manera:

Módulo -> Arduino UNO
GND -> GND
+5V -> 5V
Enable A -> Pin 9
Entrada 1 (In 1) -> Pin 10
Entrada 2 (In 2) -> Pin 12

Además, para la alimentación necesitamos conectar Vin/+12V a los 5V tambien lo que haré con un puente a los 5V. Y el Arduino no puede alimentarse directamente desde el

L298N con Arduino

El Sketch para el L298N con Arduino

El Sketch es simple y lo que hace es recibir órdenes desde el Monitor Serial y ejecutarlas. Hay un menu de opciones para facilitar las pruebas. Le sugiero que simplemente cargue el Sketch en su Arduino UNO y luego abra el Monitor Serial a 9600bps y siga las instrucciones.

// Define los pines del motor
#define MOTOR_DIR_1 8
#define MOTOR_DIR_2 7

// Define el pin de velocidad (Enable A) y debe ser un pin PWM
#define MOTOR_VELOCIDAD 9

// Define constantes para velocidades. Rango 0-255.
#define VELOCIDAD_MAX 255
#define VELOCIDAD_MEDIA 175
#define VELOCIDAD_BAJA 100

void setup() {
  // Inicializamos los pines del motor
  pinMode(MOTOR_DIR_1, OUTPUT);
  pinMode(MOTOR_DIR_2, OUTPUT);
  
  // Iniciamos con el motor parado
  pararMotor();

  // Iniciamos Monitor Serial y mostramos menu por primera vez  
  Serial.begin(9600);
  mostrarMenu();
}

void loop() {
  char input = '0';

  // Esperamos a que ingresen algo
  if (Serial.available()) {
    input = Serial.read();
    
    // Segun la opcion ingresada ejecutamos la orden
    switch (input) {
      case '1': motor(0, VELOCIDAD_MAX); break;
      case '2': motor(1, VELOCIDAD_MAX); break;
      case '3': motor(0, VELOCIDAD_MEDIA); break;
      case '4': motor(1, VELOCIDAD_MEDIA); break;
      case '5': motor(0, VELOCIDAD_BAJA); break;
      case '6': motor(1, VELOCIDAD_BAJA); break;
      case '0': pararMotor(); break;
    }
    
    // Vaciamos el buffer Serial
    while (Serial.available()) {
      Serial.read();
    }
    
    // Mostramos menu de nuevo
    mostrarMenu();
  }
}

// Funcion para parar el motor poniendo ambos pines en LOW
void pararMotor() {
  digitalWrite(MOTOR_DIR_1, LOW);
  digitalWrite(MOTOR_DIR_2, LOW);
}

// Funcion para mostrar menu de opciones
void mostrarMenu() {
  Serial.println("MENU DE OPCIONES:");
  Serial.println("1 - Giro sentido A maxima velocidad");
  Serial.println("2 - Giro sentido B maxima velocidad");
  Serial.println("3 - Giro sentido A velocidad media");
  Serial.println("4 - Giro sentido B velocidad media");
  Serial.println("5 - Giro sentido A velocidad baja");
  Serial.println("6 - Giro sentido B velocidad baja");
  Serial.println("0 - Parar motor");
  Serial.println("Ingrese su opcion y presione Enter:");
}

// Funcion para activar el motor en sentido y velocidades suministrados
void motor(unsigned char sentido, unsigned char velocidad) {
  // Sentido 1 o mayor 
  if (sentido) {
    digitalWrite(MOTOR_DIR_1, LOW);
    digitalWrite(MOTOR_DIR_2, HIGH);
  }
  // Sentido 0
  else {
    digitalWrite(MOTOR_DIR_1, HIGH);
    digitalWrite(MOTOR_DIR_2, LOW);
  }
  
  // Velocidad de 0 (apagado) a 255 (maxima velocidad)
  analogWrite(MOTOR_VELOCIDAD, velocidad);
}

En mi experiencia, con velocidades menores de 90 (0-255) no logro mover el motor alimentándolo con 5V. Además, posee muy poca fuerza debido al modo en que opera este módulo usándolo como dice la documentación y como explico acá.

 

 

Deja un comentario