SRF05 con Arduino.

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.


6 pensamientos en “SRF05 con Arduino.

  1. Psioh

    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.

    Responder
  2. superprp

    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

    Responder
  3. BoOpS Autor

    Twitter: theboops
    En principio deberia correr en pinguino sin problema ya que no usa ninguna función que no esté implementada aún.

    Responder
  4. eder

    hola compañero tengo una duda yo soi usuario novato y estoy trabajando con un sensor modelo hc-sr04 en una placa pinguino estoy detenido por la libreria pulsein() ya que esa no esta para pinguino ese codigo me ayudaria? xq la verdad se parece bastante al mio pero estoy muy enrollado por la parte de esa libreria si me puedes ayudar estare agradecido

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *