Una de las cosas más comunes cuando alguien empieza con Arduino, después de conseguir encender un LED, es intentar mover un motor DC. Estos son los motores que podemos encontrar en todos los tamaños y dispositivos: desde juguetes hasta taladros o sierras, impresoras viejas… Si queremos reciclar estos motores de corriente continua con Arduino, es muy sencillo y aquí vamos a ver las opciones que tenemos para controlar motores DC con Arduino.

Ejemplo del típico motor DC

Para probar si un motor funciona lo más fácil que podéis hacer es conectar directamente sus polos a una fuente de voltaje de, generalmente, 5V o 12V. Estos motores no tienen polaridad, simplemente giran en un sentido u otro en función de la polaridad. El problema es que conectándolo solo a una pila, no tiene mucha funcionalidad, así que lo ideal sería poder controlar cómo y cuándo se mueve. Para ello vamos a usar un Arduino y veremos diferentes formas de controlar nuestro motor de corriente continua.

Forma más sencilla: Controlar un motor DC con MOSFETs y PWM

Lista de componentes

Encendido y apagado

Lo primero que se nos puede ocurrir es conectar el motor DC a un GPIO del Arduino directamente, pero NO LO HAGAIS, ya que en cuanto pongáis el GPIO a 5V, el Arduino echará fuego, literalmente. Las GPIOs de los Arduinos solo pueden sacar 10-15mA, mientras que un motor, por pequeño que sea va a pedirte 100-200mA, así que cuidado con esto.

Para hacer el interfaz, y poder manejar el motor necesitamos poner una pieza intermedia, en este caso vamos a usar un MOSFET. Tened en cuenta que tenéis que buscar un MOSFET con el Vgs menor que el voltaje de vuestro Arduino. Por ejemplo, para un Arduino Nano a 5V, se puede usar el IRF540, que tiene el Vgs en 3V, por lo que con nuestro Arduino lo podemos poner en funcionamiento sin problema.

Podemos simplificar (mucho) el funcionamiento de un MOSFET, como un interruptor, cuando en la entrada (G) tiene 5V, deja circular la corriente, y, cuando la entrada es 0V, funciona como un circuito abierto. Por lo tanto podemos hacer el siguiente circuito y controlar el motor sin problema:

Circuito básico para controlar un Motor DC con un MOSFET y Arduino.

El diodo (D) es necesario ponerlo para proteger nuestro circuito del voltaje que pueda generar las bobinas del motor (para más info buscar info de bobinas). Más allá de eso, el código que necesitamos para controlar cuando encendemos o apagamos el motor es muy sencillo. Para controlar el motor DC con Arduino y un MOSFET necesitas este código:

// Pin donde esta conectado el MOSFET
#define GPIO_MOTOR 10

void setup(){
    pinMode(GPIO_MOTOR, OUTPUT);
}

void loop(){

    // Encendemos el motor
    digitalWrite(GPIO_MOTOR, HIGH);
    delay(1000);

    // Apagamos el motor
    digitalWrite(GPIO_MOTOR, LOW);
    delay(1000);

}

Control de velocidad mediante PWM

En el caso anterior hemos encendido o apagado el motor, pero es muy aburrido, no? Podemos también controlar su velocidad. Para ello lo que hacemos es encenderlo y apagarlo muy rápidamente, con una señal conocida como PWM. Con Arduino podemos hacerlo fácilmente con la función ‘analogWrite‘ sobre un pin que tenga PWM. En el siguiente ejemplo lo hacemos con el pin 10, que para el Arduino Nano es un pin PWM.

// Pin donde esta conectado el MOSFET
#define GPIO_MOTOR 10

void setup(){
    pinMode(GPIO_MOTOR, OUTPUT);
}

void loop(){

    // Motor apagado 0%
    analogWrite(GPIO_MOTOR, 0);
    delay(1000);

    // Motor al 50%
    analogWrite(GPIO_MOTOR, 127);
    delay(1000);

    // Motor al 75%
    analogWrite(GPIO_MOTOR, 191);
    delay(1000);

    // Motor al 100%
    analogWrite(GPIO_MOTOR, 255);
    delay(1000);

}

