Blog Search

Recent Articles

Latest Comments

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

Como controlar 2 motores de C.C. con el L298N y 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 leantec

-Arduino UNO

L298n leantec

-L298N

ruedas y motores leantec

-Motores de C.C.

cables leantec

-Cables

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 fundamentalmete:

-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 enrrolladas en un núcleo ferreomagnético.

motor corriente continua leantec

Conozcamos el controlador L298N.

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

puente h leantec
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 leantec
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 funcionamiento 6-48V.
-Intensidad por canal 2A.
-Salida de 5V.
-Peso 48g.

DESCARGAR HOJA DE DATOS 

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 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.

DESCARGAR LIBRERÍA

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.




7Comentarios

    • Avatar
      Sebastien
      feb 22, 2016

      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...).

      • Avatar
        Alvaro Rodriguez
        abr 15, 2016

        Tiene pinta que no le llega suficiente potencia (No voltaje, si no amperaje)

    • Avatar
      Rogelio Garcia Bautista (El botas)
      may 20, 2016

      Está chingón todo pero ¿Qué es un arduino? De ahi en fuera todo al cien prro +10 papu

    • Avatar
      Pisa (El amante de la hamburguesa)
      may 20, 2016

      ¿Si no tengo el Arduino khé proCD? la dvd no c ni madres no soi 100tifico

    • Avatar
      Rasputio
      feb 9, 2017

      veo gente de la grasa :V

    • Avatar
      Rafael
      mar 23, 2017

      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

    • Avatar
      Gorka
      ago 1, 2017

      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

Leave a Reply

* Name:
* E-mail: (Not Published)
   Website: (Site url withhttp://)
* Comment:
Type Code