Motores CC con Arduino

Como controlar 2 motores de C.C. con el L298N y Arduino

Para empezar a hacer tus pinitos en la robótica, es imprescindible aprender a controlar motores de corriente continua y controladores de motores basados en puentes H.

En esta sesión, usaremos el L298N, este driver para motores es uno de los más populares entre los aficionados a la electrónica y la robótica.

Material necesario

Arduino UNO R3 Arduino UNO R3
Controlador de Motores L298N Controlador de Motores L298N
Ruedas reductoras para robot Ruedas reductoras para robot
Cables para Protoboard Cables para Protoboard

Algo sobre motores de C.C. (Corriente Continua)

El motor CC. es una máquina encargada de convertir la energía eléctrica en energía mecánica.

Estos motores están formados por dos partes fundamentalmente:

  • Estator: Es la parte inmóvil del motor y esta compuesto por unos potentes imanes.
  • Rotor: Es la parte móvil del motor. Esta parte está compuesta por una serie de bobinas de hilos de cobre enrolladas en un núcleo ferreomagnético.
Motor CC en movimiento

Conozcamos el controlador L298N.

Para entender el funcionamiento del L298N, primero tenemos que conocer el puente H.

Puente H

El puente H esta compuesto principalmente por 4 interruptores, los cuales se accionan de dos en dos. En la primera imagen activamos los interruptores 1 y 4, así el positivo le llega al motor por la borna derecha y el motor gira en sentido de las agujas del reloj.

Puente H

En la segunda imagen, desactivamos los interruptores 1 y 4 y activamos los interruptores 2 y 3, de esta forma el positivo le llega al motor por la borna izquierda y el motor gira en sentido antihorario.

Estos interruptores se pueden sustituir por componentes electrónicos que hagán la misma función, como por ejemplo, transistores y reles.

El L298N tiene en su interior dos puentes H.

Características:

Tensión de funcionamiento6 – 48V
Intensidad por canal2A
Salida5V
Peso48g

Esquema de conexión

Nota: Si usamos alimentaciones diferentes para el controlador de motores y Arduino, hay que unir GND de ambas placas.

Esquema conexión L298N

Código

En esta ocasión tenemos dos códigos, el primero usamos directamente el L298N con las funciones de Arduino, en el segundo código de ejemplo usamos una librería desarrollada por Leantec.ES para facilitar el control de dos motores de cc con este driver.

Código 1 (Sin librería)

#include <LEANTEC_ControlMotor.h>   //Incluimos la librería control de motores  

// Configuramos los pines que vamos a usar
ControlMotor control(2,3,7,4,5,6); 
int MotorDer1=2; //El pin 2 de arduino se conecta con el pin In1 del L298N
int MotorDer2=3; //El pin 3 de arduino se conecta con el pin In2 del L298N
int MotorIzq1=7; //El pin 7 de arduino se conecta con el pin In3 del L298N
int MotorIzq2=4; //El pin 4 de arduino se conecta con el pin In4 del L298N
int PWM_Derecho=5; //El pin 5 de arduino se conecta con el pin EnA del L298N
int PWM_Izquierdo=6; //El pin 6 de arduino se conecta con el pin EnB del L298N
int velocidad=150; //Declaramos una variable para guardar la velocidad

