bclose

PROGRAMA DE CONTROL DEL COCHE

Movimiento del coche

Objetivos

 

    • Aprender a utilizar el controlador de motores L298N.
    • Comprobar las conexiones Arduino-L298N-motores.
    • Crear el programa para controlar el coche con el teléfono móvil.
 

Material requerido.

 

  Tienda España Tienda Mexico
Vista principal  Robot educativo Robot educativo

 

CONTROLADOR DE MOTORES L298N

 

En la sesión anterior ya conectamos y explicamos cómo funciona el controlador, pero vamos a recordarlo un poco por encima antes de ponernos a programar.

Para controlar la velocidad de giro de los motores se utilizan los pines ENA y ENB, que hemos conectado a las salidas analógicas 6 y 5 de Arduino respectivamente.

 
  • Podemos darles un valor de 0 a 255, aunque os recomendamos que no le pongáis un valor demasiado alto ni demasiado bajo.
  • Si le damos un valor demasiado bajo, no será suficiente para mover los motores.
  • Si por el contrario le damos uno demasiado alto no vamos a tener suficiente potencia para mover las ruedas y hacer funcionar el Bluetooth que pondremos en la siguiente sesión.
  • Los componentes que sirven para comunicarse a distancia, como el Bluetooth, consumen mucha energía. 

Para controlar el sentido de giro de los motores se utilizan los pines IN1 e IN2, para el motor A y los pines IN3 e IN4 para el motor B, y funcionan de la siguiente forma.

 
  • Si IN1 está a HIGH e IN2 a LOW, el motor A gira en un sentido
  • Si IN1 está a LOW e IN2 a HIGH lo hace en el otro.
  • Lo mismo con los pines IN3 e IN4 y el motor B. 
diagrama eléctrico

 

COMPROBANDO EL SENTIDO DE GIRO

 

Sabemos que con los pines IN1 a IN4 controlamos el sentido de giro de los motores, pero el problema que se nos presenta es que no tenemos forma de saber hacia qué dirección va a girar, así que lo haremos mediante ensayo y error.

Haremos un pequeño programa en el que iremos mandando instrucciones por el puerto serie para controlar el movimiento de los motores.

Lo primero que vamos a necesitar es declarar las variables que utilizaremos para definir los pines que vamos a utilizar y fijar la velocidad fácilmente. Y en el definimos todos como salidas.

// Motor A
int ENA = 6;
int IN1 = 13;
int IN2 = 12;

// Motor B
int ENB = 5;
int IN3 = 11;
int IN4 = 10;

int vel = 200;

void setup()
{
 Serial.begin(9600) ;
 // Declaramos todos los pines como salidas
 pinMode (ENA, OUTPUT);
 pinMode (ENB, OUTPUT);
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
 pinMode (IN3, OUTPUT);
 pinMode (IN4, OUTPUT);
}

Ahora vamos a suponer que el coche se va a mover hacia delante cuando tengamos IN1 (pin 13 de Arduino) a LOW, IN2 (pin 12) a HIGH, IN3 (pin 11) a LOW e IN4 (pin 10) a HIGH. Además le indicaremos la velocidad a lo que lo tiene que hacer con los pines ENA y ENB.

En el loop vamos a crear una estructura case que utilizaremos para controlar el movimiento, y en función de lo que recibamos por el puerto serie se moverán los motores en una u otra dirección. Utilizaremos ‘F’ para ir hacia delante, ‘B’ para ir hacia atrás, ‘R’ y ‘L’ para girar y ‘S’ para parar.

 
  • Escogemos esos caracteres porque son los que luego utilizará la aplicación que utilizaremos con nuestro Smartphone para controlar al coche.
  • Por si alguno no cae, son las inciales de Forward, Backward, Right, Left y Stop. 
void loop()
{
 // Motor gira en un sentido
 if (Serial.available())
 switch (Serial.read())
 {
 case 'F':
 Adelante();
 break;
 case 'B':
 Atras();
 break;
 case 'R':
 Derecha();
 break;
 case 'L':
 Izquierda();
 break;
 case 'S':
 Parar();
 break;
 }
}

Y haremos que lo haga cuando reciba una ‘F’ de forward por el puerto serie.

Contenido solo disponible para suscriptores. ¡Accede al contenido!

Para comprobarlo encendemos el interruptor del coche y pulsamos la tecla hacia delante. Pueden pasar 4 cosas:

 
  • Que el coche se mueva hacia delante. ¡Perfecto! Hemos tenido suerte y no vamos a tener que cambiar nada.
  • Que el coche se mueva hacia detrás. Los dos se mueven al revés de lo que hemos supuesto.
  • Que el coche gire hacia la derecha. El motor B gira al revés de lo que hemos supuesto.
  • Que el coche gire a la izquierda. El motor A gira al revés de lo que hemos supuesto. 

Bueno, pues si sois de la primera opción, felicidades, y sino no pasa nada porque esto tiene fácil arreglo, y de hecho, podemos arreglarlo de varias formas.

Podemos intercambiar las dos conexiones del motor que esté girando al revés de lo que buscamos, o de los dos motores si los dos lo hacen al revés. OUT1 y OUT2 para el motor A, y OUT3 y OUT4 para el motor B.

