Después de unas cuantas de horas intentando usar la función pulseIn de Arduino para leer los sensores de distancia SRF05, lo he dejado por imposible y me he puesto a desarrollar mi propia función para la lectura. Esta de basa en la función micros(); (unsigned long):
unsigned int lectura()
{
unsigned long acu = 0;
unsigned long largo = 0;
unsigned long primero = 0;
unsigned long ultimo = 0;
for (int x = 0; x <2; x++)
{
// enviamos al sensor un pulso de 10uS
pinMode(pulso1, OUTPUT);
pinMode(eco1, OUTPUT);
digitalWrite(pulso1, HIGH);
delayMicroseconds(10);
digitalWrite(pulso1, LOW);
while(digitalRead(eco1) == 0); //Esperamos a que el SRF05 ponga la linea en alto para empezar a contar
primero = micros(); //anotamos el valor al poner la linea en alto
while(digitalRead(eco1) == 1); //Cuando pone la linea en bajo seguimos adelante
ultimo = micros(); //anotamos el valor al poner la linea en bajo
largo = ultimo – primero; // calculamos el valor de la distancia
acu += largo ; //acumulamos los valores
delay(50); //evitamos que se solapen los rebotes
}
// convertimos a centimetros la medida (1 cm por cada 58uS por dos medidas)
return( (unsigned int) (acu / 116) );
//(Salida para debug):
//Serial.print(“Delante = “);
//Serial.println(acu / 116);
}
Y ahora las posibles mejoras:
- Timeout:
while(digitalRead(eco1) == 0);
while(digitalRead(eco1) == 1);
Se podría añadir una segunda condición por si el sensor esta desconectado no se quede bloqueado.
- Desbordamiento:
largo = ultimo - primero; // calculamos el valor de la distancia
acu += largo ; //acumulamos los valores
No se tiene en cuenta que la función micros() se desborda cada 70 minutos. Se podría hacer una comparación para que segundo siempre sea mayor que primero.
- Precisión:
return( (unsigned int) (acu / 116) );
Se podría añadir parametros o sobrecargas para definir el numero de muestras a tomar y si queremos precisión de milimetros.
Espero que sea de utilidad.
Entradas relaccionadas:
Yo desarrolle una aplicacion en Arduino similar a esta, pero no utilizando este tipo de sensores por decirlo asi “todo en uno” que prácticamente es medir y listo, sino con trasductores “pelados” sus etapas de amplificación, comparadores… etc. Y viendo así un poco por encima el código que has implementado es en algunos aspectos parecido al mio, aunque con este sensor solo es necesario medir el ancho del pulso, en mi caso tenia que medir el tiempo que transcurria desde que se emitia el pulso hasta que se recibía y luego utilizar la tipica fórmula que lo multiplica por la velocidad del sonido en el aire en funcion de la temperatura.
Pero vamos esta genial, ojalá hubiera podido utilizar este tipo de sensores que te facilitan mucho la vida, pero la distancia máxima era mi problema.
Perdona, estoy desarrollando con el arduíno para éste mismo sensor, y viendo tu código he pensado si no sería mejor usar los pines de interrupción para no tener el micro ocupado mientras realizas la medida y quedarte en el while pudiendo ejecutar otras tareas