Libreria NewPing
| Actualizado:
Comentarios: 0
NewPing es una librería para el IDE de arduino que facilita el trabajo con sensores ultrasónicos. Esta librería ya contiene toda la lógica para realizar los cálculos de distancia con nuestro sensor HC-SR04, lo cual simplifica nuestro código.
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");
}