1. El Octavo Bit
  2. / Arduino
  3. / Librerias Arduino
  4. / Libreria NewPing

Libreria NewPing

| Actualizado:
Comentarios: 0

Libreria NewPing
Libreria NewPing

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

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");
}

Artículos que te pueden interesar

Control de servomotores
librería Servo

librería Servo

| Actualizado:
Comentarios: 0

Esta biblioteca permite a una placa Arduino controlar servomotores RC (hobby). Los Servos integran engranajes y un eje que puede ser controlado con precisión. Los servos estándar permiten que el eje sea colocado en distintos ángulos, por lo general entre…

Biblioteca SoftwareSerial

Biblioteca SoftwareSerial


Comentarios: 0

Arduino incorpora el estandar de comunicación Serial desde los pines Rx (pin 0) y Tx (pin 1) de la UART incorporado en la placa Arduino, lo que se llama SerialTTL, pero estos pines también van al conector USB por donde…

Librería para los sensores ultrasónicos
Libreria NewPing

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…

Comentarios - 0

Deja un comentario

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