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:
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:
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");
}
}