Libreria NewPing

Actualizado el 24 agosto, 2021   0 comentarios

La biblioteca NewPing funciona con los sensores ultrasónicos: HC-SR04, SRF05, SRF06, DYP-ME007, JSN-SR04T y Parallax PING.

Funciones:

  • sonar.ping ([max_cm_distance]): envía un ping y obtiene el tiempo de eco (en microsegundos) como resultado. [max_cm_distance] permite establecer opcionalmente una nueva distancia máxima.
  • sonar.ping_in ([max_cm_distance]): envía un ping y obtiene la distancia en pulgadas enteras. [max_cm_distance] permite establecer opcionalmente una nueva distancia máxima.
  • sonar.ping_cm ([max_cm_distance]): envía un ping y obtiene la distancia en centímetros enteros. [max_cm_distance] permite establecer opcionalmente una nueva distancia máxima.
  • sonar.ping_median (iteraciones [, max_cm_distance]): realiza varios pings (predeterminado = 5), descarta los pings fuera de rango y devuelve la mediana en microsegundos. [max_cm_distance] permite establecer opcionalmente una nueva distancia máxima.
  • sonar.convert_in (echoTime): convierte echoTime de microsegundos a pulgadas.
  • sonar.convert_cm (echoTime): convierte echoTime de microsegundos a centímetros.
  • sonar.ping_timer (function [, max_cm_distance]): envía un ping y llama a la función para probar si el ping está completo. [max_cm_distance] permite establecer opcionalmente una nueva distancia máxima.
  • sonar.check_timer (): comprueba si el ping ha regresado dentro del límite de distancia establecido.
  • NewPing :: timer_us (frecuencia, función): función de llamada cada microsegundos de frecuencia.
  • NewPing :: timer_ms (frecuencia, función): función de llamada cada milisegundos de frecuencia.
  • NewPing :: timer_stop (): detiene el temporizador.

Ejemplos:

Ejemplo 1. en este ejemplo ejecuta un ping cada 50 ms y nos devuelve la distancia en cm

Esquema de conexión del HC-SR04 con la placa Arduino
#include <NewPing.h>

#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200 // Máxima distancia en cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Configuración de los pines y distancia máxima

void setup() {
  Serial.begin(115200);
}

void loop() {
  delay(50);                     // Esperar 50 ms para la proxima lectura
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Obtiene la distancia en cm (0 es fuera de rango)
  Serial.println("cm");
}

Ejemplo 2. Utilizando un solo pin

Esquema de conexión del HC-SR04 con la placa Arduino utilizando un solo pin
#include <NewPing.h>

#define PING_PIN  12  
#define MAX_DISTANCE 200 // Máxima distancia en cm.

NewPing sonar(PING_PIN, PING_PIN, MAX_DISTANCE); // Configuración de los pines y distancia máxima

void setup() {
  Serial.begin(115200);
}

void loop() {
  delay(50);                     // Esperar 50 ms para la proxima lectura
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Obtiene la distancia en cm (0 es fuera de rango)
  Serial.println("cm");
}

Ejemplo 3. Ejemplo con 3 sensores conectados a la placa

Esquema de conexión de 3 sensores HC-SR04 con la placa Arduino
#include <NewPing.h>

#define SONAR_NUM 3      // Número de sensores
#define MAX_DISTANCE 200 // Distancia máxima en cm

NewPing sonar[SONAR_NUM] = {   
  NewPing(4, 5, MAX_DISTANCE), // Configuración de los pines y distancia máxima
  NewPing(6, 7, MAX_DISTANCE), 
  NewPing(8, 9, MAX_DISTANCE)
};

void setup() {
  Serial.begin(115200);
}

void loop() { 
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    delay(50); // Esperar 50 ms para la proxima lectura
    Serial.print(i);
    Serial.print("=");
    Serial.print(sonar[i].ping_cm());
    Serial.print("cm ");
  }
  Serial.println();
}

