Hoje o Fazedores começa uma série de artigos sobre sensores!
Ao longo das próximas semanas, vamos apresentar como funcionam alguns dos sensores mais úteis e legais disponíveis no mercado para você utilizar e seus projetos com Arduino. Neste post de estréia, apresentamos o sensor ultrassônico que serve para detectar obstáculos e medir distâncias e tem inúmeras aplicações. Quer saber tudo sobre ele? Chega mais.
Talvez você não o conheça pelo nome, mas provavelmente já o viu em ação! Eles estão presentes nos famosos “sensores de estacionamento” dos automóveis mais modernos. Aqueles que apitam quando você está perto demais de uma parede , outro veículo ou obstáculo. Além de detectar a presença de uma barreira, eles também conseguem medir a distância do obstáculo. Por isso, além dos carros, também são muito usados em fábricas, processos de automação industrial, robótica e até na medicina.
Como funcionam os sensores ultrassônicos?
O sensor ultrassônico é composto de um emissor e um receptor de ondas sonoras. Podemos compará-los a um alto-falante e um microfone trabalhando em conjunto. Entretanto, ambos trabalham com ondas de altíssima frequência, na faixa dos 40.000 Hz (ou 40KHz). Isto é muito, muito acima do que os nossos ouvidos são capazes de perceber. O ouvido humano consegue, normalmente, perceber ondas na entre 20 e 20.000 Hz e por isto o sinal emitido pelo sensor ultrassônico passa despercebido por nós.
O sinal emitido, ao colidir com qualquer obstáculo, é refletido de volta na direção do sensor. Durante todo o processo, o aparelho está com uma espécie de “cronômetro” de alta precisão funcionando. Assim, podemos saber quanto tempo o sinal levou desde a sua emissão até o seu retorno. Como a velocidade do som no ar é conhecida, é possível, de posse do tempo que o sinal levou para ir até o obstáculo e voltar, calcular a distância entre o sensor e o obstáculo. Para isto vamos considerar a velocidade do som no ar (340 m/s) na seguinte equação:
d = ( V * t ) /2
Onde:
- d = Distância entre o sensor e o obstáculo (é o que queremos descobrir).
- V = Velocidade do som no ar (340 m/s).
- t = Tempo necessário para o sinal ir do sensor até o obstáculo e voltar (é o que o nosso módulo sensor ultrassom mede).
A divisão por dois existe pois o tempo medido pelo sensor é na realidade o tempo para ir e voltar, ou seja, duas vezes a distância que queremos descobrir.
O detalhes do sensor
Existem sensores ultrassônicos de diversos fabricantes e com algumas particularidades. Em nosso projeto utilizaremos o Sensor de Distância Ultrassônico HC-SR04 que é bastante comum, tem boa precisão e é bastante acessível.
Estes módulos possuem quatro pinos e são bem simples de serem utilizados com microcontroladores como o Arduino, Parallax, BASIC Stamp, PIC e outros. Em nossos exemplos utilizaremos um Arduino. Dois pinos são utilizados para alimentar o sensor , um deles é utilizado para disparar o sinal ultrassônico e o outro para medir o tempo que ele leva para retornar ao sensor. Existem algums sensores ultrassônicos, com o Parallax PING))), que possuem apenas três pinos e utilizam um único pino para disparar o pulso e medir o tempo de resposta. Se seu sensor tiver apenas três pinos as conexões e o código do Arduino devem ser devidamente ajustados.
- VCC : Alimentação do módulo com +5 V.
- Trig : Gatilho para disparar o pulso ultrassônico. Para disparar coloque o pino é HIGH por pelo menos 10us.
- Echo : Gera um pulso com a duração do tempo necessário para o eco do pulso ser recebido pelo sensor.
- Gnd : Terra.
Vale lembrar que existem limitações para o funcionamento do sensor ultrassônico. Primeiro você tem que levar em consideração que tipo de obstáculo está querendo detectar. Se o obstáculo for muito pequeno pode ser que ele não gere um sinal de retorno suficiente para ser percebido pelo sensor. Se o obstáculo não estiver posicionado bem a frente do sensor você pode ter medidas imprecisas ou até mesmo não acusar a presença do mesmo. E por fim, a faixa de distância que o sensor trabalha fica entre 2cm e 4m e isto pode variar de sensor para sensor. De qualquer modo, independentemente destas restrições, estes sensores são super divertidos e muito bons para uma série de aplicações.
Aplicação no Arduino
A interação deste sensor com Arduino é muito simples! Nosso sketch Arduino realizará as seguintes ações:
No setup definiremos dois pinos para utilizarmos como interface com o sensor. Um deles será chamado de gatilho e será definido como uma saída. O outro será chamado de echo e será definido como entrada. Claro, também faremos a incialização do display, mas isto é papo para outro post.
No loop ficaremos, indefinidamente, medindo a distância entre o sensor e o obstáculo e mostrando o resultado no display. A cada iteração faremos o seguinte: instruiremos o sensor a emitir um pulso ultrassônico colocando o pino gatilho em HIGH por alguns microssegundos e, depois, mediremos a duração do pulso no pino echo. De posse da duração do pulso no pino echo basta fazermos algumas contas para descobrir a distância do objeto (em centímetros e polegadas) e apresentarmos estes valores no display LCD.
Mas vamos lá, é o hora de por as mãos a obra. Você precisará dos seguintes materiais:
- sensor ultrassônico com quatro pinos (HC-SR04 ou compatível)
- Arduino (UNO R3 ou compatível)
- potenciometro 10K ohms
- protoboard
- display LCD 16×4 (você pode usar um display diferente desde que faça as adaptações necessárias no código)
- jumpers para as conexões
- cabo USB para carregar o programa no Arduino
Diagrama de Conexão
Seu circuito ficará da seguinte forma:
Código Arduino
Depois de conectar seu Arduino ao sensor ultrassônico e ao display LCD de acordo como diagrama que apresentamos, basta carregar o seguinte sketch em seu Arduino:
// biblioteca para o display LCD #include <LiquidCrystal.h> // variáveis int gatilho = 9; // pino TRIG do sensor ultrassônico int echo = 8; // pino ECHO do sensor ultrassônico float tempo; // para armazenar o tempo de ida e volta do sinal em microsegundos float distancia_cm; // para armazenar a distância em centímetros float distancia_in; // para armazenar a distância em polegadas // inicialização do display LCD LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // setup (executado apenas uma vez) void setup() { // configura pino GATILHO como saída pinMode(gatilho,OUTPUT); // deixa pino em LOW digitalWrite(gatilho,LOW); delayMicroseconds(10); // configura pino ECHO como entrada pinMode(echo,INPUT); } // laço principal (executado indefinidamente) void loop() { // disparar pulso ultrassônico digitalWrite(gatilho, HIGH); delayMicroseconds(10); digitalWrite(gatilho, LOW); // medir tempo de ida e volta do pulso ultrassônico tempo = pulseIn(echo, HIGH); // calcular as distâncias em centímetros e polegadas distancia_cm = tempo / 29.4 / 2; distância_in = tempo / 74.7 / 2; // apresentar resultados no display LCD lcd.begin(20, 4); lcd.setCursor(1,0); lcd.print("Distancia: "); lcd.print(distancia_cm); lcd.print(" cm"); lcd.setCursor(12,1); lcd.print(distancia_in); lcd.print(" in"); lcd.setCursor(3,3); lcd.print("fazedores.com"); // aguardar um pouquinho antes de começar tudo de novo delayMicroseconds(200); }
Entendendo o código e os cálculos
O código é bastante simples e auto-explicativo, mas você deve estar se perguntando de onde vieram os números 29.4 e 74.7 no cálculo da distância, correto?
Como queremos saber a distância, em centímetros e polegadas respectivamente, tivemos que fazer algumas continhas.
Primeiro calculamos a velocidade do som no ar em centímetros por segundo e em polegadas por segundo. Isto deu: 34000 cm/s e 13385.8 in/s.
Depois calculamos quantos microssegundos o som leva para percorrer um centímetro e uma polegada. Para isto bastar resolver a seguinte regra de três:
- 1000000 ms => 34000 cm
- X ms => 1 cm
E temos que são necessários 29.4 ms para o som percorrer um centímetro. Fazendo o mesmo para polegadas chegamos o número de 74.4 ms para percorrer uma polegada.
Pronto, agora como medimos o tempo em microssegundos para o som ir e voltar ao sensor, basta dividir este tempo por 29.4 e 74.4 para descobrir quantos centímetros e quantas polegadas o som teve que percorrer.
Porém, como o som tem que fazer o trajeto de ida e volta, finalizamos dividindo o resultado por dois para sabermos a distância entre o sensor e o obstáculo. E ai nossa fórmula fica assim:
distancia_cm = tempo / 29.4 / 2; distância_in = tempo / 74.7 / 2;
Como vocês podem ver é bastante simples utilizar sensores como estes com o Arduino para identificar obstáculos ou medir a distância deles. Com um pouco de criatividade você pode montar projetos incríveis com estes componentes.
Que tal pegar o nosso exemplo e montar um projetinho com ele? Pode ser um alarme para a sua garagem ou um robô que desvia sozinho de obstáculos em seu quarto!
Ahh, e não se esqueça de que se você tiver alguma dúvida, basta ir até o Fórum do Fazedores e pedir ajuda para a galera.
Onde comprar?
Compre Arduino, componentes eletrônicos e ferramentas na FilipeFlop. Os preços são ótimos, a agilidade é matadora e as entregas são feitas para todo o Brasil. O Fazedores e a FilipeFlop estão juntos para fomentar a cultura maker no Brasil.
boa noite. localizei um pequeno nesta linha
float distancia_cm; // para armazenar a distância em centímetros // distancia sem acento
segue o código
// biblioteca para o display LCD
#include
// variáveis
int gatilho = 9; // pino TRIG do sensor ultrassônico
int echo = 8; // pino ECHO do sensor ultrassônico
float tempo; // para armazenar o tempo de ida e volta do sinal em microsegundos
float distancia_cm; // para armazenar a distância em centímetros
float distancia_in; // para armazenar a distância em polegadas
// inicialização do display LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// setup (executado apenas uma vez)
void setup() {
// configura pino GATILHO como saída
pinMode(gatilho,OUTPUT);
// deixa pino em LOW
digitalWrite(gatilho,LOW);
delayMicroseconds(10);
// configura pino ECHO como entrada
pinMode(echo,INPUT);
}
// laço principal (executado indefinidamente)
void loop() {
// disparar pulso ultrassônico
digitalWrite(gatilho, HIGH);
delayMicroseconds(10);
digitalWrite(gatilho, LOW);
// medir tempo de ida e volta do pulso ultrassônico
tempo = pulseIn(echo, HIGH);
// calcular as distâncias em centímetros e polegadas
distancia_cm = tempo / 29.4 / 2;
distancia_in = tempo / 74.7 / 2;
// apresentar resultados no display LCD
lcd.begin(20, 4);
lcd.setCursor(1,0);
lcd.print(“Distancia: “);
lcd.print(distancia_cm);
lcd.print(” cm”);
lcd.setCursor(12,1);
lcd.print(distancia_in);
lcd.print(” in”);
lcd.setCursor(3,3);
lcd.print(“fazedores.com”);
// aguardar um pouquinho antes de começar tudo de novo
delayMicroseconds(200);
}
legal.mas como faço para controlar a altura de duas barras laterais onde o seu levante ocorre por cilindro hidráulico?
Thayron parabéns pelo artigo muito bom mesmo. Também escrevi um artigo como este, caso alguem aqui queira dar uma olhada para complementar a leitura o link é esse https://blog.silvatronics.com.br/medindo-distancias-com-arduino-e-modulo-sensor-ultrassonico-hc-sr04-2/
Qual o programa usado para simular?
Cara, preciso muito que me tire uma duvida. Preciso desenvolver esse codigo e preciso de um norte.
Tarefa 1 – campo de atuação do sensor de distância – Você deverá criar um recorte, tipo filtro
de papel, no campo de atuação de seu sensor de distância. O papel deverá estar
representados valores em centímetros
Deverá ser ajustado para pegar o movimento na borda do papel, não poderá ter sobra!
Queria saber qual a função do potenciômetro, e se eu posso substitui-lo por um resistor de 10k???
Sou aluno do 3ºANO de Eletrônica do Colégio Técnico Industrial de Guaratinguetá – Unesp e junto aos meus amigos de classe preciso desenvolver o projeto da trena eletrônica com o sensor ultrassônico no pic 16f877, mas estou com um pouco de dificuldade no desenvolvimento do projeto. Se alguem puder me ajudar, me a-mail é matheusdiniz99@icloud.com
COMPLEXO, MAS MUITO LEGAL.
Boa Noite.
Gostaria de saber se que quiser montar um relatório com data da medição, duração da medição se esta não mudar ao invés de mostrar as distancias no display.
Qual seria o algoritmo?
abraços.
Olá!
Meus alunos de robótica estão fazendo um projeto para evitar colisão de pássaro em janelas. Eles estão utilizando Arduino Mega e sensor ultrassônico. Gostaríamos de saber se há a possibilidade de regular a frequência do ultrassônico. Você postou que a frequência seria de até 40 KHz. É primeira vez que estamos utilizando um projeto com Arduíno e somo muito leigos no assunto. Agradeço a colaboração.
Att
Regina
COM O SENSOR FUNCIONANDO EM UMA PLACA ARDUINO, É POSSIVEL ENVIAR ESSAS INFORMAÇÕES (MOVIMENTO) A UM SISTEMA DE UMA EMPRESA, POR EXEMPLO, POR MEIO DE UM SINAL?
ola sou o peter e gostaria muito que me ajudassem no meu projecto estou fazendo um carro que decrementa a velocidade quando se aproxima de um obstaculo para isso estou usando um ultrasónico e um modulo bluetooth para monitorar o carrinho mas usando a mesma comunicação nao esta a funciona da forma que eu pretendo como eu faço????
pago bem acima de R$ 2,000 para quem projetar um sensor ultrassônico para ouvido humano na faixa de ondas entre 20 e 20.000 Hz . o aparelho é para combater poluição sonora, algo muito comum aqui. preciso ajudar varias pessoas que sofrem com esse problema e que a justiça nada tem para amenizar com severas punições .
Olá,
No meu projeto, utilizei a biblioteca Ultrasonic para converter a distância em centímetros…
Alguém sabe me dizer qual a distância horizontal que o HC-SR04 pega? Ou seja, quanto de distância ele cobre horizontalmente nessa faixa de 2cm a 4 cm?
oi tudo bem ?
Faço curso de Mecatronica e preciso fazer um projeto de TCC. O projeto é um GPS de interiores para deficientes visuais da minha escola. Eu e meus amigos queremos fazer com o Arduino, mas não sabemos quais sensores usar. Vocês poderiam nos indicar alguns?
Alguém saberia se existem sensores pequenos como esse HC-SR04 mas para distâncias maiores (tipo > 5m < 20m) ?? Se sim, favor informar fabricante e referência.
Grato
O código responde o seguinte erro para mim.
This report would have more information with
“Show verbose output during compilation”
enabled in File > Preferences.
Arduino: 1.0.6 (Windows 7), Board: “Arduino Uno”
sketch_feb15a:39: error: stray ‘\’ in program
sketch_feb15a.ino: In function ‘void loop()’:
sketch_feb15a:39: error: ‘dist’ was not declared in this scope
sketch_feb15a:39: error: expected `;’ before ‘u00e2ncia_in’
Exelente projeto cara, eu preciso da sua ajuda , estou tentando utilizar um sensor ultrassonico da lego , gostaria de saber se a logica é a mesma , e se nao , qual a diferencia , desde já
obrigado
Olá galera, não sei se estou no lugar correto, mas estou pesquisando sobre sensores para um projeto e gostaria de saber se os sensores ultrassônicos funcionaria de baixo da água? acredito que não, mas existe algum que possa detectar obstáculos de baixo da água? ou alguma programação ou função do arduino + sensor ultrasom?
Muito bom, parabéns! Duvidas tiradas agora só colocar em prática :D
Thayron, boa tarde.
Usando estes mesmos princípios, gostaria de fazer um medidor de nível, porém, a informação mostrada no display (ou monitor serial) é inversa. Quando a distância for curta (mostra reservatório 100%); e à medida que o volume vai baixando, a porcentagem reduz proporcionalmente até 0%. Não consigo pensar em uma lógica que inverta a informação lida pelo sensor.
Ref – distância do sensor ao nível mínimo
h – altura total do reservatório (nível mínimo – nível máximo)
x – distância medida pelo sensor
[(Ref – x) / h] * 100%
desculpa a demora a responder mas só vi agora :)
Tem um erro neste codigo, está na linha 39, a palavra “distancia” está com acento, sendo que a “referencia” não está, isso causara um erro, tirem o acento ou mudem nas linha 8, 9 e 38, 39 (algumas delas…) E eu ainda sou iniciante no “ramo” do arduino… Obrigado, gostei bastante do projeto.
Olá,
Estou tentando desenvolver meu primeiro projeto arduino mais me deparei com uma condição que não consigo sair dela:
Quando entra na condição While, não sai mais dela, abaixo o programa caso alguém possa me dar uma luz:
#include
#define TRIGGER_PIN 12
#define ECHO_PIN 13
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
int relay = 10;
void setup()
{
Serial.begin(9600);
pinMode (relay, OUTPUT);
}
void loop() {
if (analogRead(A0) > 100) { // VERIFICA SE O SENSOR DE AGUA TEM AGUA
float cmMsec, inMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
if (cmMsec 10) { // NESSA CONDIÇÃO WHILE, JÁ TENTEI USAR 10 / 10,00 / 10.00 E CADA UM DA UM RESULTADO, MAIS NENHUM O QUE EU QUERO
float cmMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
digitalWrite (relay, HIGH);
Serial.print(cmMsec);
Serial.println(” , medida maior que 10 = rele ligado”);
digitalWrite (relay, HIGH);
delay(1000);
}
}
}
else {
Serial.println(“sem umidade”); // SE O SENSOR DE AGUA NÃO DETECTA AGUA NÃO FAZ NADA E MANTEM O RELE DESLIGADO.
digitalWrite (relay, LOW);
delay(1000);
}
}
Se a fórmula é d = v*t, porque você faz d = v/t?
É realmente necessário usar as variáveis “float” para este código? Não é possível utilizar ao invés destas, apenas as variáveis “int”?
É realmente necessário utilizar as variáveis “float” neste código?
Não posso utilizar apenas as variáveis “int” para medir um centímetro com este sensor ultrassônico neste código?
É realmente necessário utilizar as variáveis “float” no código?
Não posso utilizar apenas as variáveis “int”?
Muito bacana essa matéria, estou interessadissimo por sensores. Atualmente estou com dois projetos, um com sensor a gás e outro com sensor ultrasom…..obrigado pelas dicas…..Rene.
olá Thayron, sou técnico eletroeletronico e fã do Arduino. Parabéns pelo teu blog, boas dicas com Arduino. Atualmente estou montando um circuito com sensor e válvula solenóide para uma torneira automática. Estava pesquisando e cheguei na tua página por acaso. Rene (São Paulo)
E se eu quiser o resultado em metros? como faço?
Olá, gostaria de saber qual a precisão deste sensor. preciso fazer um projeto para medir largura de algumas barras de ferro. essas barras tem cerca de 14 mm. O ideal seria um sensor mais preciso possível para medir algumas barras de 14,5 mm por exemplo.
Agradeço
Olá Leandro!!
Bem, não consegui entender como você pretende fazer esse projeto. Acredito que o sensor HC-SR04 não vai te atender, pois ele consegue medir distancias mínimas de 2Cm até o distancias máximas de 5M, com uma precisão de 3mm. Sei que existe sensores mais precisos, mas não sei te dizer exatamente qual. Para te ajudar, sugiro que você vá até nosso fórum e lance essa pergunta! Lá tem uma galera fera que vai poder te ajudar com isso!
Abração!!!
A mais de uma ano eu comprei o arduino, + sensor ultrasom pq queria fazer um projetinho de:
Se meu gato chegar a menos de 1 metro de distancia da fonte de água, o arduino liga uma bombinha de aquario 127v. Daí um contador deixaria ela funcionando por 5 minutos e desliga.
Na minha cabeça funciona, mas na prática não consegui levar avante esse projetinho.
Sou newbie total, mas gostaria de uma ajuda pra reviver esse projeto.
Bacana! Vale mencionar para os iniciantes como está coletando o tempo: a função pulseIn faz a medição de tempo para a variação de estado de uma dada porta. (http://arduino.cc/en/Reference/pulseIn)
Bem lembrado Roberto! Eu mesmo desconhecia esta função pulseIn. No caso ela mede a duração de um pulso LOW-HIGH-LOW. Ou seja, mede o tempo que o pino ficou em HIGH. Correto?
Muito bom, parábens.