Feliz Navidad a todos.
Tengo un carro controlado vía BT mediante APP en el smartphone. Avanza, retrocede, gira, enciende y apaga luces, bocina, circulina de policía y u diodo láser. Además tiene instalado un sensor de obstáculos para que en modo automático el carro ande dando vueltas sin controlarlo.
El siguiente código hace que me funcione todo bien:
#include <SoftwareSerial.h> // TX RX software library for bluetooth
#include <Servo.h> // servo library
SoftwareSerial bluetooth(0, 1); //Instancia la conexion al bluetooth - PIN 0 a TX y PIN 1 a RX
int BUZZER = 12;
int LED = 13;
int CIRCULINA = 6;
int LASER = 5;
//Variables para el sensor ultrasonico
int trigPin = 11;
int echoPin = 8;
int maxDist = 20;
int minDist = 1;
float distancia;
//Entrada de los motores
int motor1A = 14; // INPUT 1
int motor1B = 15; // INPUT 2
int motor2A = 17; // INPUT 3
int motor2B = 16; // INPUT 4
// Dato recibido atraves de la aplicacion movil
char data = 'S';
void setup()
{
pinMode(echoPin, INPUT); // echo como entrada
pinMode(trigPin, OUTPUT); // trigger como salida
pinMode(LED, OUTPUT); // LED como salida
pinMode (CIRCULINA, OUTPUT);
pinMode (LASER, OUTPUT);
//Definimos las salidas del arduino
pinMode(motor1A , OUTPUT);
pinMode(motor1B , OUTPUT);
pinMode(motor2A , OUTPUT);
pinMode(motor2B , OUTPUT);
pinMode(BUZZER , OUTPUT);
Serial.begin(9600); //Inicia la comunicación en el monitor serial a 9600 Baudios
bluetooth.begin(9600); // inicialmente la comunicacion serial a 9600 Baudios (velocidad de convencional)
Serial.println("Módulo conectado");
}
void loop()
{
//Esperamos hasta que haya un Stream de datos
if(bluetooth.available() > 0){
data = bluetooth.read();
Serial.println(data);
}
switch (data) {
case 'F':
avanzar(); // Forward | AVANZAR
break;
case 'B':
retroceder(); // Backward | RETROCEDER
break;
case 'L':
izquierda(); //Left | IZQUIERDA
break;
case 'R':
derecha(); //Right | DERECHA
break;
case 'S':
detener(); //Stop | DETENER
break;
case 'A':
automatico(); // Modo automatico depende del sensor ultrasonico
break;
case 'M':
bocina1(); // Toca bocina
break;
case 'N':
bocina0(); // Apaga bocina
break;
case 'U':
luces1(); // Enciende luces
break;
case 'X':
luces0(); // Apaga luces
break;
case 'P':
laser1(); // Enciende laser
break;
case 'Q':
laser0(); // Apaga laser
break;
case 'J':
circulina1(); // Enciende circulina
break;
case 'K':
circulina0(); // Apaga circulina
break;
}
delay(20);
}
void avanzar(){
// Forward | AVANZAR
digitalWrite(motor1A, HIGH);
digitalWrite(motor1B, LOW);
digitalWrite(motor2A, HIGH);
digitalWrite(motor2B, LOW);
}
void retroceder(){
// Backward | RETROCEDER
digitalWrite(motor1A, LOW);
digitalWrite(motor1B, HIGH);
digitalWrite(motor2A, LOW);
digitalWrite(motor2B, HIGH);
}
void derecha(){
//Right | DERECHA
digitalWrite(motor1A, HIGH);
digitalWrite(motor1B, LOW);
digitalWrite(motor2A, LOW);
digitalWrite(motor2B, LOW);
}
void izquierda(){
//Left | IZQUIERDA
digitalWrite(motor1A, LOW);
digitalWrite(motor1B, LOW);
digitalWrite(motor2A, HIGH);
digitalWrite(motor2B, LOW);
}
void detener(){
//Stop | DETENER
digitalWrite(motor1A, LOW);
digitalWrite(motor1B, LOW);
digitalWrite(motor2A, LOW);
digitalWrite(motor2B, LOW);
}
void bocina1(){
// Toca bocina
digitalWrite(BUZZER, HIGH);
}
void bocina0(){
// Apaga bocina
digitalWrite(BUZZER, LOW);
}
void luces1(){
// Enciende luces
digitalWrite(LED, HIGH);
}
void luces0(){
// Apaga luces
digitalWrite(LED, LOW);
}
void laser1(){
// Enciende laser
digitalWrite(LASER, HIGH);
}
void laser0(){
// Apaga laser
digitalWrite(LASER, LOW);
}
void circulina1(){
// Enciende circulina
digitalWrite(CIRCULINA, HIGH);
}
void circulina0(){
// Apaga circulina
digitalWrite(CIRCULINA, LOW);
}
void automatico(){
distancia = calcularDistanciaCm(); // Calculamos la distancia de la pulso
Serial.println(distancia);
if (distancia <= maxDist && distancia >= minDist){ // si la distancia es menor de 20cm
//digitalWrite(LED,HIGH); // Enciende LED
detener(); //DETENEMOS LOS MOTORES 200 ms
delay (200);
retroceder(); // RETROCEDE DURANTE 1000 ms
delay(1000);
izquierda(); // Girar durante 600 milisegundos
delay(600);
digitalWrite(LED,LOW);
}
else{
avanzar(); //SI NO EXISTE OBSTACULO CONTINUA AVANZANDO
}
}
float calcularDistanciaCm() {
float duracion, distancia; // Variable para calcular el tiempo y distancia
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracion = pulseIn(echoPin, HIGH);
distancia = (duracion * 0.0343) / 2;
delay(10);
return distancia;
}