En este tutorial de Arduino, aprenderemos a controlar motores DC usando Arduino. Exploraremos algunas técnicas básicas para controlar motores DC y realizaremos dos ejemplos prácticos que nos enseñarán cómo controlar motores DC utilizando el controlador de motor L298N y la placa Arduino.
Control de Motores DC con PWM
Podemos controlar la velocidad de un motor DC simplemente controlando el voltaje de entrada al motor. El método más común para hacerlo es mediante una señal PWM (Modulación por Ancho de Pulso).
PWM es una técnica que nos permite ajustar el valor promedio del voltaje que se envía a un dispositivo electrónico encendiendo y apagando la energía a una velocidad rápida. El voltaje promedio depende del ciclo de trabajo, o la cantidad de tiempo que la señal está ENCENDIDA versus la cantidad de tiempo que está APAGADA en un solo período de tiempo.
Dependiendo del tamaño del motor, podemos conectar una salida PWM de Arduino a la base de un transistor o a la puerta de un MOSFET y controlar la velocidad del motor controlando la salida PWM. La señal PWM de baja potencia de Arduino activa y desactiva la puerta del MOSFET a través del cual se acciona el motor de alta potencia.
Nota : Arduino GND y la fuente de alimentación del motor GND deben estar conectados juntos.
Control de Motores DC con H-Bridge
Para controlar la dirección de rotación, solo necesitamos invertir la dirección del flujo de corriente a través del motor. El método más común para hacerlo es mediante un H-Bridge. Un circuito H-Bridge contiene cuatro elementos de conmutación, transistores o MOSFET, con el motor en el centro formando una configuración en forma de H. Al activar dos interruptores específicos al mismo tiempo, podemos cambiar la dirección del flujo de corriente y, por lo tanto, cambiar la dirección de rotación del motor.
Si combinamos estos dos métodos, PWM y H-Bridge, podemos tener un control completo sobre el motor DC. Hay muchos controladores de motor DC que tienen estas características y el L298N es uno de ellos.
Controlador L298N
El L298N es un controlador de motor de doble puente H que permite el control de velocidad y dirección de dos motores DC al mismo tiempo. El módulo puede manejar motores DC que tienen voltajes entre 5 y 35V, con una corriente máxima de hasta 2A.
Veamos más de cerca el diagrama de pines del módulo L298N y expliquemos cómo funciona. El módulo tiene dos bloques de terminales de tornillo para el motor A y B, y otro bloque de terminales de tornillo para el pin de tierra, el VCC para el motor y un pin de 5V que puede ser una entrada o salida.
Esto depende del voltaje utilizado en el VCC del motor. El módulo tiene un regulador de 5V integrado que está habilitado o deshabilitado mediante un puente. Si el voltaje de alimentación del motor es de hasta 12V, podemos habilitar el regulador de 5V y el pin de 5V se puede utilizar como salida, por ejemplo, para alimentar nuestra placa Arduino. Pero si el voltaje del motor es mayor que 12V, debemos desconectar el puente porque esos voltajes dañarán el regulador de 5V integrado. En este caso, el pin de 5V se utilizará como entrada, ya que debemos conectarlo a una fuente de alimentación de 5V para que el IC funcione correctamente.
Cabe destacar que este IC genera una caída de voltaje de aproximadamente 2V. Por ejemplo, si usamos una fuente de alimentación de 12V, el voltaje en los terminales del motor será de aproximadamente 10V, lo que significa que no podremos obtener la velocidad máxima de nuestro motor DC de 12V.
Luego están las entradas de control lógicas. Los pines Enable A y Enable B se utilizan para habilitar y controlar la velocidad del motor. Si hay un puente en este pin, el motor se habilitará y funcionará a la velocidad máxima. Si quitamos el puente, podemos conectar una entrada PWM a este pin y de esta manera controlar la velocidad del motor. Si conectamos este pin a tierra, el motor se deshabilitará.
Los pines Input 1 e Input 2 se utilizan para controlar la dirección de rotación del motor A, y las entradas 3 y 4 para el motor B. Al utilizar estos pines, controlamos los interruptores del puente H dentro del IC L298N. Si la entrada 1 está en BAJO y la entrada 2 está en ALTO, el motor se moverá hacia adelante, y viceversa, si la entrada 1 está en ALTO y la entrada 2 está en BAJO, el motor se moverá hacia atrás. En caso de que ambas entradas sean iguales, ya sea BAJO o ALTO, el motor se detendrá. Lo mismo se aplica para las entradas 3 y 4 y el motor B.
Arduino y Controlador de Motor L298N
Ahora realicemos algunas aplicaciones prácticas. En el primer ejemplo, controlaremos la velocidad del motor usando un potenciómetro y cambiaremos la dirección de rotación usando un botón pulsador. Este es el diagrama esquemático del circuito:
Necesitaremos un controlador de motor L298N, un motor DC, un potenciómetro, un botón pulsador y una placa Arduino.
Código Arduino
Este es el código de Arduino:
int rotDirection = 0 ; int pressed = false ; void setup () { pinMode (enA, OUTPUT ); pinMode (in1, OUTPUT ); pinMode (in2, OUTPUT ); pinMode (button, INPUT ); digitalWrite (in1, LOW ); digitalWrite (in2, HIGH ); } void loop () { int potValue = analogRead (A0); int pwmOutput = map (potValue, 0 , 1023 , 0 , 255 ); analogWrite (enA, pwmOutput); if ( digitalRead (button) == true ) { pressed = !pressed; } while ( digitalRead (button) == true ); delay ( 20 ); if (pressed == true & rotDirection == 0 ) { digitalWrite (in1, HIGH ); digitalWrite (in2, LOW ); rotDirection = 1 ; delay ( 20 ); } if (pressed == false & rotDirection == 1 ) { digitalWrite (in1, LOW ); digitalWrite (in2, HIGH ); rotDirection = 0 ; delay ( 20 ); } }Descripción : Primero, necesitamos definir los pines y algunas variables que se necesitan para el programa. En la sección de configuración, debemos establecer los modos de los pines y la dirección de rotación inicial del motor. En la sección de bucle, comenzamos leyendo el valor del potenciómetro y luego mapeamos el valor que obtenemos de él, que va de 0 a 1023, a un valor de 0 a 255 para la señal PWM, o ese es un ciclo de trabajo del 0 al 100% de la señal PWM. Luego, utilizando la función analogWrite(), enviamos la señal PWM al pin Enable de la placa L298N, que en realidad acciona el motor.
A continuación, verificamos si hemos presionado el botón, y si eso es cierto, cambiaremos la dirección de rotación del motor estableciendo los estados de Input 1 e Input 2 inversamente. El botón pulsador funcionará como un botón de alternancia y cada vez que lo presionemos, cambiará la dirección de rotación del motor.
Robot Arduino
Ahora que hemos aprendido esto, podemos construir nuestro propio robot de coche Arduino. Este es el diagrama esquemático del circuito:
Todo lo que necesitamos son 2 motores DC, el controlador de motor L298N, una placa Arduino y un joystick para el control. En cuanto a la fuente de alimentación, elegí utilizar tres baterías de iones de litio de 7V, proporcionando un total de 11V. Hice el chasis con madera contrachapada de 3 mm de grosor, fijé los motores a él utilizando soportes metálicos, fijé las ruedas a los motores y en la parte delantera fijé una rueda giratoria.
Ahora, echemos un vistazo al código de Arduino y veamos cómo funciona.
int xAxis = analogRead (A0); int yAxis = analogRead (A1);Después de definir los pines, en la sección de bucle, comenzamos leyendo los valores del eje X e Y del joystick. El joystick está hecho de dos potenciómetros que están conectados a las entradas analógicas de Arduino y tienen valores de 0 a 102Cuando el joystick permanece en su posición central, el valor de ambos potenciómetros, o ejes, es de alrededor de 51
Añadiremos un poco de tolerancia y consideraremos los valores de 470 a 550 como centrales. Si movemos el eje Y del joystick hacia atrás y el valor baja de 470, estableceremos la dirección de rotación de los dos motores en hacia atrás utilizando los cuatro pines de entrada. Luego, convertiremos los valores decrecientes de 470 a 0 en valores PWM crecientes de 0 a 255, que en realidad es la velocidad del motor.
if (yAxis < 470 ) { digitalWrite (in1, HIGH ); digitalWrite (in2, LOW ); digitalWrite (in3, HIGH ); digitalWrite (in4, LOW ); motorSpeedA = map (yAxis, 470 , 0 , 0 , 255 ); motorSpeedB = map (yAxis, 470 , 0 , 0 , 255 ); }De manera similar, si movemos el eje Y del joystick hacia adelante y el valor sube de 550, estableceremos los motores para que se muevan hacia adelante y convertiremos las lecturas de 550 a 1023 en valores PWM de 0 a 25Si el joystick permanece en su centro, la velocidad de los motores será cero.
A continuación, veamos cómo usamos el eje X para el control izquierdo y derecho del coche.
if (xAxis < 470 ) { int xMapped = map (xAxis, 470 , 0 , 0 , 255 ); motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; if (motorSpeedA < 0 ) { motorSpeedA = 0 ; } if (motorSpeedB > 255 ) { motorSpeedB = 255 ; } }Entonces, de nuevo, primero necesitamos convertir las lecturas del eje X en valores de velocidad de 0 a 25Para mover hacia la izquierda, usamos este valor para disminuir la velocidad del motor izquierdo y aumentar la velocidad del motor derecho. Aquí, debido a las funciones aritméticas, usamos dos instrucciones "if" adicionales para limitar el rango de la velocidad del motor de 0 a 25
Se utiliza el mismo método para mover el coche hacia la derecha.
Dependiendo del voltaje aplicado y del propio motor, a velocidades más bajas, el motor no puede empezar a moverse y produce un zumbido. En mi caso, los motores no pudieron moverse si el valor de la señal PWM era inferior a 70. Por lo tanto, utilizando estas dos instrucciones "if", en realidad limité el rango de velocidad de 70 a 25Al final, solo enviamos las velocidades finales del motor o la señal PWM a los pines de habilitación del controlador L298N.
if (motorSpeedA < 70 ) { motorSpeedA = 0 ; } if (motorSpeedB < 70 ) { motorSpeedB = 0 ; } analogWrite (enA, motorSpeedA); analogWrite (enB, motorSpeedB);Este es el código completo del ejemplo del coche robot Arduino:
int motorSpeedA = 0 ; int motorSpeedB = 0 ; void setup () { pinMode (enA, OUTPUT ); pinMode (enB, OUTPUT ); pinMode (in1, OUTPUT ); pinMode (in2, OUTPUT ); pinMode (in3, OUTPUT ); pinMode (in4, OUTPUT ); } void loop () { int xAxis = analogRead (A0); int yAxis = analogRead (A1); if (yAxis < 470 ) { digitalWrite (in1, HIGH ); digitalWrite (in2, LOW ); digitalWrite (in3, HIGH ); digitalWrite (in4, LOW ); motorSpeedA = map (yAxis, 470 , 0 , 0 , 255 ); motorSpeedB = map (yAxis, 470 , 0 , 0 , 255 ); } else if (yAxis > 550 ) { digitalWrite (in1, LOW ); digitalWrite (in2, HIGH ); digitalWrite (in3, LOW ); digitalWrite (in4, HIGH ); motorSpeedA = map (yAxis, 550 , 1023 , 0 , 255 ); motorSpeedB = map (yAxis, 550 , 1023 , 0 , 255 ); } else { motorSpeedA = 0 ; motorSpeedB = 0 ; } if (xAxis < 470 ) { int xMapped = map (xAxis, 470 , 0 , 0 , 255 ); motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; if (motorSpeedA < 0 ) { motorSpeedA = 0 ; } if (motorSpeedB > 255 ) { motorSpeedB = 255 ; } } if (xAxis > 550 ) { int xMapped = map (xAxis, 550 , 1023 , 0 , 255 ); motorSpeedA = motorSpeedA + xMapped; motorSpeedB = motorSpeedB - xMapped; if (motorSpeedA > 255 ) { motorSpeedA = 255 ; } if (motorSpeedB < 0 ) { motorSpeedB = 0 ; } } if (motorSpeedA < 70 ) { motorSpeedA = 0 ; } if (motorSpeedB < 70 ) { motorSpeedB = 0 ; } analogWrite (enA, motorSpeedA); analogWrite (enB, motorSpeedB); }Eso sería todo para este tutorial. En mi próximo video, actualizaremos este coche robot Arduino añadiendo dispositivos Bluetooth y Radio para habilitar el control del smartphone y el control inalámbrico.
Siéntase libre de hacer cualquier pregunta en la sección de comentarios a continuación y no olvide consultar mi colección de proyectos Arduino.
Diferencia entre L298N y A4988
El L298N y el A4988 son controladores de motor populares utilizados en proyectos de Arduino. Sin embargo, tienen diferencias significativas que los hacen adecuados para diferentes aplicaciones.
Tabla comparativa
| Característica | L298N | A4988 |
|---|---|---|
| Tipo | Controlador de motor de doble puente H | Controlador de motor paso a paso |
| Corriente máxima | 2A | 1A |
| Voltaje de alimentación | 5V - 35V | 8V - 35V |
| Número de motores | 2 | 1 |
| Control de velocidad | Sí | No |
| Control de dirección | Sí | No |
| Control de paso a paso | No | Sí |
El L298N es un controlador de motor de doble puente H que es adecuado para controlar motores DC. Permite el control de velocidad y dirección de dos motores DC al mismo tiempo. Tiene una corriente máxima de 2A y puede funcionar con voltajes de 5V a 35V.
El A4988 es un controlador de motor paso a paso que se utiliza para controlar motores paso a paso. Permite el control de los motores paso a paso para una rotación precisa y controlada. Tiene una corriente máxima de 1A y puede funcionar con voltajes de 8V a 35V.
El L298N es una buena opción para controlar motores DC que requieren control de velocidad y dirección. El A4988 es una buena opción para controlar motores paso a paso que requieren una rotación precisa y controlada.
¿Puede el L298N alimentar un motor de 12V?
Sí, el L298N puede alimentar un motor de 12V. El L298N puede manejar voltajes de alimentación de hasta 35V. Sin embargo, tener en cuenta que el L298N genera una caída de voltaje de aproximadamente 2V. Por lo tanto, si está utilizando una fuente de alimentación de 12V, el voltaje en los terminales del motor será de aproximadamente 10V. Esto significa que no podrá obtener la velocidad máxima de su motor de 12V.
Además, es importante asegurarse de que la corriente máxima del L298N sea suficiente para el motor que está utilizando. El L298N tiene una corriente máxima de 2A. Si el motor requiere más corriente que eso, deberá utilizar un controlador de motor diferente.
Si quieres conocer otros artículos parecidos a L298n motor driver: control de motores dc con arduino puedes visitar la categoría Motor.
