Libreria NewPing
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

#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

#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

#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