void setup() {    //Configuramos los pines como salida
pinMode(MotorDer1, OUTPUT);   pinMode(MotorDer2, OUTPUT);
pinMode(MotorIzq1, OUTPUT);   pinMode(MotorIzq2, OUTPUT);
pinMode(PWM_Derecho, OUTPUT);   pinMode(PWM_Izquierdo, OUTPUT);


void derecha_antihorario_izquierda_horario()
{
/*En esta fución la rueda derecha girará en sentido antihorario y la izquierda en sentido horario. En este caso, si las ruedas estuvieran en el chasis de un robot, el robot retrocederia.*/   
digitalWrite(MotorDer1,HIGH);   
digitalWrite(MotorDer2,LOW);
digitalWrite(MotorIzq1,HIGH);   
digitalWrite(MotorIzq2,LOW);
analogWrite(PWM_Derecho,200);//Velocidad motor derecho 200
analogWrite(PWM_Izquierdo,200);//Velocidad motor izquierdo 200
}

void derecha_horario_izquierda_antihorario(){
/*En esta fución la rueda derecha girará en sentido horario y la izquierda en sentido antihorario. En este caso, si las ruedas estuvieran en el chasis de un robot, el robot avanzaría.*/   
digitalWrite(MotorDer1,LOW);   
digitalWrite(MotorDer2,HIGH);   
digitalWrite(MotorIzq1,LOW);   
digitalWrite(MotorIzq2,HIGH);
analogWrite(PWM_Derecho,200);//Velocidad motor derecho 200
analogWrite(PWM_Izquierdo,200);//Velocidad motor izquierdo 200
}

void giro_horario(){
/*En esta fución ambas ruedas girarán en sentido horario. En este caso, si las ruedas estuvieran en el chasis de un robot, el robot giraria a la derecha.*/   
digitalWrite(MotorDer1,HIGH);   
digitalWrite(MotorDer2,LOW);   
digitalWrite(MotorIzq1,LOW);   
digitalWrite(MotorIzq2,HIGH);
analogWrite(PWM_Derecho,200);//Velocidad motor derecho 200
analogWrite(PWM_Izquierdo,200);//Velocidad motor izquierdo 200
}

void giro_antihorario(){
/*En esta fución ambas ruedas girarán en sentido antihorario. En este caso, si las ruedas estuvieran en el chasis de un robot, el robot giraria a la izquierda.*/   
digitalWrite(MotorDer1,LOW);   
digitalWrite(MotorDer2,HIGH);   
digitalWrite(MotorIzq1,HIGH);   
digitalWrite(MotorIzq2,LOW);
analogWrite(PWM_Derecho,200);//Velocidad motor derecho 200
analogWrite(PWM_Izquierdo,200);//Velocidad motor izquierdo 200
}

void parar(){ /*Función para que las ruedas paren*/
digitalWrite(MotorDer1,LOW);   
digitalWrite(MotorDer2,LOW);   
digitalWrite(MotorIzq1,LOW);   
digitalWrite(MotorIzq2,LOW);
analogWrite(PWM_Derecho,200);//Velocidad motor derecho 200
analogWrite(PWM_Izquierdo,200);//Velocidad motor izquierdo 200
}

void loop() { 
giro_horario(); //Llamamos a la función giro_horario
delay(3000); //Durante 3 segundos ejecutamos esa función
giro_antihorario(); //Llamamos a la función giro_antihorario
delay(3000); //Durante 3 segundos ejecutamos esa función
derecha_horario_izquierda_antihorario(); //Llamamos a la función derecha_horario_izquierda_antihorario
delay(3000); //Durante 3 segundos ejecutamos esa función
derecha_antihorario_izquierda_horario(); //Llamamos a la función derecha_antihorario_izquierda_horario
delay(3000); //Durante 3 segundos ejecutamos esa función
parar(); //Llamamos a la función parar
delay(3000); //Durante 3 segundos ejecutamos esa función   
}

Código 2 (Con librería)

Librería control de motores.

Esta librería se configura en con una sola linea de código.

#include <LEANTEC_ControlMotor.h>//Incluimos la librería control de motores  

// Configuramos los pines que vamos a usar
ControlMotor control(2,3,7,4,5,6); // MotorDer1,MotorDer2,MotorIzq1,MotorIzq2,PWM_Derecho,PWM_Izquierdo
control.Motor(200,100);

Y el control de motores se hace con la siguiente linea de código,donde el primer número que está en el parentesis es la velocidad con la que se mueven los motores y el siguiente número nos indica el giro que hacen y la direccíon.

/* Si los motores estuvieran en el chasis de un robot,  este haría un giro del 100% a la derecha a una velociad de 200.*/
control.Motor(200,100);
/* Si los motores estuvieran en el chasis de un robot,  este haría un giro del 100% a la izquierda a una velociad de 200.*/
control.Motor(200,-100);
/* Si los motores estuvieran en el chasis de un robot,  este haría un giro del 70% a la derecha a una velociad de 200.*/
control.Motor(200,70);
/* Si los motores estuvieran en el chasis de un robot,  este avanzaría recto una velociad de 180.*/
control.Motor(180,1);

Código 2 para cargar en Arduino

#include <LEANTEC_ControlMotor.h>//Incluimos la librería control de motores  // Configuramos los pines que vamos a usar ControlMotor control(2,3,7,4,5,6); // MotorDer1,MotorDer2,MotorIzq1,MotorIzq2,PWM_Derecho,PWM_Izquierdo int velocidad=150;//Declaramos una variable para guardar la velocidad. 150 es la velocidad en la que empezará. void setup()  { //En esta ocasión no necesitamos configurar pines ya que la librería lo hace. }    void loop()  {//Un motor gira en sentido horario y el otro antihorario //Si estuvierán montados en un robot el robot avanzaria.   while(velocidad<254){  velocidad++;  control.Motor(velocidad,1);   delay (200);} //Un motor gira en sentido horario y el otro antihorario //Si estuvierán montados en un robot el robot retrocedería.    control.Motor(-180,1);   delay(3000); //Los dos motores giran en sentido horario. //Si estuvieran montados en un robot este giraria a la derecha.    control.Motor(200,100);   delay(3000); //Los dos motores giran en sentido antihorario. //Si estuvieran montados en un robot este giraria a la derecha.     control.Motor(200,-100);   delay(3000); //Los motores se paran.   control.Motor(0,1);   delay(3000);      velocidad=150;//Reseteamos la velocidad   } 

Vídeo de ejemplo con los motores funcionando

Esperamos que les sea de utilidad y no olviden que en nuestro blog encontrará muchos otros post de su interes.

Etiquetas: , , , , , , ,

17 Comments

  • Tiago dice:

    Hola,una pregunta,¿Se pueden usar 3 motores en el l298?

  • fernando paredes dice:

    Hola
    Ya monte este proyecto pero al compilar el programa en arduino me sale el error:
    La librería «LEANTEC – Libreria ControlMotor (1)» no se puede usar.
    Los nombres de librería deben contener sólo números y letras.
    (Sólo ASCII y sin espacios, y no pueden empezar con un número)

    ayuda por favor!! es para el proyecto de una clase de la universidad.
    gracias por su ayuda

  • lil pump dice:

    eStà pahína me a aiudo muitcho a azer my plaka (:

  • Pau dice:

    eStà Pàjina ne aiudo muxo a azer la plaka arduino.de berdad kq mhe aiudo muxo. grazias.

  • Leonardo Alberto dice:

    Una pregunta, Como le haria si el giro de esas ruedas dependen de lo que unos sensores infrarrojos detecten? Seria de mucha ayuda

  • RAMSES dice:

    hechenme la mano estoy empesando con arduino y tengo una duda, quiero controlar 6 motores dc con 3 modulos L298N
    todo funsiona bien , pero cuando quiero variar los tiempos, no me respeta los delay, le pongo un Segundo y me da 6 segundos
    me podrian ayudar

  • Santiago Molina Alcantara dice:

    Estoy desesperado, pero no consigo hacerlo funcionar. El amperaje de salida es demasiado bajo y solo mueve el motor si le doy un empujoncito. No se que hacer uso el mismo circuito que planteas, aunque he probado de todo, hasta he comprado un controlador nuevo,

    Alguna idea?

    Gracias

  • Carlos dice:

    Hola, estoy trabajando con un arduino Nano y tengo el siguiente inconveniente. He asignado como PWM de un motor el pin D10, pero cuando mido tensión solo mido 3,6V y no alcanza a habilitarlo. En el Pin D2 del otro motor mido 4,6V. Podrían comentarme que puede llegar a ser? La nano está montada sobre una protoboard sin ningun cable.
    Les paso mi código:

    #include //Incluimos la librería control de motores
    ControlMotor control(A3, A2, 7, 8, 2, 10); //

    void setup() {
    }

    void loop() {
    control.Motor(200, 1); //Motores de avance encendidos.
    }

    • Carlos dice:

      Hola de nuevo, he estado haciendo varias pruebas y parece que la librería ha dejado de funcionar correctamente, debe ser algún cambio en el IDE de Arduino. He cargado programas viejos que andaban perfectamente y ya no funcionan. Ahora estoy utilizando otra librería y anda perfectamente. Espero puedan corregir el error porque estaba muy buena la librería.
      Saludos!

  • Gorka dice:

    Buenas ivan, he probado de todas las maneras y no se que puede fallar.
    He probado con el jumper quitado y puesto, alimentando asi externamente el L298N pero ni por esas..
    Si pudieras enviarme un circuito correcto de las conexiones (mi correo es: gorkagmv@gmail.com)
    Los pines PWM los tengo conectados igual que los que pones tu aqui…

    Gracias de antemano
    Un saludo

  • Rafael dice:

    Hola,
    Es un tutorial estupendo, enhorabuena y muchas gracias.
    Pero tengo una preguntilla; al montar el circuito los jumper de EnA y EnB deben estar puestos o quitados???
    Y si debieran de estar quitados, cual de los dos pines que hay en cada «En» se conectar al pin 5 y 6 del arduino?? el de más a dentro o el de más a fuera??
    Muchas gracias y recibid un cordial saludo,
    Rafael

  • Adan dice:

    esta bien culera esta pagina

  • Sebastien dice:

    Tengo une problema con el kit y los motores o mas probablamente, con el 298 : parece que cuando tengo el robot en las manos, los motores funcionnan pero Cuando pongo el robot al suelo, solamente puede girar (un motor), cada vez que los 2 motores deben funcionnar juntos, el robot no se mueve, especialmente Cuando debe avancar…

    Pienso que las batterias 4 x AA no es sufficiente (voy a probar…).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *