No post de hoje vamos utilizar o Arduino juntamente com o sensor ultrasônico HC-SR04 para montar um sensor de estacionamento (ou sensor de ré), que emite um “bip” conforme o sensor se aproxima de um obstáculo. Quanto mais próximo o obstáculo, maior a frequência do bip.
Como (geralmente) uma imagem vale mais do que mil palavras, vamos dar uma olhada no sensor instalado em um trator, devidamente “emprestado” do sobrinho 🙂
Bacana, né? Vamos ver como montar isso.
Circuito sensor de estacionamento com Arduino
O circuito é composto apenas pelo Arduino, um sensor ultrasônico HC-SR04 e um buzzer, com uma resistência de 330 ohms para limitar a corrente.
No programa, utilizei a biblioteca NEWTONE, que pode ser baixada nesse link e que eu já abordei nesse post.
O motivo de usar essa biblioteca é que a função TONE, normalmente usada para produzir sons com Arduino, apresenta conflito com a biblioteca Ultrasonic, também utilizada nesse projeto.
O som do bip pode ser alterado conforme a necessidade, alterando o valor das variáveis frequencia e tempo, setadas no começo do programa.
O pino Trigger do sensor vai ligado ao pino 13 do Arduino, e o pino Echo do sensor vai ligado ao pino 10 do Arduino. A alimentação do sensor é de 5 volts. O buzzer vai na porta 2 do Arduino.
A variável cmMsec armazena o valor da distância entre o sensor e o obstáculo. Uma série de comandos IF verificam o valor de cmMsec e atualizam a variável atraso, que é utilizada no final do programa para determinar a frequência de acionamento do bip.
Os valores lidos pelo sensor também podem ser acompanhados pelo serial monitor e, com algumas alterações no programa, exibidos em um display.
// Programa : Sensor de estacionamento com HC-SR04
// Autor : Arduino e Cia
#include <Ultrasonic.h> //Carrega a biblioteca Ultrasonic
#include <NewTone.h> //Carrega a biblioteca Newtone
//Dados do buzzer
#define tempo 500
int frequencia = 2000;
int Pinofalante = 2;
int atraso = 1000;
//Define o pino do Arduino a ser utilizado com o pino Trigger do sensor
#define PINO_TRIGGER 13
//Define o pino do Arduino a ser utilizado com o pino Echo do sensor
#define PINO_ECHO 10
//Inicializa o sensor ultrasonico
Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO);
void setup()
{
pinMode(Pinofalante,OUTPUT); //Pino do buzzer
Serial.begin(9600); //Inicializa a serial
}
void loop()
{
float cmMsec, inMsec;
//Le os dados do sensor, com o tempo de retorno do sinal
long microsec = ultrasonic.timing();
//Calcula a distancia em centimetros
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
//Ajusta o atraso de acordo com a distancia
if (cmMsec > 80)
{
atraso = 2000;
}
else if (cmMsec >50 && cmMsec<80)
{
atraso = 1500;
}
else if (cmMsec >30 && cmMsec<50)
{
atraso = 1200;
}
else if (cmMsec > 10 && cmMsec < 30)
{
atraso = 700;
}
else if (cmMsec < 10)
{
atraso = 300;
}
//Apresenta os dados, em centimetros, na Serial
Serial.print("Cent: ");
Serial.print(cmMsec);
Serial.print(" atraso : ");
Serial.println(atraso);
//Emite o bip
NewTone(Pinofalante, frequencia, tempo);
delay(atraso);
}
Podem ser adicionados outros comandos IF para melhorar a “precisão” do sensor, ou até mesmo ser utilizada outra solução para calcular o valor do delay. Uma sugestão seria a utilização da função map, por exemplo.
Por enquanto é isso. Já posso devolver o trator para o dono. 🙂