En esta semana hemos recibido el driver de motores L298P para arduino, por lo que nos hemos puesto manos a la obra con la programación.
Ya hemos conseguido controlar con móvil por medio de bluetooth uno de los dos motores que ésta shield nos permite colocar, pero conseguir controlar el segundo motor no va a suponer un gran desafío teniendo ya la base del programa.
El programa que vamos a dejar a continuación nos permite controlar (por ahora) un solo motor, que corresponde al canal A del controlador de motores. Mediante el móvil y una conexión bluetooth, podremos controlar el motor para que gire en una dirección o en otra, además de tener 5 velocidades diferentes.
En la pantalla del móvil podremos visualizar el estado del motor (Velocidad y dirección de giro).
CÓDIGO
#include<SoftwareSerial.h> //Crea una comunicación por medio de software
int Tx = 2;
int Rx = 4;
int referencia = 0;
int contadorVelocidad;
int contador = 0;
int velocidadA = 3;
int velocidadB = 11;
int direccionA = 12;
int direccionB = 13;
int frenaA = 9;
int frenaB = 8;
char valueBT;
char valueSerial;
char adelante = 118; //Carácter v
char atras = 97; //Carácter a
char dcha = 100; //Carácter d
char izda = 105; //Carácter i
char para = 112; //Carácter p
char mas = 109; //Carácter m
char menos = 110; //Carácter n
SoftwareSerial BT1 (Rx, Tx); //Establece el nombre y los pines Rx (4) y Tx (2) para la comunicación por software.
void setup(){
Serial.begin(9600); //Inicia la comunicación por el monitor serial
BT1.begin(9600); //Inicia la comunicación por software
//Setup Canal A
pinMode(velocidadA, OUTPUT);
pinMode(direccionA, OUTPUT);
pinMode(frenaA, OUTPUT);
//Setup Canal B
pinMode(velocidadB, OUTPUT);
pinMode(direccionB, OUTPUT);
pinMode(frenaB, OUTPUT);
}
void loop(){
again:
valueBT = BT1.read(); //Almacena los datos leídos por el bluetooth en la variable valueBT
valueSerial = Serial.read(); //Almacena los datos leídos por el monitor serial en la variable valueSerial
if (valueBT – adelante == referencia){ //Si el valor leído por bluetooth menos el carácter asignado a adelante (v) sea igual a referencia (0)…
while(digitalRead(9) == HIGH){ //Si el freno del canal A está activado…
digitalWrite(frenaA, LOW); //descativa el freno.
}
digitalWrite(direccionA, HIGH); //El motor del canal A gira.
analogWrite(velocidadA, contadorVelocidad); //Ajusta la velocidad del motor del canal A.
Serial.println(«Avanza.»);
BT1.println(«Avanza.»);
}
if (valueBT – atras == referencia){ //Si el valor leído por bluetooth menos el carácter asignado a atras (a) sea igual a referencia (0)…
while(digitalRead(9) == HIGH){ //Cuando el freno del canal A esté activado…
digitalWrite(frenaA, LOW); //…descativa el freno.
}
digitalWrite(direccionA, LOW); //Invierte el giro del motor del canal A.
analogWrite(velocidadA, contadorVelocidad); //Ajusta la velocidad del motor del canal A.
Serial.println(«Marcha atras.»);
BT1.println(«Marcha atras.»);
}
if (valueBT – dcha == referencia){ //Si el valor leído por bluetooth menos el carácter asignado a dcha (d) sea igual a referencia (0)…
Serial.println(«Gira a la derecha.»);
BT1.println(«Gira a la derecha.»);
}
if (valueBT – izda == referencia){ //Si el valor leído por bluetooth menos el carácter asignado a izda (i) sea igual a referencia (0)…
Serial.println(«Gira a la izquierda.»);
BT1.println(«Gira a la izquierda.»);
}
if (valueBT – para == referencia){ //Si el valor leído por bluetooth menos el carácter asignado a para (p) sea igual a referencia (0)…
digitalWrite(frenaA, HIGH); //Activa el freno del canal A.
Serial.println(«Frena.\n»);
BT1.println(«Frena.\n»);
}
if (valueBT – mas == referencia){ //Si el valor leído por bluetooth menos el carácter asignado a mas (m) sea igual a referencia (0)…
contadorVelocidad = contadorVelocidad + 50; //…la variable contadorVelocidad aumenta en 50.
contador = contador + 1; //…la variable contador aumenta en 1.
if (contador != 6){ //Si la variable contador no es igual a 6…
Serial.println(«La velocidad ha sido aumentada en 50 puntos»);
Serial.print(contador);
Serial.print(«/5\n»);
BT1.println(«La velocidad ha sido aumentada en 50 puntos»);
BT1.print(contador);
BT1.print(«/5\n»);
}
while (contador == 6){ //Cuando la variable contador sea igual a 6…
contador = contador – 1; //…reduce en 1 contador.
Serial.println(«No se puede aumentar mas la velocidad.»);
Serial.print(contador);
Serial.print(«/5\n»);
BT1.println(«No se puede aumentar mas la velocidad.»);
BT1.print(contador);
BT1.print(«/5\n»);
}
while (contadorVelocidad == 300){ //Cuando contadorVelocidad sea igual a 300…
contadorVelocidad = contadorVelocidad – 50; //…reduce contador en 50.
}
Serial.println(contadorVelocidad);
}
if (valueBT – menos == referencia){ //Si el valor leído por bluetooth menos el carácter asignado a menos (n) sea igual a referencia (0)…
contadorVelocidad = contadorVelocidad – 50; //…la variable contadorVelocidad se reduce en 50.
contador = contador – 1; //…la variable contador se reduce en 1.
if (contador != -1){ //Si la variable contador no es igual a -1…
Serial.println(«La velocidad ha sido reducida en 50 puntos.»);
Serial.print(contador);
Serial.print(«/5\n»);
BT1.println(«La velocidad ha sido reducida en 50 puntos.»);
BT1.print(contador);
BT1.print(«/5\n»);
}
while (contador == -1){ //Cuando la variable contador sea igual a -1…
contador = contador + 1; //…aumenta en 1 contador.
Serial.println(«No se puede reducir mas la velocidad.»);
Serial.print(contador);
Serial.print(«/5\n»);
BT1.println(«No se puede reducir mas la velocidad.»);
BT1.print(contador);
BT1.print(«/5\n»);
}
while (contadorVelocidad == -50){ //Cuando la variable contadorVelocidad sea igual a -50…
contadorVelocidad = contadorVelocidad + 50; //…aumenta contador en 50.
}
Serial.println(contadorVelocidad);
}
while (((valueBT) == adelante || atras || dcha || izda) && ((valueSerial) != adelante || atras || dcha || izda)){ //Cuando los datos leídos por el bluetooh no sean igual que los datos
//leídos por el monitor serial…
goto again; //Vuelve a again.
}
}