Hola.
Quiero que al iniciar mi robot minisumo, realice un movimiento de busqueda SOLO al inicio (que lo repita hasta detectar algo con los dos sensores de distancia, o un maximo de 5 veces). Luego de que esto suceda, ya no me interesa que se repita, no quiero que eso suceda, por eso lo estoy escribiendo en el void setup().
El problema es que se me queda encerrado (se atasca) en ese "for" y no sale de ahi, me lo repite infinitamente, sean true o false las condiciones especificadas para el mismo.
Tambien quiero usar la función millis() y se me está complicando, no lo entiendo del todo bien aun. Creo incluso que este podria ser el problema o un problema aparte. La duda respecto a esto: debo declarar los tiempos de cada accion al inicio de la programacion y despues insertarlos en las funciones mediante if?
Perdón si pregunto alguna cosa sin sentido, o si estoy cometiendo un error muy zonzo, no soy ningun experto conocedor de esto. Estoy usando un arduino UNO, dos sensores hcsr04 para distancia, dos tcrt500 para el suelo, y un puente H l298n. Saludos
int IN1 = 4;
int IN2 = 5;
int ENA = 11;
int IN3 = 6;
int IN4 = 7;
int ENB = 10;
// Sensores Linea
int sensor_linea_izq = A5;
int linea_izq = 0;
int sensor_linea_der = A4;
int linea_der = 0;
// Sensores Distanciia
int tri_der = 13;
int echo_der = 12;
int tri_izq = 9;
int echo_izq = 8;
float tiempo_de_espera_izq,distancia_izq;
float tiempo_de_espera_der,distancia_der;
byte x;
void setup(){
Serial.begin(9600);
Serial.println("iniciando lectura sensor");
pinMode(13, OUTPUT); // PIN 13 TRIGGER derecho
pinMode(12, INPUT); // PIN 12 ECHO derecho
pinMode(9, OUTPUT); // PIN 9 TRIGGER izquierdo
pinMode(8, INPUT); // PIN 8 ECHO izquierdo
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(A5, INPUT);
pinMode(A4, INPUT);
delay(5000);
sensores();
for(x=0;x=5||((linea_izq>700)&&(linea_der>700)&&(distancia_der>20)&&(distancia_izq>20));x=x+1){
derecha_f();
Serial.println("derecha inicial");
delay(3000);
izquierda_f();
Serial.println("izquierda inicial");
delay(3000);
}
}
void loop(){
sensores();
// ACCIONES
if((linea_izq>700)&&(linea_der>700)&&(distancia_izq<=10)&&(distancia_der<=10)){ // si ambos detectan suelo negro y objeto
adelante_f(); // adelante fuerte
Serial.println("avanza");
}
if((linea_izq>700)&&(linea_der>700)&&(distancia_izq>10)&&(distancia_der>10)){ // si detectan suelo negro y ningun objeto
izquierda_f(); // izquierda despacio
Serial.println("busca");
}
if((linea_izq>700)&&(linea_der>700)&&(distancia_izq<=10)&&(distancia_der>10)){ // si detectan suelo negro y objeto a la izquierda
izquierda_f(); // izquierda fuerte
Serial.println("izquierda fuerte");
}
if((linea_izq>700)&&(linea_der>700)&&(distancia_izq>10)&&(distancia_der<=10)){ // si detectan suelo negro y objeto a la derecha
derecha_f(); // derecha fuerte
Serial.println("derecha fuerte");
}
if((linea_izq<=700)||(linea_der<=700)){ // si cualquiera detecta linea blanca
reversa_f(); // atras fuerte
Serial.println("retrocede");
delay(700); // confugurarlo bien
}
}
// VOID SENSORES
void sensores(){
linea_izq = analogRead(A5); // SENSORES LINEA
linea_der = analogRead(A4);
digitalWrite (13, 0); // SENSORES DISTANCIA
delayMicroseconds(2);
digitalWrite (13, 1);
delayMicroseconds (10);
digitalWrite (13, 0);
tiempo_de_espera_der = pulseIn (12, 1); // pulseIn recibe la señal emitida por trigger
distancia_der = (tiempo_de_espera_der/2)/29.15; // calcula la distancia
digitalWrite (9, 0);
delayMicroseconds(2);
digitalWrite (9, 1);
delayMicroseconds (10);
digitalWrite (9, 0);
tiempo_de_espera_izq = pulseIn (8, 1);
distancia_izq = (tiempo_de_espera_izq/2)/29.15;
}
// VOID MOTORES
void adelante_f(){ // avanza hacia adelante fuerte
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
}
void adelante_d(){ // avanza hacia adelante despacio
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
analogWrite(ENA, 125);
analogWrite(ENB, 125);
}
void reversa_f(){ // retrocede fuerte
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
}
void derecha_f(){ // mueve hacia la derecha fuerte
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
analogWrite(ENA, LOW);
analogWrite(ENB, 255);
}
void derecha_d(){ // mueve hacia la derecha despacio
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
analogWrite(ENA, LOW);
analogWrite(ENB, 125);
}
void izquierda_f(){ // mueve hacia la izquierda fuerte
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
analogWrite(ENA, 255);
analogWrite(ENB, LOW);
}
void izquierda_d(){ // mueve hacia la izquierda despacio
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
analogWrite(ENA, 125);
analogWrite(ENB, LOW);
}
void detener(){ // se detiene
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
analogWrite(ENA, LOW);
analogWrite(ENB, LOW);
}