Sensor Ultrasônico HC-SR04
Funcionamento.:
Para começar a medição é necessário alimentar o módulo e colocar o pino Trigger em nível alto por mais de 10us. Assim o sensor emitirá uma onda sonora que ao encontrar um obstáculo rebaterá de volta em direção ao módulo, sendo que o neste tempo de emissão e recebimento do sinal o pino ECHO ficará em nível alto. Logo o calculo da distância pode ser feito de acordo com o tempo em que o pino ECHO permaneceu em nível alto após o pino Trigger ter sido colocado em nível alto. a lto. Distância = [Tempo ECHO em nível alto * Velocidade do Som]/2 A velocidade do som pode ser considerada idealmente igual a 340 m/s, logo o resultado é obtido em metros se considerado o tempo em segundos. Na fórmula a divisão por 2 deve-se ao foto que a onda é enviada e rebatida, logo ela percorre 2 vezes a distância procurada.
Características:
Distância Mínima: 2cm; Distância Máxima: 5 metros; Precisão: 3mm;
A distância de um objeto pode ser calculada pela fórmula: d = 170 * t; onde ‘t’ é o tempo para a onda ir, rebater no objeto e voltar; O sensor é composto por 4 pinos, sendo eles(na ordem visto de frente): VCC: alimentação de 5v; TRIG: pino de gatilho (emissão de som); ECHO: pino de eco (leitura de som); GND: terra;
O pino VCC é ligado aos 5V do arduino. Os pinos ECHO e TRIG são ligados a pinos I/O digitais. O pino GND é ligado ao GND do arduino.
Se utilizarmos a biblioteca Ultrasonic.h , específica para este sensor, podemos usar estas três funções: Ultrasonic(int TP, int EP) esta função configura quais os pinos de ECHO e TRIG serão usados. O
primeiro parâmetro é o TRIG, o segundo é o ECHO. Ex: Ultrasonic(12,13); long Timing() esta funão retorna o tempo que o pino ECHO ficou em nível alto. É exatamente o ‘t’ da fórmula acima.
Ex: time = ultrasonic.Timing(); long Ranging(int sys) — (sys : CM / INC) esta função retorna a distância medida pelo sensor,
em centímetros(CM) ou em polegadas(INC), dependendo do parâmetro colocado na função. Ex: dist = ultrasonic.Ranging(CM); Obs.: Se estiver utilizando uma versão acima da 1.0, para funcionar a biblioteca “Ultrasonic.h”,
após extrair esta biblioteca em Arduino -> libraries, deve-se modificar ambos os arquivos “Ultrasonic.h” e “Ultrasonic.cpp”. Trocar “WProgram.h” por “Arduino.h”.
Ex.01) O programa abaixo faz a leitura da distância medida pelo sensor e a escreve no porta serial em centímetros. Ligação:
Código: #include
#define echoPin 13 #define trigPin 12 Ultrasonic ultrasonic(12,13); //primeiro parâmetro :TRIG; //segundo parâmetro :ECHO; void setup() { Serial.begin(9600); //inicia a porta serial; pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe o som); pinMode(trigPin, OUTPUT); // define o pino 12 como saida (emite o som); digitalWrite(trigPin, LOW); } void loop() { //Condição necessária para ser feita a medição: digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); //função Ranging, faz a conversão do tempo de //resposta do echo em centimetros, e armazena //na variavel distancia; int distancia = ultrasonic.Ranging(CM); //ou long distancia = 170*ultrasonic.Timing()/2; Serial.print("Distancia em CM: "); Serial.println(distancia); delay(500); } Verificado (v) Obs: As vezes o sensor retorna um valor acima de 1000 unidades, o que é um erro de leitura, então sempre que utilizar este sensor fazer uma condição para que estes valores sejam ignorados.
Ex.02) Com base no código anterior o programa abaixo liga os leds em uma escala de distância(no caso 10cm). O led 1 acende a partir de 10cm, o led 2 a partir de 20, o led 3 a partir de 30 e o led 4 a partir de 40cm. Ligação: - Os LEDS foram ligados nas portas 4, 5, 6 e 7 I/O digitais. - A ligação do sensor foi feita como no programa anterior. Código:
#include #define echoPin 13 #define trigPin 12 int dist; Ultrasonic ultrasonic(12,13); void setup() { Serial.begin(9600); //inicia a porta serial; pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe o som); pinMode(trigPin, OUTPUT); // define o pino 12 como saida (emite o som); digitalWrite(trigPin, LOW); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); dist = ultrasonic.Ranging(CM); if(dist < 1000) //caso não dê erro de leitura; { if (dist >= 10) //condição para led1 acender; digitalWrite(4, HIGH); else digitalWrite(4, LOW); if (dist >= 20) //condição para led2 acender; digitalWrite(5, HIGH); else digitalWrite(5, LOW);; if (dist >= 30) //condição para led3 acender; digitalWrite(6, HIGH); else digitalWrite(6, LOW); if (dist >= 40) //condição para led4 acender; digitalWrite(7, HIGH); else digitalWrite(7, LOW);
Serial.print("Distancia em CM: "); Serial.println(dist); } else Serial.println("Erro de leitura"); delay(500); } Verificado (v)