• 953779710
  • Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

IES JUAN LÓPEZ MORILLAS

Programación Coche 2WD

Programación Coche 2WD


Vamos a desarrollar en este artículo el programa que va a hacer posible que el coche que hemos ido montando en artículos anteriores se mueva adelante, atrás y a izquierda y derecha.

Comenzaremos realizando un programa que maneje el coche a través del monitor serie que nos proporciona Arduino. Para ello comenzaremos por declarar las variables que definen los pines donde irá conectado el módulo L298N que hemos utilizado para controlar los motores y una variable para controlar la velocidad de los motores:

// Motor A
int ENA=6; //pin control velocidad motor
int IN1=13; //pin control motor
int IN2=12; //pin control motor

// Motor B
int ENB=5; //pin control velocidad motor
int IN3=11; //pin control motor
int IN4=10; //pin control motor

int vel=125; //variable velocidad motor

En el bloque setup definiremos todos los pines como de salida e iniciamos la conexión del puerto serie de nuestro Arduino:

void setup() {
Serial.begin(9600); //iniciamos conexión puerto serie
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);

}

En el bloque loop leemos los datos que entran a través del monitor serie de Arduino:

void loop() {
//comprobamos que el puerto serie está conectado
if(Serial.available())
//leemos los datos recibido por el puerto serie
switch(Serial.read()){

Entonces iniciamos un recorrido por diferentes casos que son válidos:

  • Si enviamos el carácter (forward) se ejecutará la función Adelante()
  • Si enviamos el carácter (bacward) se ejecutará la función Atrás()
  • Si enviamos el carácter (right) se ejecutará la función Derecha()
  • Si enviamos el carácter (left) se ejecutará la función Izquierda()
  • Si enviamos el carácter (stop) se ejecutará la función Parar()
case 'F':
Adelante(); //ejecuta función Adelante
break;
case 'B':
Atras(); //ejecuta función Atras
break;
case 'R':
Derecha(); //ejecuta función Derecha
break;
case 'L':
Izquierda(); //ejecuta función Izquierda
break;
case 'S':
Parar(); //ejecuta función Parar
break;
}

Para que el coche se mueva hacia adelante haremos que ambos motores giren en la misma dirección hacia adelante:

void Adelante(){
// Mueve el motor A adelante
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,vel);
//Mueve el motor B adelante
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,vel);
}

Para que el coche se mueva hacia atrás haremos que ambos motores giren en dirección contraria a la anterior:

void Atras(){
// Mueve el motor A en dirección contraria a la anterior
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Mueve el motor B en dirección contraria a la anterior
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

Para hacer que el coche gire hacia la derecha haremos que el motor izquierdo gire hacia adelante y el derecho hacia atrás:

void Derecha(){
// Mueve el motor A adelante
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,vel);
//Mueve el motor B atrás
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

Para hacerlo girar hacia la izquierda tendremos que hacer girar el motor izquierdo hacia atrás y el derecho hacia adelante:

void Izquierda(){
// Mueve el motor A atrás
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Mueve el motor B adelante
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,vel);
}

Es intuitivo pensar que para parar el coche debemos detener ambos motores:

void Parar(){
// Detiene el motor A
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Detiene el motor B
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

A continuación el código completo del sketch:

/*
* Control de coche 2WD
* a través del monitor serie
* de Arduino
*
* Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
* Mayo 2019
*/
// Motor A
int ENA=6; //pin control velocidad motor
int IN1=13; //pin control motor
int IN2=12; //pin control motor

// Motor B
int ENB=5; //pin control velocidad motor
int IN3=11; //pin control motor
int IN4=10; //pin control motor

int vel=125; //variable velocidad motor

void setup() {
Serial.begin(9600); //iniciamos conexión puerto serie
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);

}

void loop() {
//comprobamos que el puerto serie está conectado
if(Serial.available())
//leemos los datos recibido por el puerto serie
switch(Serial.read()){
case 'F':
Adelante(); //ejecuta función Adelante
break;
case 'B':
Atras(); //ejecuta función Atras
break;
case 'R':
Derecha(); //ejecuta función Derecha
break;
case 'L':
Izquierda(); //ejecuta función Izquierda
break;
case 'S':
Parar(); //ejecuta función Parar
break;
}

}

void Adelante(){
// Mueve el motor A adelante
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,vel);
//Mueve el motor B adelante
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,vel);
}

void Atras(){
// Mueve el motor A en dirección contraria a la anterior
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Mueve el motor B en dirección contraria a la anterior
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

void Derecha(){
// Mueve el motor A adelante
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,vel);
//Mueve el motor B atrás
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

void Izquierda(){
// Mueve el motor A atrás
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Mueve el motor B adelante
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,vel);
}

