terça-feira, 14 de dezembro de 2010

Utilizando o sensor ultrasônico HC-SR04 com o Arduino

O sensor HC-SR04 fornece medida de distância entre 2cm e 4m com uma precisão de até 3mm, o componente inclui o transmissor, receptor e o circuito de controle.
O sensor funciona basicamente da seguinte maneira:

  • Um sinal de 10 microsegundos é enviado ao sensor.
  • O sensor automaticamente envia o sinal e recebe de volta.
  • Se o sinal voltar o tempo gasto é retornado pelo circuito.


Requisitos de hardware.
1 Arduino
1 HC-SR04


Circuito.
O circuito é muito simples, basta conectar o VCC do sensor aos 5v do Arduino, GND ao GND, Echo a porta digital 10 e Trig a porta digital 12.


Imagem desenvolvida com o Fritzing

Código.
#define triggerPin 12
#define echoPin 10

void setup() {
  // Configura a saída serial para recuperar a leitura do sensor
  Serial.begin(9600);
  // Configura a porta digital em modo saida
  pinMode(triggerPin, OUTPUT);
  // Configura a porta digital em modo entrada
  pinMode(echoPin, INPUT);
}

void loop() {
  // Envia um sinal de 10ms ao sensor
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  
  // O sensor calcula o tempo gasto entre o envio e o recebimento
  // do sinal e retorna um pulso com esta duração
  long duration = pulseIn(echoPin, HIGH);

  // Converte o tempo para distancia em centimetros
  float cm = microsecondsToCentimeters(duration);
  
  // Informa a distancia na serial
  Serial.println(cm, DEC);
  
  delay(1000);
}

float microsecondsToCentimeters(long microseconds){
  // Converte o tempo de microsegundos para segundos
  float seconds = (float) microseconds / 1000000.0;
  // Com a velocidade do som de 340m/s calcula-se a
  // distancia percorrida
  float distance = seconds * 340;
  // Divide o resultado por dois pois o tempo é calculado
  // considerando a ida e a volta do sinal  
  distance = distance / 2;
  // Converte o resultado em metros para centimetros
  distance = distance * 100;
  
  return distance;
}


Referências.

5 comentários:

  1. Cara, tudo bom ?

    Sensacional a explicação, mas me esclarece uma coisa por favor. Existe a possibilidade de eu usar mais de um sensor por arduino?
    Estou tentando, mas até agora sem sucesso. Será que vai conflitar alguma entrada de dados? Ou é razoavelmente simples e eu devo estar errando a lógica mesmo ?

    Um abraço

    ResponderExcluir
  2. Acho que você terá que usar outras duas portas para cada sensor, vamos supor:
    #define triggerPin2 13
    #define echoPin2 11

    Aí na parte loop do seu código em cada instrução de gravação e leitura vc duplica inserindo seu sensor adicional.

    A mesma porta para mais de um sensor acho que não dá, talvez a trigger possa ser comum.

    Abs.

    ResponderExcluir
  3. Cara na verdade já até fiz, to usando 6 sensores por arduino.
    Agora estou agarrado código porque tenho que montar um projeto que utiliza coincidências de sensores.
    Se puder me adicionar no email ou até facebook eu seria eternamente grato kkkkk

    Abraços

    ResponderExcluir
  4. Kerleston, boa tarde cara!

    Me explica uma coisa. Por ele ser ultra sônico e emitir os pulsos constantemente ... não daria para por exemplo: Se algo ficar na frente por 30 seg eu ter como saber ? Ou como os pulsos são constantes, a cada pulso ele contaria esses "30 seg" ?

    Espero que tenha ficado claro a minha intenção, caso não tenha, é só me falar.

    Abraços e muito obrigado

    ResponderExcluir
  5. Desculpe, só vi agora sua mensagem.
    Se eu entendi você precisa saber se tem algo na frente.
    O que você pode fazer é na inicialização pegar a medida inicial considerando que não há nada ali e que o sensor esteja fixo.
    Qualquer leitura diferente da inicial é pq tem algo na frente, aí você pode observar a variação da distancia pra saber se alguém passou por ali.
    Fiz um contador assim uma vez.

    ResponderExcluir