Buenas tardes,
Realizo un programa para que un robot no choque contra la pared. Es decir detecta con el sensor HC-SR04 que utilizo como medidor de distancias, si la distancia es menor de 20 cm, que se pare, de marcha atrás, gire y continúe recto.
Bien el programa si lo cargo directamente funciona bien. Sin embargo si conecto un módulo bluetooth al robot y cargo un programa con "IF" en el cual le indico que si le envío por ejemplo el nº "5" me ejecute el programa de antes, el robot siempre me continúa recto.
¿Existe algún conflicto con el módulo bluettoh y el sensor HR-SR04? ¿Por qué creeis que no ejecuta bien el programa si la secuencia es la misma?
Muchas gracias
Los pines del bluetooth están conectados a un nano arduino a su entrada RX y tX. El programa se me carga bien y ya se que lo debo desconectar para subirlo.
A continuación os pongo la programación, con el ejemplo 1, que me funciona bien, y que no está iniciado a través del bluetooth y el ejemplo 2, que es el que no me funciona bien si lo inicio a través de un terminal con conexión a bluetooth
Ejemplo 1. Funciona correctamente. Solo ejecutar el evitar chocarse:
#include <Servo.h>
char valor;
Servo myservo_izq; // crea el objeto servo del lado izq del robot
Servo myservo_der; // crea el objeto servo del lado derecho del robot
int vel_iz = 0; // velocidad del servo izquierda
int vel_der = 0;// velocidad del servo derecha
const int Trigger = 13; //Pin digital 13 para el Trigger del sensor HC-SR04, (los ojos)
const int Echo = 7; //Pin digital 7 para el Echo del sensor HC-SR04, (los ojos)
void setup(){
myservo_izq.attach(9); // vincula el servo al pin digital 9
myservo_der.attach(5); // vincula el servo al pin digital 5
myservo_izq.write(90); // inicio los dos servos a velocidad 0
myservo_der.write(90); // inicio los dos servos a velocidad 0
pinMode(Trigger, OUTPUT); //pin como salida sensor HC-SR04, (los ojos)
pinMode(Echo, INPUT); //pin como entrada sensor HC-SR04, (los ojos)
digitalWrite(Trigger, LOW);//Inicializamos el pin con 0
}
void loop() {
long t; //tiempo que demora en llegar el eco
long d; //distancia en centimetros
digitalWrite(Trigger, HIGH);
delay(0.01); //Enviamos un pulso
digitalWrite(Trigger, LOW);
t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso, lee el tiempo del Eco
d = t/59; //escalamos el tiempo a una distancia en cm
if (d <= 20){ // si la distancia es menor de 20cm, paramos motores 200 milisg
vel_iz= 90;
vel_der=90;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
delay (200);
// vamos hacia atrás 300 milisg
vel_iz= 0;
vel_der=180;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
delay (200);
vel_iz= 180; // giramos a la izquierda durante 600 milisegundos
vel_der=90;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
delay (600);
}
else{ // Si no hay obstáculos se desplaza al frente
vel_iz= 180;
vel_der=0;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
}
}
Ejemplo 2. Con la conexión a bluetooth, que me permita mover el robot en diferentes direcciones. (Esto funciona bien) y luego si pulso el número "5" que inicie el programa de no chocar. Y esto aunque es igual a lo anterior no funciona.
#include <Servo.h>
char valor;
Servo myservo_izq; // crea el objeto servo del lado izq del robot
Servo myservo_der; // crea el objeto servo del lado derecho del robot
int vel_iz = 0; // velocidad del servo izquierda
int vel_der = 0;// velocidad del servo derecha
int Trigger = 13; //Pin digital 13 para el Trigger del sensor HC-SR04, (los ojos)
int Echo = 7; //Pin digital 7 para el Echo del sensor HC-SR04, (los ojos)
int t; //tiempo que demora en llegar el eco
int d; //distancia en centimetros
void setup(){
Serial.begin(9600);
myservo_izq.attach(9); // vincula el servo al pin digital 9
myservo_der.attach(5); // vincula el servo al pin digital 5
myservo_izq.write(90); // inicio los dos servos a velocidad 0
myservo_der.write(90); // inicio los dos servos a velocidad 0
pinMode(Trigger, OUTPUT); //pin como salida sensor HC-SR04, (los ojos)
pinMode(Echo, INPUT); //pin como entrada sensor HC-SR04, (los ojos)
digitalWrite(Trigger, LOW);//Inicializamos el pin con 0
}
void loop(){
valor=Serial.read();
if (valor=='F'){ // Boton hacia adelante
myservo_izq.write(180);
myservo_der.write(0);
}
if (valor=='L'){ // Girar HACIA LA IZQ
vel_iz= 90;
vel_der=0;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
}
if (valor=='S'){ // PARAR
vel_iz= 90;
vel_der=90;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
}
if (valor=='R'){ // VA A LA DERECHA
vel_iz= 180;
vel_der=90;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
}
if (valor=='B'){ // ATRAS
vel_iz= 0;
vel_der=180;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
}
if (valor=='5'){ // Programar la rutina de no chocar, utilizando el sensor ojos
digitalWrite(Trigger, HIGH);
delay(0.01); //Enviamos un pulso de 10us
digitalWrite(Trigger, LOW);
t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso, lee el tiempo del Eco
d = t/59; //escalamos el tiempo a una distancia en cm
if (d==0) d=50;
if (d <= 20){
vel_iz= 90;
vel_der=90;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
delay (200);
// vamos hacia atrás 300 milisg
vel_iz= 0;
vel_der=180;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
delay (200);
vel_iz= 180; // giramos a la izquierda durante 600 milisegundos
vel_der=90;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
delay (600);
}
else{ // Si no hay obstáculos se desplaza al frente
vel_iz= 180;
vel_der=0;
myservo_izq.write(vel_iz);
myservo_der.write(vel_der);
}
}
}