En este ejemplo con tres sensores definimos primero el número de sensores y la distancia maxima, se crea el objeto NewPing, creando un array denominado sonar.

En la función loop() se utiliza un for para ir leyendo cada sensor y mostrarlo por el monitor serial.

Ejemplo 4.

#include <NewPing.h>

#define TRIGGER_PIN  12  
#define ECHO_PIN     11  
#define MAX_DISTANCE 200 // Máxima distancia en cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Configuración de los pines y distancia máxima

unsigned int pingSpeed = 50; // Frecuencia con la que se enviara un ping
unsigned long pingTimer;     // variable para el tiempo transcurrido
void setup() {
  Serial.begin(115200); 
  pingTimer = millis(); // Iniciar a contar el tiempo
}

void loop() {
  // Notice how there's no delays in this sketch to allow you to do other processing in-line while doing distance pings.
  if (millis() >= pingTimer) {   // Milisegundos transcurridos desde el ultimo ping
    pingTimer += pingSpeed;      // Establecer cuando sera el proximo ping.
    sonar.ping_timer(echoCheck); // Llamada a la función "echoCheck"
  }
  // Realizar otra tarea, mientras no se realiza una lectura del sensor.
}

void echoCheck() { // Verificar el estado del ping.
  if (sonar.check_timer()) { // Verificar si se recibe la señal
    Serial.print("Ping: ");
    Serial.print(sonar.ping_result / US_ROUNDTRIP_CM); // Ping returned, uS result in ping_result, convert to cm with US_ROUNDTRIP_CM.
    Serial.println("cm");
  }
}

Ejemplo 5. En este ejemplo se realizan 5 medidas y se halla la media. Se utiliza el mismo esquema de conexión que en el ejemplo 4

#include <NewPing.h>

#define ITERATIONS     5 // Numero de medidas
#define TRIGGER_PIN   12 
#define ECHO_PIN      11 
#define MAX_DISTANCE 200 // Máxima distancia en cm.
#define PING_INTERVAL 33 // Milisegundos transcurridos entre ping

unsigned long pingTimer[ITERATIONS]; // tiempo para que ocurra el siguiente ping.
unsigned int cm[ITERATIONS];         // array para guardar las distancias.
uint8_t currentIteration = 0;        // Contador de la medida realizada

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Configuración de los pines y distancia máxima

void setup() {
  Serial.begin(115200);
  pingTimer[0] = millis() + 75;            // El primer ping se realiza a los 75 ms
  for (uint8_t i = 1; i < ITERATIONS; i++) // Establecemos cuando va a ocurrir cada medida.
    pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
}

void loop() {
  for (uint8_t i = 0; i < ITERATIONS; i++) { 
    if (millis() >= pingTimer[i]) {         
      pingTimer[i] += PING_INTERVAL * ITERATIONS;
      if (i == 0 && currentIteration == ITERATIONS - 1) oneSensorCycle();
      sonar.timer_stop();          
      currentIteration = i;        
      cm[currentIteration] = 0;    
      sonar.ping_timer(echoCheck);
    }
  }
}

void echoCheck() {
  if (sonar.check_timer())
    cm[currentIteration] = sonar.ping_result / US_ROUNDTRIP_CM;
}

void oneSensorCycle() { // Calcular la media.
  unsigned int uS[ITERATIONS];
  uint8_t j, it = ITERATIONS;
  uS[0] = NO_ECHO;
  for (uint8_t i = 0; i < it; i++) { 
    if (cm[i] != NO_ECHO) {
      if (i > 0) {          
        for (j = i; j > 0 && uS[j - 1] < cm[i]; j--) 
          uS[j] = uS[j - 1];                        
      } else j = 0;         
      uS[j] = cm[i];        
    } else it--;            // Ping fuera de rango, omitir para la media
  }
  Serial.print(uS[it >> 1]);
  Serial.println("cm");
}

Deja un comentario

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

*
*
*