Go Down

Topic: (SOLUCIONADO) micros() y millis() en sensor hcsr04 (Read 296 times) previous topic - next topic

27ivan27

Aug 05, 2019, 12:44 am Last Edit: Aug 05, 2019, 03:51 am by 27ivan27
Hola, muy buenas a todos.

Estuve haciendo la programación de un sumorobot, y poco a poco fui descubriendo cosas referentes al mundo de arduino. Me di cuenta que delay() congela el programa, y que en un robot esencialmente eso no deberia de haber estado sucediendo.

Luego de un tiempo practicando con Led´s el uso de millis() y haberle agarro bastante la mano, quiero aplicar dicha funcion al sensor (ultrasonico hcsr04) que fue usado en el robot mencionado anteriormente.

El problema: en la programacion adaptada a micros en el serial monitor me tira una distancia casi de la mitad que la que me arrojaba a la hecha con delays. y no solo eso, al hacerlo con micros() la medida obtenida de distancia oscila entre diferencias de hasta 20 cm por medicion (por ejemplo va de 100 cm a 120cm y despues a 115cm y asi), cosa que con delay no sucede (la medida obtenida era similar siempre. Espero me haya dado a explicar. (OJO, tal vez no se puede programar el sensor con micros y yo estoy intentando hacer una burrada).

El programa para obtener distancia (con delays) era asi:

Code: [Select]
int trigger = 7;   
int echo = 8;
float tiempo_de_espera,distancia;


void setup() {
  Serial.begin (9600);
  pinMode (7, OUTPUT);
  pinMode (8, INPUT);
   
}

void loop() {
  sensorU1();
   delay(100);
}

void sensorU1(){
    digitalWrite (7, 0);
    delayMicroseconds(2);
    digitalWrite (7, 1);
    delayMicroseconds (10);     
    digitalWrite (7, 0);

    tiempo_de_espera = pulseIn (8, 1); // pulseIn recibe la señal emitida por trigger
    distancia = (tiempo_de_espera/2)/29.15; // formula para calcular la distancia
    Serial.print (distancia); 
    Serial.println ("cm");
}


Cuando lo paso a micros(), para evitar el uso de los delaymicroseconds(), queda asi:

Code: [Select]
unsigned long currentMicros;
unsigned long previousMicroslow=0;
unsigned long previousMicroshigh=0;
unsigned long currentMicros2;
const unsigned long tiempolow=2;
const unsigned long tiempohigh=10;
int distancia,tiempo;
unsigned long previousMillis=0;
unsigned long currentMillis;
const unsigned long tiempodistancia=100;


void setup() {
Serial.begin(9600);
pinMode (8, INPUT);  // echo
pinMode(7, OUTPUT);  // trigger
}

void loop() {
 
currentMicros=micros();

if(currentMicros-previousMicroslow>=tiempolow){
  previousMicroslow=micros();
  digitalWrite(7, 1);
 
  currentMicros2=micros();
 
  if(currentMicros2-previousMicroshigh>=tiempohigh){
    previousMicroshigh=micros();
    digitalWrite(7, 0);
    }
  }
 
  tiempo = pulseIn(8, 1);
  distancia = (tiempo/2)/29.15;
 
  currentMillis=millis();
  if(currentMillis-previousMillis>=tiempodistancia){
  previousMillis=millis();
 
  Serial.print(distancia);
  Serial.println("cm");
  }

 
}

surbyte

Lo mejor que puedes usar es una rutina que NO BLOQUEE el flujo del programa.

Esta por ejemplo funciona asi :

1. Esta es la opcion que siempre uso NewPing library

2. o prueba esta : http://www.instructables.com/id/Non-blocking-Ultrasonic-Sensor-for-Arduino/?ALLSTEPS

27ivan27

#2
Aug 05, 2019, 01:34 am Last Edit: Aug 05, 2019, 01:37 am by surbyte Reason: No repitas lo que se lee arriba
Ok gracias, voy a probarlas.

Sabes qué? me arrojaba la mitad de la medicion porque no me estaba haciendo un correcto contacto el conector en el protoboard con gnd. De todos modos cada "x" tiempo una de las mediciones se va a la mitad, tal vez siga teniendo algun problema o sea parte de la programacion.

Muchas gracias por las librerias!

Go Up