Explorando sensores de ultrassom - sensor de estacionamento
Nove de julho, feriado paulista (Revolução Constitucionalista de 1932), tarde fria, 'bora Arduinar. Tinha que testar dois sensores de distância do tipo ultrassom para um projeto, então montamos dois circuitos, eu e o meu ajudante da ocasião, Pedro, um para testar cada sensor.
Esses sensores funcionam da seguinte forma: eles emitem som numa frequência que não escutamos (muito aguda) e em seguida espera pelo eco do som emitido, enviando a informação da chegada do eco para o Arduino, que aí calcula a distância. Sabendo-se que o som percorre 340 m/s (isso no ar, ao nível do mar), pode-se calcular a distância percorrida pelo som até o obstáculo multiplicando-se o tempo decorrido entre a emissão e a detecção do eco e dividindo-se por dois. Para ver uma animação explicando como esse tipo de sensor funciona, clique aqui.
Esses são os sensores. O primeiro, HC-SCR04, é bom e barato: acha-se até por R$ 9,90 no Mercado Livre.
Abaixo, montado no circuito. O Vcc é 5V, os pinos de trigger e echo são ligados a pinos digitais do Arduino.
O segundo sensor é o LV-EZ1, da MaxBotix. A primeira coisa que chama a atenção é a diferença de preços entre os dois sensores: este custa R$ 129,00 no Lab de Garagem. Taí o datasheet.
Ele é de fato menor, e tem três formas de conexão com o circuito externo: analógica, largura de pulso (PW) ou serial.
Na analógica vc liga o pino de saída AN do sensor a um dos pinos analógicos do Arduino. A sensibilidade é de Vcc/512 por polegada. Em 5V no Arduino, temos: 5V/512/pol = 9.8 mV/pol. Como a saída do Arduino varia de 0 a 1023, temos que dividir por dois o valor da saída analógica, ou seja, o código fica:
int v = analogRead(0)/2; // a saída A do sensor está ligada ao pino 0
float distcm = v * 2.54;
Por fim, a conexão via serial, onde o sensor fornece o valor diretamente a uma conexão serial (RX/TX).
Para testar os sensores, montamos um circuito de um sensor de estacionamento, onde um LED e um buzzer darão aviso visual e sonoro da aproximação de um obstáculo. Esse sensor funciona exatamente como um sensor de estacionamento como os encontrados nos veículos hoje. Abaixo, fotos do circuito.
Aqui, vídeo dos dois circuitos funcionando e o código (o mesmo código) correspondente.
IMPORTANTE: no código abaixo existe a seguinte instrução:
long distancia = duration /29 / 2 ;
De onde vem esse 29???
Do seguinte: a instrução
long duration = pulseIn(echoPin,HIGH);
coloca na variável duration o tempo, em microssegundos, que o pulso leva para ir até o obstáculo e voltar até o sensor.
Sabemos que a velocidade média do som no ar é de aprox. 340 m/s, então em 1.000.000 microssegundos o som percorre 340 m.
Isso significa que, para saber a distância, devemos fazer a seguinte conta:
distancia = duration * 1.000.000 ms / 340 m/s / 2 (porque o duration dá o tempo de ida e volta)
1.000.000 / 340 = 2.94, o que dá a distância em metros. Como a maioria das medidas que se faz com esse sensor é em centímetros (o alcance dele é pequeno), a gente multiplica a constante por 100, o que nos dá o valor 29.
Obrigado ao leitor jkampus que me fez fazer essa alteração.
#define echoPin 13 //Pino 13 recebe o pulso do echo #define trigPin 12 //Pino 12 envia o pulso para gerar o echo void setup() { Serial.begin(9600); //inicia a porta serial pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe) pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia) pinMode(4, OUTPUT); // define o pino 12 como saida (envia) } void loop() { //seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0 digitalWrite(trigPin, LOW); // delay de 2 microssegundos delayMicroseconds(2); //seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1 digitalWrite(trigPin, HIGH); //delay de 10 microssegundos delayMicroseconds(10); //seta o pino 12 com pulso baixo novamente digitalWrite(trigPin, LOW); //pulseInt lê o tempo entre a chamada e o pino entrar em high long duration = pulseIn(echoPin,HIGH); //Esse calculo é baseado em s = v . t, lembrando que o tempo vem dobrado //porque é o tempo de ida e volta do ultrassom long distancia = duration /29 / 2 ; Serial.print("Distancia em CM: "); Serial.println(distancia); if (distancia < 5) { digitalWrite(4, HIGH); tone(8,440); delay(50); noTone(8); delay(50); } else if (distancia < 10) { digitalWrite(4, HIGH); tone(8,440); delay(100); noTone(8); delay(100); } digitalWrite(4, LOW); delay(100); //espera 1 segundo para fazer a leitura novamente }
Fiz esta experi~encia mas não consigo enviar o código ao Arduino, recebo a mensagem "error: Piches.h: No such file or directory".
ResponderExcluirComo resolver?
Caro Anônimo, desculpaí, na realidade não precisa do Pitches.h. Eu esqueci de retirar do fonte. Já consertei, obrigado!
ExcluirPS: depois me conta se funcionou.
ExcluirO segundo vídeo está como privado!
ResponderExcluirAnônimo, obrigado pelo aviso, já corrigi.
ExcluirParabéns pelo projeto ficou ótimo
ResponderExcluirTks!
ExcluirAmigo, para o sensor HC-SCR04, vc poderia configurar o arduino para mim, pago pelo serviço jbellneto@gmail.com
ResponderExcluirJOHNBELL, posso sim configurar para vc. Me escreva maiores detalhes (o que vc quer fazer, qual o Arduino etc) no email assismauro@hotmail.com.
ExcluirPq 29???? O cálculo de distância
ResponderExcluirjkampus, obrigado, já alterei o texto colocando essa informação.
ExcluirVeja se deu prá entender e, caso não, me avise por favor.
Na linha "long distancia = duration /29 / 2 ; "
ResponderExcluirPorque do numero 29?
Gabriele, no texto explica lá o porque do 29.
Excluir