void Parar(){
// Detiene el motor A
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Detiene el motor B
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

Cargamos el sketch en nuestro Arduino, abrimos el monitor serie y comprobamos que todo funciona según lo previsto.

Si todo va bien podemos proceder ahora a realizar las modificaciones necesarias en el sketch para poder controlar el coche desde nuestro dispositivo móvil a través del módulo HC-06 que hemos instalado. Estas modificaciones son sencillas. En primer lugar hay que incluir la librería SerialSoftware que recordamos nos permitía crear un nuevo puerto serie y dejar libres Rx Tx en nuestra placa Arduino y definimos nuestro nuevo puerto serie conectado a los pines digitales 2 y 3 de nuestro Arduino.

#include <SoftwareSerial.h>
//Creamos un puerto serie nuevo con nuestro Bluetooth
//conectado a los pines digitales 2 y 3
SoftwareSerial BT(2,3); //Rx, Tx

El resto del programa es igual al que utilizamos con monitor serie. Basta con sustituir las referencias al puerto serie de Arduino por el nuevo puerto que hemos creado, al que hemos llamado BT. A continuación el código completo:

/*
* Coche 2WD controlado por Bluetooth
* Control dos motores desde Bluetooth
* utilizando un puente L298N
*
* Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
* Mayo 2019
*/

//Creamos un puerto serie nuevo para no
//utilizar Rx y Tx de Arduino

//Incluimos la librería SoftwareSerial

#include <SoftwareSerial.h>
//Creamos un puerto serie nuevo con nuestro Bluetooth
//conectado a los pines digitales 2 y 3
SoftwareSerial BT(2,3); //Rx, Tx

// Motor A
int ENA=6; //pin control velocidad motor
int IN1=13; //pin control motor
int IN2=12; //pin control motor
// Motor B
int ENB=5; //pin control velocidad motor
int IN3=11; //pin control motor
int IN4=10; //pin control motor

int vel=125; //variable velocidad motores

void setup() {
BT.begin(9600); //Definimos velocidad transmisión
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);

}

void loop() {
//Comprueba si el BT está disponible
if(BT.available())
//Lee los datos recibidos de BT
switch(BT.read()){
case 'F':
Adelante(); //Ejecuta la función Adelante
break;
case 'B':
Atras(); //Ejecuta la función Atras
break;
case 'R':
Derecha(); //Ejectura la función Derecha
break;
case 'L':
Izquierda(); //Ejecuta la función Izquierda
break;
case 'S':
Parar(); //Ejecuta la función Parar
break;
}

}

void Adelante(){
//Mueve los dos motores en el mismo sentido
// Direccion Motor A
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,vel);
//Direccion Motor B
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,vel);
}

void Atras(){
//Mueve los dos motores en el mismo sentido
//Contrario al de la función Adelante
// Direccion Motor A
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Direccion Motor B
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

void Derecha(){
//Mueve el motor A adelante y el B atrás
// Direccion Motor A
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,vel);
//Direccion Motor B
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

void Izquierda(){
//Mueve el motor A atrás y el B adelante
// Direccion Motor A
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Direccion Motor B
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,vel);
}

void Parar(){
//Detiene los dos motores
// Direccion Motor A
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
analogWrite(ENA,vel);
//Direccion Motor B
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
analogWrite(ENB,vel);
}

Para poder manejar ahora el coche deberemos instalar en nuestro dispositivo móvil una aplicación que envíe los datos correspondientes a través de Bluetooth a nuestro coche y realice la acción asociada al dato recibido. En la Google Play Store podemos encontrar alguna aplicación que nos permite controlar nuestro coche. Hay quien ha realizado el trabajo por nosotros y ha diseñado una muy completa aplicación llamada Arduino Bluetooth RC Car y que puede verse en el siguiente enlace

Cuando iniciamos la aplicación nos encontramos con la siguiente pantalla:

Pulsamos el botón que tiene apariencia de engranaje en la barra superior:

Pulsamos en la opción conectar coche:

Seleccionamos en la lista que aparece nuestro módulo HC-06:

.

Si aún no lo habíamos emparejado nos pedirá la contraseña, que si no la hemos cambiado anteriormente es 1234.

Aparecerá el círculo superior izquierdo en color verde y el led de nuestro módulo HC-06 dejará de parpadear.

Ya podemos utilizar nuestro coche pulsando en las flechas de dirección de los cuadros laterales.

La aplicación ofrece muchas más funciones en su configuración pero que no son objeto de este artículo.

En cualquier caso nosotros vamos a diseñar una aplicación mucho más sencilla utilizando el servicio de Google llamado APP Inventor que nos permite de forma sencilla diseñar aplicaciones para el sistema Android. Podemos ver el desarrollo del diseño de esta aplicación en el siguiente enlace.

 


Localización

Visitas

0917845
Hoy: 9
Ayer: 30
Esta semana: 162
Última semana: 255
Este mes: 1.180
Último mes: 1.028