NewPing

Sites consultados:


http://playground.arduino.cc/Code/NewPing
http://buildbot.com.br/blog/como-utilizar-o-sensor-ultrasonico-hc-sr04/

Biblioteca NewPing


A biblioteca “NewPing” permite a utilização até 15 sensores ultrasónicos e adiciona novos recursos para utilização destes sensores.

Para compreender esta biblioteca devemos testar os novos recursos e executar pequenos programas.

Transferir Biblioteca


Faça o download utilizando este link: Download NewPing Library
Coloque a pasta “NewPing” em “libraries\”.

Breve resumo do NewPing


  • Funciona com muitos modelos de sensores ultrasónicos: SR04, SRF05, SRF06, DYP-ME007 & Parallax PING)))™.
  • Opção de interface com todos, exceto o sensor SRF06, usando apenas um pino Arduino.
  • Não demora mais de um segundo, se nenhum eco de ping é recebido, como em todas as outras bibliotecas de ultra-sons.
  • Compatível com toda a linha Arduino (e clones).
  • Ping aos sensores faz-se de forma consistente e é confiável até uma verificação a 30 vezes por segundo.
  • Método de interrupção temporizada para programas sobre movimentos.
  • Método de filtro digital incorporado ping_median () para uma correção fácil de erros.
  • Usa registros de porta no acesso aos pinos para execução mais rápida e um tamanho de código menor.
  • Permite a definição de uma distância máxima para os pings a partir desta distância não são efetuadas nenhumas leituras.
  • Facilidade de utilização de múltiplos sensores (por exemplo programas com 15 sensores).
  • Cálculo de distância mais preciso (cm, polegadas & uS).
  • Não usa pulseIn, é lento e dá resultados incorretos com alguns modelos de sensores ultrasónicos.

Função para cada Sonar


NewPing sonar(trigger_pin, echo_pin [, max_cm_distance]);

Examplo:
NewPing sonar(12, 11, 200);

Este comando inicializa o NewPing para usar do pino 12 para a saída do trigger, o pino 11 para a entrada do echo, com uma distância de ping máxima de 200 cm. Max_cm_distance é opcional [por defeito = 500 cm]. Se conectar usando um único pino, especifique o mesmo pino para trigger_pin e echo_pin, já que o mesmo pino faz as duas funções.

Recursos – Funções


sonar.ping (); – Enviar um ping, indica o tempo de echo em microssegundos ou 0 (zero) se nenhum ping de echo dentro da distância limite definida.
sonar.ping_in (); – Enviar um ping, indica a distância em polegadas ou 0 (zero) se nenhum ping de echo dentro da distância limite definida.
sonar.ping_cm (); – Enviar um ping, indica a distância em centímetros ou 0 (zero) se nenhum ping de echo dentro da distância limite definida.
sonar.ping_median (iterações); – Fazer vários pings (padrão = 5), descartar os valores fora dos limites de pings e indica a mediana em microssegundos
sonar.convert_in (echoTime); – Converte microsegundos numa distância em polegadas
sonar.convert_cm (echoTime); – Converte microsegundos numa distâncias em centímetros
sonar.ping_timer (função); – Enviar uma função ping e executa uma função de testar se o ping se completo.
sonar.check_timer (); – Verifique se o ping indica um valor dentro do limite da distância definida.
timer_us (freqüência, função); – Chama a função de chamada com uma frequência de microsegundos.
timer_ms (freqüência, função); – Chama a função de chamada com uma frequência de milissegundos.
timer_stop (); – Para o temporizador.

Exemplo de programas


Exemplo 1

#include <NewPing.h>
 
#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200
 
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
 
void setup() {
  Serial.begin(115200);
}
 
void loop() {
  delay(50);
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
}

Exemplo 2

/*
Este código de exemplo foi usado para se comunicar com êxito
com 15 sensores ultra-sônicos. Pode ajustar o número de sensores 
para o seu seu projeto, alterando SONAR_NUM e o número de objetos 
NewPing na matriz "sonar". Também precisa de alterar os pinos 
para cada sensor para os objetos NewPing.
Cada sensor é atuado em intervalos de 33ms. Então, um ciclo 
que contemple todos os sensores leva 495ms (33 * 15 = 495ms). 
Os resultados são enviados para a função "oneSensorCycle" que
atualmente neste exemplo apenas exibe os dados de distância. 
No seu projecto pode definir outras decisões para aos resultados 
obtidos por cada sensor (por exemplo, decidir se um robô precisa 
de girar, parar, virar para direita ou esquerda, etc). 
Se for necessário aumentar o intevalo de atuação dos sensores,
para além dos 33ms, deverá alterar-se o PING_INTERVALpara o valor
desejado.
-----Adptação para comentários em Portugês feita por Ramiro Martins
----- Clube de Robótica ESGC - https://cluberobotica.wordpress.com
 */
#include <NewPing.h>
 
#define SONAR_NUM     15 // Numero de sensores.
#define MAX_DISTANCE 200 // Distancia maxima em cm.
#define PING_INTERVAL 33 // Millisegundos entre pings.
 
unsigned long pingTimer[SONAR_NUM]; // Quando cada pings.
unsigned int cm[SONAR_NUM]; // Armazena distâncias do ping.
uint8_t currentSensor = 0; // Que sensor é ativo.
 
NewPing sonar[SONAR_NUM] = { // Declaração dos pins de cada sensor.
  NewPing(41, 42, MAX_DISTANCE),
  NewPing(43, 44, MAX_DISTANCE),
  NewPing(45, 20, MAX_DISTANCE),
  NewPing(21, 22, MAX_DISTANCE),
  NewPing(23, 24, MAX_DISTANCE),
  NewPing(25, 26, MAX_DISTANCE),
  NewPing(27, 28, MAX_DISTANCE),
  NewPing(29, 30, MAX_DISTANCE),
  NewPing(31, 32, MAX_DISTANCE),
  NewPing(34, 33, MAX_DISTANCE),
  NewPing(35, 36, MAX_DISTANCE),
  NewPing(37, 38, MAX_DISTANCE),
  NewPing(39, 40, MAX_DISTANCE),
  NewPing(50, 51, MAX_DISTANCE),
  NewPing(52, 53, MAX_DISTANCE)
};
 
void setup() {
  Serial.begin(115200);
  pingTimer[0] = millis() + 75; // O primeiro ping é iniciado em ms.
  for (uint8_t i = 1; i < SONAR_NUM; i++)
    pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
}
 
void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    if (millis() >= pingTimer[i]) {
      pingTimer[i] += PING_INTERVAL * SONAR_NUM;
      if (i == 0 && currentSensor == SONAR_NUM - 1)
        oneSensorCycle(); // Faz alguma coisa com os resultados.
        sonar[currentSensor].timer_stop();
        currentSensor = i;
        cm[currentSensor] = 0;
        sonar[currentSensor].ping_timer(echoCheck);
    }
  }
  // O resto do seu código será colocado aqui.
}
 
void echoCheck() { //Se existir um ping o valor será registado no array
  if (sonar[currentSensor].check_timer())
    cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}
 
void oneSensorCycle() { // Faz alguma coisa com os resultados.
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    Serial.print(i);
    Serial.print("=");
    Serial.print(cm[i]);
    Serial.print("cm ");
  }
  Serial.println();
}

Videos do YOUTUBE

 

Anúncios

1 Comment

Os comentários estão fechados.