Forma avanzada: Controlar motor DC con L298N (Arduino + Puente H)

Lista de componentes

Funcionamiento puente H

En el caso anterior, teníamos que podíamos conectar activar el motor, e incluso controlar su velocidad. Sin embargo, en la mayoría de los casos, nos vendría bien poder controlar el sentido de giro (por ejemplo para hacer una grúa, o el motor de un coche). Para ello hay que usar lo que se conoce como puente H. Ten cuidado, solo se pueden manejar hasta 1A por motor de manera segura!

En resumen, un puente H es una construcción de 4 MOSFETs que consiguen “cambiar” la polaridad de conexión del motor DC. El esquema es el de la siguiente imagen, si activamos las señales A y D, se generaría un circuito entre 5V y tierra. Mientras que si encendemos el C y B, la corriente pasaría en el sentido contrario al anterior, a través del motor. De esta manera hemos conseguido que gire en direcciones opuestas. Hay que tener cuidado porque nunca hay que encender a la vez A y B o C y D, ya que de esa manera estaríamos generando un cortocircuito entre 5V y tierra.

Diagrama básico del puente H
Diagrama básico de un puente H

Los casos de funcionamiento los podemos ver aquí muy fácil:

Usando el L298N

El circuito que hemos visto está esquematizado, y se necesitarían varias resistencias y cables. Además de los cuatro transistores y todas las conexiones, montar todo esto es un poco jaleo. Para ello existen ya integrados que tienen un puente H dentro, por ejemplo el L298N, que tiene dos puentes H para poder controlar 2 motores.

Antes de empezar, hay que alimentar el L298N, para ello nos tenemos que fijar en el jumper de alimentación. Cómo vemos, el L298N tiene la entrada Vin, Gnd, y 5V, el jumper de alimentación sirve para definir como funciona el pin de 5V. El voltaje Vin es el encargado de alimentar principalmente a lo motores, mientras que el 5V es el voltaje que necesitan los componentes para funcionar (parte lógica).

Cuando el jumper está colocado el regulador interno del módulo está funcionando y los 5V salen de módulo. Estos 5V pueden servir para alimentar, por ejemplo, tu Arduino, además de la parte lógica del módulo. En este caso, el voltaje en Vin tiene que ser menor a 12V, ya que de otra manera quemaríamos el regulador.

Cuando el jumper no está colocado el voltaje Vin y 5V están separados, y tendríamos que aplicar los 5V desde otro sitio (por ejemplo, nuestro Arduino). Esto sirve, por si necesitamos aplicar mayor voltaje a los motores: sin el jumper, podemos poner hasta 30V en la entrada Vin.

En resumen:

  • Ponemos el jumper, y entonces alimentamos en Vin con máximo12V, y sacamos 5v desde la salida 5V
  • No ponemos el jumper, podemos alimentar el Vin con hasta 30V y necesitamos meter 5v en el pin 5V.
  • En ambos casos, tendremos que juntar las GND del módulo y del Arduino.

Por otro lado, una vez que tenemos todo alimentado, para controlar los motores tenemos que usar ENA,IN1,IN2 para uno de los motores, y ENB, IN3, IN4 para el otro motor. Vamos a ver el ejemplo con uno de ellos, para el otro sería igual.

Las entradas INx sirven para configurar el sentido de giro del motor: si IN1 es HIGH e IN2 es LOW, el motor gira en un sentido; si IN1 es LOW e IN2 es HIGH, el motor gira en el sentido contrario. Es importante nunca poner ambos IN1 e IN2 a HIGH, ya que provocaríamos un cortocircuito. Por su lado las entradas ENA y ENB sirven para activar cada motor.

IN1IN2Motor
LOWLOWNo se mueve
HIGHLOWGiro en un sentido
LOWHIGHGiro en el otro sentido
HIGHHIGHNO PERMITIDO! peligro de romper el módulo.

