Go Down

Topic: Ayuda para ejecutar una función solo al inicio. MiniSumo program. (Solucionado) (Read 138 times) previous topic - next topic

27ivan27

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

Code: [Select]
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);
}

Sereno

La función setup solo se ejecuta una sola vez.
Cuando llega a tu for, Linea_izq no se actualiza, linea_der no se actualiza, distancia_der nunca se acutualiza y distancia_izq nunca se actualiza, eso lo hace dentro del loop.
Con eso ya sabes donde está en problema.

27ivan27

La función setup solo se ejecuta una sola vez.
Cuando llega a tu for, Linea_izq no se actualiza, linea_der no se actualiza, distancia_der nunca se acutualiza y distancia_izq nunca se actualiza, eso lo hace dentro del loop.
Con eso ya sabes donde está en problema.

Deberia volver a escribir la actualizacion de dichos sensores (o sea el "void sensores(){") antes del loop? Es decir, al final del setup y antes del loop. Lo intente y es lo mismo.

De todos modos modifique una pequeña parte del for (la colocare en esta respuesta), y sí, tenés razon. Son los sensores que no se actualizan. Seguiré pensando y buscando. Gracias por darme la orientacion!!

Code: [Select]
for(x=0;x<5;x=x+1){
  if((linea_izq>700)&&(linea_der>700)&&(distancia_der>20)&&(distancia_izq>20)) {
  derecha_f();
  Serial.println("derecha inicial");
  delay(3000);
  izquierda_f();
  Serial.println("izquierda inicial");
  delay(3000);
}else{
  break;
}
}

Sereno

Arduino, solo puede hacer una sola cosa a la vez, si esta dentro de un bucle for no podrá hacer nada que esté fuera de el, por tanto si como condición pones una variable que no la actualizas dentro del propio bule, no cambiará nunca.
Si quieres que funcione actualiza las variables que has puesto como condición dentro del bucle for.
Busca información sobre millis y utilízalos en lugar de los delay.

27ivan27

Arduino, solo puede hacer una sola cosa a la vez, si esta dentro de un bucle for no podrá hacer nada que esté fuera de el, por tanto si como condición pones una variable que no la actualizas dentro del propio bule, no cambiará nunca.
Si quieres que funcione actualiza las variables que has puesto como condición dentro del bucle for.
Busca información sobre millis y utilízalos en lugar de los delay.

Oooh entiendo, mañana por la mañana/tarde aprovecharé que no tengo que ir a la escuela y probaré de avanzar en esto que me dijiste. Posteare el resultado, aun sea que funcione ya de una vez o no. Gracias

27ivan27

Arduino, solo puede hacer una sola cosa a la vez, si esta dentro de un bucle for no podrá hacer nada que esté fuera de el, por tanto si como condición pones una variable que no la actualizas dentro del propio bule, no cambiará nunca.
Si quieres que funcione actualiza las variables que has puesto como condición dentro del bucle for.
Busca información sobre millis y utilízalos en lugar de los delay.

Ahí logre poner en uso el millis al menos en esa parte de la programacion. El problema es que no me demora 3 seg por funcion tal y como lo seteo, sino que lo hace rapidisimo. Les dejo la programacion por si hay algun error suelto ahi, pero por lo pronto no logro darme cuenta cuál puede o cuál es la explicacion.

Code: [Select]
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;

// millis()
const unsigned long derecha_ini_1 = 3000;       
const unsigned long izquierda_ini_1 = 3000;

unsigned long der_ini_startMillis;
unsigned long izq_ini_startMillis;
unsigned long currentMillis;

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);
  der_ini_startMillis = millis();    // guarda el tiempo de inicio

for(x=0;x<5;x=x+1){
  sensores();
  if((linea_izq>700)&&(linea_der>700)&&(distancia_der>20)&&(distancia_izq>20)) {
    currentMillis = millis();
    if(currentMillis - der_ini_startMillis <= derecha_ini_1) {
    derecha_f();
    Serial.println("derecha inicial");
    izq_ini_startMillis = currentMillis;
    }
    if(currentMillis - izq_ini_startMillis <= izquierda_ini_1) {
    izquierda_f();
    Serial.println("izquierda inicial");
  }
}
}
}

Go Up