Introducción
En este tutorial explicaremos como utilizar uno de los componentes más importantes cuando se trata de actuadores en el mundo de la robótica: los motores de corriente continua (motor CC o motor DC) que nos permitirán accionar de manera mecánica cualquier tipo de dispositivo: móviles, brazos articulados, barreras, etc.... En el caso del robot móvil que estamos construyendo estos motores nos permitirán realizar todos los movimientos de nuestro proyecto de acuerdo con el diseño del mismo...
¿Qué es un motor de corriente continua (motor CC o motor DC)?
El motor de corriente continua (denominado también motor de corriente directa, motor CC o motor DC) es una máquina que convierte la energía eléctrica en mecánica, provocando un movimiento rotatorio, gracias a la acción que se genera del campo magnético.
Es difícil moverse por nuestro mundo sin tropezarte con motores eléctricos de todos los tipos y tamaños. Desde los pequeños con los que arrancas el coche cada mañana a los muy pequeños que mueven tu reproductor de CDs o DVS, al que hace girar el microondas con el que te calientas el café al levantarte, estamos rodeados de motores eléctricos.
Según la ley de Fuerza simplificada, cuando un conductor por el que pasa una corriente eléctrica se sumerge en un campo magnético, el conductor sufre una fuerza perpendicular al plano formado por el campo magnético y la corriente, siguiendo la regla de la mano derecha. Es importante recordar que para un generador se usará la regla de la mano derecha mientras que para un motor se usará la regla de la mano izquierda para calcular el sentido de la fuerza.
Funcionamiento del motor de corriente continua con el driver L298n
Hasta ahora hemos utilizado las salidas de nuestro Arduino para influir en el mundo exterior gobernando únicamente diodos LED y pequeños servomotores. Hemos podido hacerlo porque tiene capacidad suficiente (potencia) para poder accionarlos pero existen muchos otros componentes en los que la capacidad (potencia eléctrica) que suministra nuestro arduino es insuficiente. En este caso están los motores de corriente continua que gobernarán el movimiento de nuestro robot
Para ayudarnos con este problema de potencia eléctrica y simplificar el cableado y programación cuando se crean proyectos de corriente continua se usará el módulo o driver L298n
El módulo controlador de motores L298N H-bridge nos permite controlar la velocidad y la dirección de dos motores de corriente continua o un motor paso a paso de una forma muy sencilla, gracias a los 2 los dos H-bridge que monta. Un puente-H o H-bridge es un componente formado por 4 transistores que nos permite invertir el sentido de la corriente, y de esta forma podemos invertir el sentido de giro del motor. El rango de tensiones en el que trabaja este módulo va desde 3V hasta 35V, y una intensidad de hasta 2A. A la hora de alimentarlo hay que tener en cuenta que la electrónica del módulo consume unos 3V, así que los motores reciben 3V menos que la tensión con la que alimentemos el módulo. Además el L298N incluye un regulador de tensión que nos permite obtener del módulo una tensión de 5V, perfecta para alimentar nuestro Arduino. Eso sí, este regulador sólo funciona si alimentamos el módulo con una tensión máxima de 12V. Es un módulo que se utiliza mucho en proyectos de robótica, por su facilidad de uso y su reducido precio.
Conexión eléctrica
Para controlar la velocidad de giro de los motores tenemos que quitar los jumpers y usar los pines ENA y ENB. Los conectaremos a dos salidas PWM de Arduino de forma que le enviemos un valor entre 0 y 255 que controle la velocidad de giro. Si tenemos los jumpers colocados, los motores girarán a la siempre a la misma velocidad.
A continuación realizaremos el esquema en el que alimentaremos el driver L298n y los motores con una fuente de alimentación externa (en nuestro caso 4 pilas AA que nos proporcionan un voltaje de 6 V aunque existirían mejores y más caras opciones (leer artículo sobre alimentación de la placa Arduino)) por lo que. nuestro vehículo se podría mover sin tener que estar conectado al ordenador.
Código Arduino
En principio vamos a mostrar el código necesario para controlar un solo motor, por lo que solo sería necesario conectar el citado motor a nuestro driver y de nuestro driver a Arduino..
En este sencillo ejemplo, que sirve para familiarizarnos con los motores, el motor girará durante un tiempo en un sentido, parará, girará en sentido contrario y volverá a parar.
Arduino Code
/* Ejemplo de control de motor DC usando modulo L298 El programa activa el motor en un sentido por 4 segundos, para el motor por 500 ms, activa el motor en sentido inverso por 4 segundos y se detiene por 5 segundos. Luego repite la acción indefinidamente. */ const int IN1 = 13; // Pin digital 13 para controlar sentido giro motor A const int IN2 = 12; // Pin digital 12 para controlar sentido giro motor A void setup() { pinMode (IN1, OUTPUT); // Input4 conectada al pin 4 pinMode (IN2, OUTPUT); // Input3 conectada al pin 5 } void loop() { // Motor gira en un sentido digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); delay(4000); // Motor no gira digitalWrite (IN1, LOW); delay(500); // Motor gira en sentido inverso digitalWrite (IN2, HIGH); delay(4000); // Motor no gira digitalWrite (IN2, LOW); delay(5000); }
A continuación ya presentaremos el código que usaremos para controlar los 2 motores que compondrán nuestro robot...
En este sencillo ejemplo, que sirve para familiarizarnos con los motores, el motor girará durante un tiempo en un sentido, parará, girará en sentido contrario y volverá a parar.
Arduino Code
/* Nombre: Controlando motores de corriente contínua (CC) con driver L298n Autor: Daniel Pascual Gallegos Fecha: Noviembre 2016 Funcionalidad: Este subproyecto forma parte de la construcción de nuestro robot autónomo. En este subproyecto usaremos el driver L298n para gobernar 2 motores de CC que realizarán la parte mecánica de nuestro robot móvil. */ // Definición de variables y constantes relacionadas con el motor A const int IN1 = 13; // Pin digital 13 para controlar sentido giro motor A const int IN2 = 12; // Pin digital 12 para controlar sentido giro motor A // Definición de variables y constantes relacionadas con el motor B //const int ENB = 5; // Pin digital 5 (PMW) para controlar velocidad motor A const int IN3 = 11; // Pin digital 11 para controlar sentido giro motor A const int IN4 = 10; // Pin digital 10 para controlar sentido giro motor A // Función que se ejecuta una sola vez al cargar el programa void setup() { // Se declaran todos los pines como salidas pinMode (IN1, OUTPUT); pinMode (IN2, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN4, OUTPUT); } // Función que se repite de manera periódica void loop() { robotAvance(); delay (5000); robotRetroceso(); delay (5000); robotDerecha(); delay (5000); Izquierda (); delay (5000); Parar (); delay (5000); } /* Función robotAvance: esta función hará que ambos motores se activen a máxima potencia por lo que el robot avanzará hacia delante */ void robotAvance() { //Sentido motor A // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); //Direccion motor B // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); } /* Función robotRetroceso: esta función hará que ambos motores se activen a máxima potencia en sentido contrario al anterior por lo que el robot avanzará hacia atrás */ void robotRetroceso() { //Sentido motor A // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior digitalWrite (IN1, LOW); digitalWrite (IN2, HIGH); //Direccion motor B // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); } /* Función robotDerecha */ void robotDerecha() { //Sentido motor A // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior digitalWrite (IN1, LOW); digitalWrite (IN2, HIGH); //Direccion motor B // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); } /* Función Izquierda */ void Izquierda () { //Direccion motor A digitalWrite (IN1, LOW); digitalWrite (IN2, HIGH); //Direccion motor B digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); //analogWrite (ENB, 150); //Velocidad motor A } void Parar () { //Direccion motor A digitalWrite (IN1, LOW); digitalWrite (IN2, LOW); //Direccion motor B digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); }
Código mBlock
En este sencillo ejemplo, que sirve para familiarizarnos con la programación del driver l298n con mBlock, se producirá la siguiente secuencia: el motor izquierdo girará en un sentido durante 5 segundos, luego girará en el sentido contrario durante 5 segundos y se parará comenzando a girar el motor derecho durante 5 segundos para, con posterioridad, girar en sentido contrario otros 5 segundos y terminar parándose. Puedes descargar el código del programa mBlock pulsando sobre este enlace (driverL298n_Ej1.sb2)
En el siguiente ejemplo se producirá la siguiente secuencia: los 2 motores girarán en el mismo sentido durante 5 segundos para, con posterioridad, invertir el sentido de giro durante otros 5 segundos. Puedes descargar el código del programa mBlock pulsando sobre este enlace (driverL298n_Ej2.sb2)