He creado un programa para manejar un pequeño coche. El coche se controla con android y funciona con flechas . Flecha para adelante y el coche se mueve hacia adelante , etc... el problema es que el ultimo boton es el que pasa a hacer del coche un coche autonomo. Pero cuando le apreto el coche se vuelve autonomo y funciona bien , pero hace caso omiso de otras ordenes que le pueda dar. Vamos que se queda atascado como si no recibiera ninguna orden mas .
Now in English ...
I have created a program to run a small car ... I am controlling the car with android , so if i press the ahead arrow the car moves ahead and if I press the left button does perfectly to the left ... the case is that the last button is the one to tell the car to avoid obstacles and the problem is that gets stuck on that function . Not being able to recover the control of the car . It doesnt the matter what I do,nor the button I press it will continously avoiding obstacles . I have been two days on it ... and my brain is melting ...please help. Here comes the code .
#include <NewPing.h> //Levantamos las librerias
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
NewPing sonar(14, 14, 500); // NewPing setup of pins and maximum distance.montamos los sensores en los puertos e inicializamos las instancias
NewPing sonar2(16,16, 500); // NewPing setup of pins and maximum distance.
NewPing sonar3(18, 18, 500); // NewPing setup of pins and maximum distance.
int mediana1; //Declaramos las variables que nos daran las distancias medias .
int mediana2;
int mediana3;
int mediana1a;
int mediana2a;
int mediana3a;
int e1 = 5; //Declaramos las variables y asignamos los puertos para los motores..
int m1 = 4;
int m1b =12;
int e2 = 6;
int m2 = 7;
int m2b = 8;
//int 230 = 230;
//comenzamos creado las funciones que van a mover el robot .
void adelante(){
digitalWrite(m1,LOW);
digitalWrite(m1b,HIGH);
digitalWrite(m2,HIGH);
digitalWrite(m2b,LOW);
analogWrite(e1, 250);
analogWrite(e2, 250);
}
void atras(){
digitalWrite(m1,HIGH);
digitalWrite(m1b,LOW);
digitalWrite(m2,LOW);
digitalWrite(m2b,HIGH);
analogWrite(e1, 250);
analogWrite(e2, 250);
}
void quieto(){
digitalWrite(m1,LOW);
digitalWrite(m1b,HIGH);
digitalWrite(m2,HIGH);
digitalWrite(m2b,LOW);
analogWrite(e1, 0);
analogWrite(e2, 0);
}
void giroder(){
digitalWrite(m1,HIGH);
digitalWrite(m1b,LOW);
digitalWrite(m2,HIGH);
digitalWrite(m2b,LOW);
analogWrite(e1, 250);
analogWrite(e2, 250);
}
void giroizq(){
digitalWrite(m1,LOW);
digitalWrite(m1b,HIGH);
digitalWrite(m2,LOW);
digitalWrite(m2b,HIGH);
analogWrite(e1, 250);
analogWrite(e2, 250);
}
void goderecha(){
digitalWrite(m1,LOW);
digitalWrite(m1b,HIGH);
digitalWrite(m2,HIGH);
digitalWrite(m2b,LOW);
analogWrite(e1, 200);
analogWrite(e2, 250);
}
void goizquierda(){
digitalWrite(m1,LOW);
digitalWrite(m1b,HIGH);
digitalWrite(m2,HIGH);
digitalWrite(m2b,LOW);
analogWrite(e1, 250);
analogWrite(e2, 200);
}
void atrasder(){
digitalWrite(m1,HIGH);
digitalWrite(m1b,LOW);
digitalWrite(m2,LOW);
digitalWrite(m2b,HIGH);
analogWrite(e1, 200);
analogWrite(e2, 250);
}
void atrasizq(){
digitalWrite(m1,HIGH);
digitalWrite(m1b,LOW);
digitalWrite(m2,LOW);
digitalWrite(m2b,HIGH);
analogWrite(e1, 250);
analogWrite(e2, 200);
}
// comenzamos a crear ls funciones que van a darle logica a los movimientos y actuaciones del robot.La funcion se llama EVITADOR y evita colisiones con los obstaculos
void evitador(){
// delay(50); //
Serial.print("Ping.:..... ");
// Serial.print(sonar.ping_median(5));
int mediana1 = sonar.ping_median(5);
Serial.print(sonar.convert_cm(mediana1)); // lo primero es comenzar haciendo distancias y creando medias para informar a la parte logica del Sketch.
int mediana1a = sonar.convert_cm(mediana1);
Serial.print("...Ping 2:...... ");
if (mediana1a <= 20){
giroder();
Serial.print("TIRAMOS PA DCHA");
delay(1000);
}
int mediana2 = sonar2.ping_median(5);
Serial.print(sonar2.convert_cm(mediana2)); // Dependiendo del Sensor , llevaremos al robot a decidir si va recto , derecha o izquierda.
int mediana2a = sonar2.convert_cm(mediana2);
Serial.print("...Ping 3:...... ");
if (mediana2a >= 20){
adelante();
Serial.print("TIRAMOS PA ALANTE");
}
else if (mediana2a <= 20){
quieto();
delay(1500);
atras();
delay(3000);
giroder();
delay(3000);
// evitador();
//izquierda();
//delay(2000);
Serial.print(" COMPARAMOS Y EVITAMOS OBSTACULO ¡¡¡¡¡");
}
int mediana3 = sonar3.ping_median(5);
Serial.print(sonar3.convert_cm(mediana3)); // Send ping, get distance in cm and print result (0 = outside set distance range)
int mediana3a = sonar3.convert_cm(mediana3);
Serial.println(".......cm");
if (mediana1a>=mediana3a){
goderecha();
Serial.print("TIRAMOS PA DCHA");
// delay(1000);
}
if (mediana3a <= 20){
giroizq();
Serial.print("TIRAMOS PA IZDA 1");
// delay(1000);
}
if (mediana1a<=mediana3a){
goizquierda();}
//
Serial.print("TIRAMOS PA IZDA 3");
//delay(1000);
}
void setup() {
// put your setup code here, to run once:
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
pinMode(m1b, OUTPUT);
pinMode(m2b, OUTPUT);
Serial.begin(9600);
Serial.flush();
}
void loop() {
Serial.flush();
char estado = ' '; //lee serial
// esperar a que los datos entren
if (Serial.available() < 1) return; // si no hay datos en el serial retornar al Loop().
if(Serial.available()>0){ // lee el bluetooth y almacena en estado
char estado = Serial.read();
if(estado=='a'){
// Boton desplazar al Frente
adelante();
}
if(estado=='b'){
goderecha();
}
if(estado=='h'){
giroder();
}
if(estado=='g'){
giroizq();
}
if(estado=='c'){
goizquierda();
}
if(estado=='d'){
atras();
}
if(estado=='i'){
atrasder();
}
if(estado=='j'){
atrasizq();
}
if(estado=='e'){
quieto();
}
if(estado=='n'){ // evita obstaculos
evitador();
while (estado=='n'){
evitador();
}
}
}}