Muchos de los proyectos que deseamos realizar con nuestro Arduino pueden incluir algún tipo de movimiento y, probablemente la primera idea que se nos viene a la cabeza para realizarlo sea la palabra motor.
En este artículo, llamado Motor DC con Arduino y driver L298N o L293D vamos a tratar, no tanto acerca de la teoría del funcionamiento interno del motor DC (Direct Current) o motor eléctrico de corriente directa, sino el cómo podemos utilizarlos en nuestros proyectos con Arduino.
El motor, en cualquiera de sus formas es quizá uno de los más grandes inventos tecnológicos del ser humano, solo imagínate por un momento cómo sería nuestro mundo sin ellos :(.
Desde el «motor de Herón de Alejandría», en el siglo I d.C., hasta nuestros días, los motores han influenciado enormemente el desarrollo de la tecnología. El motor de combustión interna, el motor diésel, el motor turbo, el motor de reacción, el motor eléctrico, el motor industrial… La lista es larga, pero hoy nos centraremos en el motor DC.
Si te interesa el tema en el blog hay artículos sobre servomotores y motores paso a paso.
¡Ánimo, empecemos!
Indice de contenidos
¿Qué es un motor eléctrico?
Un motor eléctrico es un dispositivo que convierte la energía eléctrica en energía mecánica de rotación.
La energía eléctrica puede ser suministrada por fuentes de corriente continua (CC) y por fuentes de corriente alterna (CA).
El uso de los dos tipos de motores eléctricos es innumerable, desde el carro de juguete de nuestros hijos, pasando por los electrodomésticos de nuestro hogar, hasta llegar a la industria o los medios de transporte y no olvidemos los proyectos Arduino que podemos desarrollar ;).
En este artículo hablaremos del motor DC o de corriente continua, que utiliza como estator un imán permanente, muy semejante al que aparece en la imagen inferior.
Algunas de las ventajas de utilizar este tipo de motor DC en nuestros proyectos con Arduino son:
- Tiene un par de arranque elevado, es decir, al iniciar su giro poseen una elevada fuerza para mover la carga. Tengamos en cuenta que el torque y la corriente consumida por el motor son directamente proporcionales, pero el torque y la velocidad son inversamente proporcionales, a mayor velocidad, menor torque o fuerza.
- Es reversible, o sea, que podemos invertir el sentido del giro de su eje con solo invertir la polaridad de su conexión. Aquí es donde cobra importancia una configuración de transistores conocida como Puente H.
- Podemos controlar su velocidad fácil y suavemente. La velocidad aumenta con la tensión aplicada. Esto es ideal si utilizamos la técnica de PWM (pulse-width modulation).
- Puede funcionar como dinamo; si movemos su eje o rotor con una fuerza mecánica, en los terminales de conexión del motor se generará energía eléctrica.
No te preocupes si no conoces la teoría de la modulación por anchura de pulso (PWM) o el Puente H, no es tan complejo como parece, sigue leyendo y entenderás.
Tipos de motores DC
Podemos clasificar un motor DC en:
- Con escobillas
- Sin escobillas
El resto son variantes de los anteriores como son:
- Motorreductor. Aumenta su fuerza reduciendo su velocidad, por medio de piñones.
- Motor con encoder. Para sensar la velocidad y el sentido de giro.
- Servomotor. Para movimientos que requieran precisión, con poca estabilidad en reposo. Su par motor es variable. Puede alcanzar mayor velocidad.
- Motor paso a paso. Para movimientos que requieran precisión y estabilidad en reposo. Su par motor siempre es máximo.
Escoger entre un servomotor o un motor paso a paso, dependerá de lo que necesitemos en nuestro proyecto.
En la imagen inferior observamos que un motor paso a paso no tiene escobillas.
Partes y funcionamiento de un motor DC
En la imagen inferior observamos las partes y el funcionamiento de un motor DC.
La fuente de tensión DC, por ejemplo una batería, se aplica al motor por medio de unas escobillas (brushes) de carbón (material resistente a la fricción), al colector de delgas del rotor. Aquí se establece el contacto entre una parte fija y una parte móvil.
La parte móvil se llama rotor, es una bobina que permite que se cierre el circuito eléctrico y se genere la corriente. Aparecen alrededor del rotor unas líneas de campo magnético.
El rotor se encuentra rodeado por un estator de imanes permanentes y por tanto está bajo la influencia de su campo magnético.
La interacción entre el campo magnético del rotor y el campo magnético del estator genera el movimiento del eje del rotor, este tiene colocada una polea en uno de sus extremos y así podemos aprovechar su movimiento.
Esta explicación, aunque básica, es suficiente para nuestro propósito.
Control de un motor DC
Ya sea que para nuestro proyecto con Arduino necesitemos un motorreductor, si estamos construyendo un carrito para nuestros niños; un servomotor, para mover un sensor ultrasónico; un motor paso a paso, para nuestra impresora 3D, o lo que tengas pensado construir que requiera movimiento, necesitarás tener en cuenta al menos tres de las características del motor DC vistas anteriormente:
- El torque que puede manejar, es proporcional al consumo de corriente (a mayor torque, más consumo).
- La inversión de giro del rotor.
- La regulación de su velocidad.
¿Cómo aprovechamos estas características?
Primero analicemos el caso del alto consumo de corriente de un motor DC.
La corriente que puede entregar un microcontrolador en sus salidas, es solo del orden de unos 20 mA, máximo 40 mA, y un pequeño motor DC de unos 6 voltios, ya puede consumir 60 mA funcionando sin carga. Ni pensar en motores un poco más grandes y con máxima carga.
Nunca debes colocar un motor DC directamente a una salida de un Arduino o ninguna otra tarjeta microcontrolada, ya que se destruiría el microcontrolador.
La solución será usar una interfaz de potencia o driver.
Una interfaz de potencia es un dispositivo intermedio entre nuestro microcontrolador y aquellos elementos que requieran corrientes mayores, como nuestro motor DC.
Existen varias opciones para realizar esta interfaz, la más básica es usando transistores; también podemos usar circuitos integrados como el driver L293D o módulos especializados como el L298N.
Las ultimas opciones facilitan las características de inversión de giro y control de velocidad de nuestro motor DC.
Material necesario
Para analizar estas tres formas de interfaz, necesitamos los siguientes componentes:
- Motor de 6 VDC
- Arduino UNO o similar
- Protoboard
- Cables DuPont
- Resistencia de 330 Ω
- Diodo 1N4004
- Transistor 2N2222
- Circuito integrado L293D
- Módulo L298N
Este es el primer circuito que se implementará.
Cada pin de nuestro Arduino puede suministrar con seguridad unos pocos miliamperios. Por lo tanto, usaremos al trasistor 2N2222 como interfaz, para evitar dañar el arduino debido al consumo excesivo de un Motor DC.
El transistor 2N2222 es un transistor bipolar NPN de aplicación general y lo usaremos como interruptor para encender o apagar el motor DC según un sketch muy sencillo.
Los transistores bipolares mediante una pequeña corriente de base, permiten controlar una corriente de colector-emisor, muy superior.
Si no conoces mucho de los transistores bipolares, encontrarás información detallada en el blog. También te recomiendo los artículos sobre transistores MOSFET, muy usados como drivers.
A tener en cuenta
Para poder controlar el motor correctamente, debemos considerar varios puntos.
- Lo primero es la tensión y el consumo de corriente del motor DC que vamos a controlar.
Vamos a utilizar un motor DC de 6 voltios. Su consumo de corriente está entre 60 mA sin carga y 180 mA con carga. No son valores de corriente muy altos, pero no podemos conectarlo directamente a Arduino.
- Ahora hay que pensar en el driver que se necesita para utilizar ese motor DC. Como el circuito es básico y solo necesitamos mover o parar el motor, un transistor bipolar es suficiente.
Usaremos el transistor 2N2222. Su datasheet nos dará algunos datos interesantes.
- Tensión colector-emisor máxima = 40 V
- Potencia máxima = 625 mW
- Corriente colector-emisor máxima = 800 mA
- Ganancia en corriente típica = 100
- Tensión base-emisor máxima = 2 V
Esos datos son suficientes para concluir que podemos utilizar el transistor 2N2222 como driver para el motor DC de nuestro proyecto.
Siempre hay que utilizar el datasheet y fijarse muy bien en los tres terminales del transistor bipolar: base, colector y emisor. Si nos equivocamos al conectarlo podemos destruirlo o no funcionará nuestro proyecto.
- Usaremos el transistor como un interruptor.
Conectamos el pin 3 de Arduino (control), a la base del driver T1, el transistor NPN 2N2222, por medio de la resistencia R1 de 330 Ω.
Un alto (HIGH) a la salida del pin 3, llevará el transistor a saturación (encendido), permitiendo la corriente entre colector-emisor, entonces el motor DC funcionará.
Un bajo (LOW) a la salida del pin 3, llevará el transistor a corte (apagado), y no circulará corriente por la juntura colector-emisor y el motor DC se detendrá.
- Por ser el motor DC una carga inductiva, debemos usar un diodo rectificador (D) 1N4004 o similar, en paralelo con el motor, para evitar dañar al transistor con la fuerza electromotriz (FEM) generada por la bobina del motor cuando cesa la corriente que circula por ella, esa corriente circulará por el diodo (que es un dispositivo que permite la circulación de una corriente alta en una sola dirección) y protegerá al transistor.
- La corriente que exige el motor DC puede exceder la corriente que entrega el puerto USB que alimenta nuestro Arduino, o la que puede entregar el regulador interno de 5 V que utiliza Arduino para la tensión externa que entra por su tomacorriente (jack).
El consumo de corriente en nuestro circuito es de 78.6 mA con el motor DC sin carga.
Siempre será mejor utilizar una fuente externa para conectar el motor DC y no tener problemas con el regulador de 5 V de Arduino o con la fuente de nuestro ordenador.
No olvides que si utilizas una fuente de alimentación externa, debes asegurarte de unir el negativo de la fuente de alimentación con el negativo (GND) de Arduino.
En la imagen inferior alimentamos el motor con una batería de 9V.
Debemos verificar estos puntos.
- La fuente de alimentación externa une su negativo con GND de Arduino.
- El motor DC debe ser ahora de 9V.
- La corriente sin carga y con carga será mayor.
- La velocidad del motor DC, medida en revoluciones por minuto (rpm) también aumentará (revisar las especificaciones del fabricante).
- Verificar si el driver que usamos, en este caso, el transistor 2N2222 se ajusta a las necesidades de nuestro circuito o debemos cambiarlo por uno de características superiores.
- Finalmente, no olvidemos que la velocidad de un motor DC puede ser muy elevada para efectos prácticos y debemos reducirla; por ejemplo, si queremos la tracción para las ruedas de un carro de juguete.
Usamos un motorreductor para tal fin, como el que se muestra en la imagen superior. Además de reducir la velocidad de nuestro motor DC, incrementaremos su torque, lo cual es conveniente.
Sketch
El programa que usaremos es el siguiente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Control de encendido/apagado de Motor DC byte motorDC = 3; void setup() { pinMode(3, OUTPUT); } void loop() { digitalWrite(motorDC, HIGH); delay(2000); digitalWrite(motorDC, LOW); delay(2000); } |
Notarás que es el mismo código al que llamamos blink y que utilizamos para hacer parpadear a un LED.
En la función loop(), hacemos mover el motor durante dos segundos a una velocidad constante y en un solo sentido de giro, a continuación lo paramos otros dos segundos.
Bien, hemos logrado mover y detener nuestro motor DC con la seguridad de que no quemaremos a nuestro Arduino; pero… y si necesitamos invertir el sentido de giro del motor ¿qué podemos hacer?
Controlar el sentido de giro de un motor DC con un Puente H
Aquí aprovechamos a nuestro favor la segunda característica de nuestro motor DC, que son reversibles, o sea, que podemos invertir el sentido del giro de su eje con solo cambiar la polaridad de su conexión. Y la mejor forma de conmutar la polaridad fácilmente, es utilizando un Puente H (su nombre es debido a que esquemáticamente es parecido a una letra H).
¿Qué es un Puente H?
El Puente H es un circuito electrónico que se utiliza para permitir a un motor DC girar en ambos sentidos.
En la imagen inferior vemos el Puente H, en su forma básica, construido con 4 interruptores deslizantes o de corredera.
Los interruptores SW 1 y SW 2 pueden conmutar la tensión positiva de la batería.
Los interruptores SW 3 y SW 4 conmutan la tensión negativa de la batería.
Primer caso: la pareja de interruptores SW 3 y SW 2 colocan la polaridad indicada en la imagen inferior (negativo a la izquierda y positivo a la derecha), el motor girará en sentido horario (clockwise).
Segundo caso: la pareja de interruptores SW 1 y SW 4 colocan la polaridad indicada en la imagen inferior (positivo a la izquierda y negativo a la derecha), el motor girará en sentido antihorario (counterclockwise).
El secreto de la inversión de giro del motor DC está en que los interruptores funcionen en forma sincronizada.
Como estarás pensando, una falla en la sincronización de los interruptores y se producirá un cortocircuito :(.
Afortunadamente los transistores, que pueden funcionar como interruptores, pueden hacer ese trabajo en forma más eficiente y veloz, y los circuitos integrados, tales como los drivers L293D y L298N, minimizan el espacio que ocuparían los transistores y sus resistencias de polarización, a veces hasta incluyen los diodos de protección de los transistores.
Variar la velocidad de un motor DC por PWM
Ya sabemos que para invertir el sentido de giro de un motor DC necesitamos un Puente H incorporado en un circuito integrado; ahora controlaremos su velocidad con la característica de que la misma es proporcional a la tensión aplicada.
Modulación por ancho de pulso
Arduino posee entradas y salidas digitales. Estas solo pueden estar en los estados alto (HIGH) y bajo (LOW); es decir, no aceptan puntos intermedios. En términos de tensión sería 5V o 0 V; con una salida digital podemos encender o apagar un motor DC, por intermedio de su respectivo driver. De esta forma solo podemos obtener su máxima velocidad.
Arduino tiene también entradas y salidas analógicas. Estas permiten obtener los valores de tensión intermedios entre 0 y 5 V.
Si necesitamos menos velocidad (menos rpm) en un motor DC, una salida análoga es lo ideal. Arduino no posee salidas análogas reales, ya que no tiene un Conversor Digital a Analógico (DAC), pero puede emular tensiones análogas produciendo una señal cuadrada variable en anchura, técnicamente hablando, varía el ciclo de trabajo (D). Esta técnica es conocida como PWM (pulse-width modulation).
Funcionamiento del PWM
Algunos pines de Arduino, vienen marcados con una virgulilla (~). Esos pines (por ejemplo el pin 3), cuando utilizamos la función analogWrite(), nos permite obtener una señal cuadrada con frecuencia de 490 Hz y ciclo de trabajo (D) variable.
Duty Cycle (D) o Ciclo de trabajo.
D = Ton / T. Ciclo de trabajo es la relación que existe entre el tiempo en que la señal se encuentra en estado activo (Ton) y el periodo de la misma (T).
Una onda cuadrada (T) se repite periódicamente determinado número de veces (490 veces por segundo en el pin 3 de Arduino), y se compone de un tiempo de encendido (Ton) y de un tiempo de apagado (Toff).
Si con esa onda cuadrada, alimentamos un diodo emisor de luz (LED), este se encenderá con el tiempo de encendido (Ton) y se apagará con el tiempo de apagado (Toff)
No es difícil comprender que si el tiempo de encendido (Ton) es superior al tiempo de apagado (Toff), el brillo del LED será superior; a mayor ciclo de trabajo (D), mayor tensión en el LED.
Veamos unos ejemplos.
En el primer caso, D es solo del 25%, entonces el brillo del LED es poco.
En el segundo caso, D es el 50%, entonces el brillo del LED es medio.
En el tercer caso, D es ya del 75%, entonces el brillo del LED es mayor.
En los casos extremos, D = 0%, LED apagado y D = 100%, LED a su brillo máximo.
La función digitalWrite() nos permite una resolución de 8 bits, es decir, podemos asumir valores desde 0 a 255 para lograr variaciones de anchura de pulso de 0 al 100%, de esta forma si colocamos un motor DC, con su respectivo driver, recibirá menos o más tensión, y como su velocidad depende de la tensión aplicada, pues podemos aprovechar esa característica y variar a voluntad la velocidad del mismo.
Motor DC con Arduino y L293D (CI)
El driver L293D, es un circuito integrado conformado por 2 Puentes H completos, pero podemos usar la mitad de cada uno por separado.
Con el driver L293D podemos aprovechar las tres características que hemos analizado de un motor DC, con solo un circuito integrado, fantástico :).
En la imagen inferior vemos el encapsulado tipo DIP (dual in-line package) o paquete de doble hilera como se presenta el driver L293D; debes tener en cuenta la numeración de sus pines.
Ahora detallemos la asignación de pines (pinout) del L293D.
- Lo primero que observamos, es que hay dos Vcc o dos fuentes de alimentación Vcc1 y Vcc2.
- Vcc 1, se refiere a la polarización para la parte lógica TTL (transistor-transistor logic) del integrado, esta trabaja a 5V.
- Vcc 2, es para la alimentación de los motores o carga, con un rango de 4.5 a 36 V.
- La corriente máxima soportada es de 600 mA.
- La potencia máxima es de 4 W.
- Los pines 4, 5, 12 y 13 van a GND y allí podemos colocar el disipador de calor.
- Incorpora diodos de protección.
- Tiene protección térmica interna (Thermal Shutdown).
- Con el pin 1 podemos habilitar (enable) con un alto (HIGH) el motor DC y controlar la velocidad del motor DC conectado a los drivers 1 y 2, mediante señal PWM.
- El pin 9 realiza la misma función, pero con los drivers 3 y 4.
- El driver L293D posee 4 canales independientes, por tanto podemos utilizarlo para 4 motores DC con un solo sentido de giro, para 2 motores DC con inversión de giro, o para motores paso a paso sin escobillas bipolares.
Se requiere cambiar el sentido de giro de nuestro motor DC y variar su velocidad. Por lo tanto, solo nos interesa la parte izquierda del driver L293D (pines 1 al 7). En otras palabras, usaremos uno de sus dos Puentes H, el conformado por los drivers 1 y 2.
En el pin 1 irá la salida PWM de Arduino para el control de la velocidad.
Con los pines 2 y 7 lograremos la inversión del giro del motor DC, según la siguiente tabla.
En los pines 3 y 6 conectaremos nuestro motor DC.
Esquemático
Observamos que el montaje del motor DC con Arduino y driver L293D es relativamente sencillo. La fuente de alimentación de 12 V para el motor nos muestra un consumo de 183 mA, sin carga. Nota que al estar internamente conectados los pines 4, 5, 12 y 13 del driver L293D, GND de Arduino y el negativo de la fuente de 12 V, quedan como un negativo común de todo el circuito.
Sketch
1 2 3 4 |
// Conexiones del driver L293D para un motor DC int enA = 3; int in1 = 6; int in2 = 7; |
Inicialmente declaramos nuestras variables:
Pin 3 para habilitar el motor y/o controlar su velocidad por medio de PWM.
Pines 6 y 7 para hacer el control de giro del motor DC.
1 2 3 4 5 6 |
void setup() { // Colocando los pines en modo salida pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); } |
En la función setup() colocamos los pines enA, in1 e in2, como salidas.
1 2 3 4 5 |
void loop() { // Iniciamos con el motor detenido digitalWrite(in1, LOW); digitalWrite(in2, LOW); delay(2000); |
En la función loop(), con la combinación LOW/LOW en in1 e in2, iniciamos con el motor detenido.
Esperamos dos segundos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Máxima velocidad del motor analogWrite(enA, 255); // Encendemos el motor digitalWrite(in1, HIGH); digitalWrite(in2, LOW); delay(2000); // Invertimos el sentido del giro del motor digitalWrite(in1, LOW); digitalWrite(in2, HIGH); delay(2000); // Apagamos el motor digitalWrite(in1, LOW); digitalWrite(in2, LOW); delay(2000); |
Con la función analogWrite() colocamos el motor a máxima velocidad (255).
Hacemos girar el motor DC en un sentido y luego invertimos su giro.
Detenemos el motor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Turn on motors digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Aumenta la velocidad de cero a máximo for (int i = 0; i < 256; i=i+1) { analogWrite(enA, i); delay(50); } // Disminuye la velocidad de máximo a cero for (int i = 255; i >= 0; i=i-1) { analogWrite(enA, i); delay(50); } } |
Finalmente encendemos el motor determinando la dirección del giro.
Con un ciclo for, primero incrementamos la velocidad de 0 a máxima.
Con otro ciclo for, disminuimos la velocidad de máxima a cero.
Y la función loop() repetirá todo de nuevo indefinidamente.
Ahora el sketch completo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
// Conexiones del driver L293D para un motor DC int enA = 3; int in1 = 6; int in2 = 7; void setup() { // Colocando los pines en modo salida pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); } void loop() { // Iniciamos con el motor detenido digitalWrite(in1, LOW); digitalWrite(in2, LOW); delay(2000); // Máxima velocidad del motor analogWrite(enA, 255); // Encendemos el motor digitalWrite(in1, HIGH); digitalWrite(in2, LOW); delay(2000); // Invertimos el sentido del giro del motor digitalWrite(in1, LOW); digitalWrite(in2, HIGH); delay(2000); // Apagamos el motor digitalWrite(in1, LOW); digitalWrite(in2, LOW); delay(2000); // Turn on motors digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Aumenta la velocidad de cero a máximo for (int i = 0; i < 256; i=i+1) { analogWrite(enA, i); delay(50); } // Disminuye la velocidad de máximo a cero for (int i = 255; i >= 0; i=i-1) { analogWrite(enA, i); delay(50); } } |
Motor DC con Arduino y driver L298N
Si para tu proyecto de control de un motor DC con Arduino, los 600 mA que soporta el driver L293D son insuficientes, te proponemos probar el módulo driver L298N.
El driver L298N es muy similar al driver L293D en cuanto al funcionamiento y es el módulo más utilizado para el control de motores DC.
Analicemos los componentes y la función de los pines del módulo L298N.
- El circuito integrado L298N es el driver que utiliza el módulo, tiene un doble puente H completo, lo que le permite manejar dos motores DC o un motor paso a paso.
- La corriente máxima que soporta es de 2 amperios.
- Los diodos de protección del driver, se encuentran en el módulo.
- Al igual que el driver L293D, el driver L298D también necesita una tensión de 5 V para su lógica.
- La tensión de entrada al módulo (Vin), está comprendida entre 5 V hasta los 35 V.
- Posee un regulador de tensión de 5 V (78M05).
- El puente (jumper) «j» se debe quitar si Vin es superior a 12V.
- Los pines habilitadores (EnA y EnB) cumplen la misma función que en el driver L293D, activar los motores con HIGH, o controlar la velocidad con PWM.
- La inversión de giro del motor A, se logra modificar con los pines IN1 – IN2 y la inversión de giro del motor B, se logra modificar con los pines IN3 – IN4, en forma similar como lo hace el driver L293D.
- El driver L298N también posee sensores de sobre corriente.
Considero que con lo visto a lo largo del artículo, no tendrás dificultad para utilizar el módulo L298N.
Conclusión sobre motor DC con Arduino
Ha sido un artículo extenso, pero el tema lo amerita.
El motor DC de imán permanente, con todas las variantes que puede tener merece un estudio profundo, pero si estás iniciando el aprendizaje de Arduino y de la electrónica digital, este artículo te puede servir para que comprendas los proyectos que se pueden hacer con los diferentes tipos de driver que existen el mercado.
Espero que el tema haya sido de tu agrado y te sirva de incentivo para seguir profundizando en tus estudios.
Gracias por leer.
Hasta pronto.
Gracias a Depositphotos por la cesión de las imágenes.