Si os resulta complicado acceder a esos cables, también podéis intercambiar los pines que controlan el sentido de giro de los motores. Es decir, IN1 e IN2 para el motor A, e IN3 e IN4 para el motor B.

Y si no queréis andar cambiando los cables podemos cambiar el programa. Sólo tendríamos que cambiar el estado de los pines que dan el sentido de giro del motor que queramos invertir. Si, por ejemplo, quisiéramos cambiar el sentido de giro del motor A, haríamos lo siguiente:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

Si lo corregís de cualquiera de las dos primeras formas, el resto del programa podéis seguirlo igual que el que vayamos haciendo nosotros. Si lo hacéis de la última forma, tendréis que tenerlo en cuenta también para el resto del programa y cambiarlo también para los demás movimientos.

 

PROGRAMACIÓN DEL COCHE

 

Una vez que tenemos programado el movimiento hacia delante y tenemos claro cómo giran nuestros motores, el resto lo tenemos fácil. Ahora vamos a hacer que se mueva hacia atrás al recibir ‘B’ (de Backward), para lo que sólo necesitaremos invertir los pines 10 al 13 que controlan el sentido de giro.

void Atras ()
{
 //Direccion motor A
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, LOW);
 analogWrite (ENA, vel); //Velocidad motor A
 //Direccion motor B
 digitalWrite (IN3, HIGH);
 digitalWrite (IN4, LOW);
 analogWrite (ENB, vel); //Velocidad motor B
}

Si lo que queremos es girar a la derecha, el motor A debería ir hacia delante y el B hacia atrás, y lo contrario para girar a la izquierda. Como podréis imaginar utilizaremos ‘R’ y ‘L’ (Right y Left)

void Derecha ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, HIGH);
 analogWrite (ENA, vel); //Velocidad motor A
 //Direccion motor B
 digitalWrite (IN3, HIGH);
 digitalWrite (IN4, LOW);
 analogWrite (ENB, vel); //Velocidad motor A
}

Contenido solo disponible para suscriptores. ¡Accede al contenido!

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
  • Cómo controla el L298N con un Arduino.
  • A programar correctamente el movimiento del coche.

LikeUsOnFacebook_Icon

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(29) Comments

  • Avatar for Ivan Uriarte
    • Charly

    Hola Weimar, ese error indica que no has cargado la libreria previ necesaria para compilar el programa.

    Tienes que descargar e instalar la libreria SoftwareSerial.h No se en que tuto estas pero seguro que tienes una indicacion de descargarlo e instalarlo en algun punto anterior

    y escribe

  • Avatar for Ivan Uriarte
    • Weimar1203

    Hola Ivan tengo un problema , a la hora de cargar el codigo en el arduino me aparece este fallo «SoftwareSerial.h: No such file or directory» supongo

  • Avatar for Ivan Uriarte
    • Sergio

    Hola, tengo problemas con uno de los motores, y es que no hace el giro hacia adelante. Hacia atrás no tiene ningún problema y no encuentro la lógica del fallo dentro del código. Os paso los métodos de avanzar hacia adelante y hacia atrás:

    void avanzar()
    {
    //Direccion motor A
    digitalWrite (IN1, HIGH);
    digitalWrite (IN2, LOW);
    analogWrite (ENA, vel); //Velocidad motor A
    //Direccion motor B
    digitalWrite (IN3, HIGH);
    digitalWrite (IN4, LOW);
    analogWrite (ENB, vel); //Velocidad motor B
    }

    void retroceder()
    {
    //Direccion motor A
    digitalWrite (IN1, LOW);
    digitalWrite (IN2, HIGH);
    analogWrite (ENA, vel); //Velocidad motor A
    //Direccion motor B
    digitalWrite (IN3, LOW);
    digitalWrite (IN4, HIGH);
    analogWrite (ENB, vel); //Velocidad motor B
    }

  • Avatar for Ivan Uriarte
    • Ivan Uriarte

    hola Diego, si pitan los motores es porque están intentando moverse pero les falta potencia. Cóomo estás alimentando el circuito?

  • Avatar for Ivan Uriarte
    • Diego Rodriguez

    Hola Ivan, tengo un problema, he conectado todo perfectamente y el codigo tambien esta hecho bien (con arduinoBlocks) y cuando tiene que funcionar, hace un pitido.
    Muchas Gracias

  • Avatar for Ivan Uriarte
    • Ivan Uriarte

    Seguramente se te ha olvidado definir la función Atras(). Descárgate el programa completo desde el enlace al final de la página para asegurarte de que esté bien. Un saludo.

  • Avatar for Ivan Uriarte
    • Juan pa

    HOLA..!
    buen trabajo amigo, tengo un problema con el código «Atras();» me dice que no fue declarado,
    me podrías dar orientación .

  • Avatar for Ivan Uriarte
    • Albert

    Perdon, me referia al L293D

  • Avatar for Ivan Uriarte
    • Ivan Uriarte

    Sin ver el error es muy difícil saber. Cópianoslo a ver si podemos ayudarte. Un saludo.

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login