De esta manera, tenemos varios caminos para manejar este módulo: podemos activar en ENA siempre, y meter la señal PWM en IN1 o IN2; o configurar IN1 e IN2 en la dirección que queremos, y poner la señal PWM en ENA. Vamos a hacer un ejemplo con el segundo caso.

#define GPIO_IN1 5
#define GPIO_IN2 6

// Pin con PWM
#define GPIO_ENA 10

void setup(){

    // Seteamos los IN1 y 2 a LOW
    pinMode(GPIO_IN1 , OUTPUT);
    digitalWrite(GPIO_IN1, LOW);

    pinMode(GPIO_IN2 , OUTPUT);
    digitalWrite(GPIO_IN2, LOW);   
}

void loop(){

    // Configuramos la dirección de giro
    digitalWrite(GPIO_IN2, LOW);
    digitalWrite(GPIO_IN1, HIGH); 

    // Activamos el PWM al 50%
    analogWrite(GPIO_ENA, 128);
    delay(1000);

    // Cambiamos la dirección de giro
    digitalWrite(GPIO_IN1, LOW);
    digitalWrite(GPIO_IN2, HIGH); 

    // Activamos el PWM al 50%
    analogWrite(GPIO_ENA, 128);
    delay(1000);

}

Y con esto, tendremos un motor girando en dos direcciones, ¿Te animas a poner dos motores? 😉

Más potencia: Motor DC con MONSTER MOTO VNH2SP30

Lista de componentes

Usando el VNH2SP30 con Arduino

El VNH2SP30 es un controlador para motores DC, también tiene un puente H, pero es capaz de soportar mucha más corriente: 14A de forma continua y picos de hasta 30A. El control es muy parecido al del L298N, aunque en este caso solo tenemos un puente H, para controlar un motor.

La alimentación de este módulo en concreto, es muy sencilla, necesitamos en Vin colocar la batería que sea capaz de proveer toda la corriente y voltaje que necesita el motor. Mientras que por la entrada 5V, tenemos que alimentar la lógica del chip.

Quitando los pines CS y EN que son para funciones avanzadas: sensor de corriente del motor y estados de error respectivamente; el resto de pines se controlan igual que en el caso del L298N. Es decir podemos dejar al aire los pines CS y EN y conectar PWM a un puerto PWM del Arduino, e INA e INB a un GPIO cualquiera, y podemos usar el skecth de antes. Hay que tener en cuenta que los puertos PWM de Arduino sacan por defecto una frecuencia de 500-1000Hz, así que no tendremos problemas. Sin embargo, si generamos nosotros la señal, tendríamos que comprobar que la frecuencia sea menor de 20 Khz.

#define GPIO_IN1 5
#define GPIO_IN2 6

// Pin con PWM
#define GPIO_ENA 10

void setup(){

    // Seteamos los IN1 y 2 a LOW
    pinMode(GPIO_IN1 , OUTPUT);
    digitalWrite(GPIO_IN1, LOW);

    pinMode(GPIO_IN2 , OUTPUT);
    digitalWrite(GPIO_IN2, LOW);   
}

void loop(){

    // Configuramos la dirección de giro
    digitalWrite(GPIO_IN2, LOW);
    digitalWrite(GPIO_IN1, HIGH); 

    // Activamos el PWM al 50%
    analogWrite(GPIO_ENA, 128);
    delay(1000);

    // Cambiamos la dirección de giro
    digitalWrite(GPIO_IN1, LOW);
    digitalWrite(GPIO_IN2, HIGH); 

    // Activamos el PWM al 50%
    analogWrite(GPIO_ENA, 128);
    delay(1000);
}
   

Y así podrías controlar motores bien gordos!

¿Te animas a probarlo? Entra a mi Twitch y cuéntamelo 🙂

Categorías: Arduino

Gluón

Teleco con ganas de aprender más y compartirlo. Viajero empedernido y amante de la fotografía y la tecnología. Espero dejar mi granito de arena y que este pueda servir de ayuda.