Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

quarta-feira, 17 de julho de 2013

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.
Sensor Ultra Sonico Distancia Hc-sr04 Ultrassom Pic Arduino

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.
Sensor de distância por ultrassom - LV-EZ3
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;

Na conexão como largura de pulso, o funcionamento é análogo ao HC-SCR04: conecta-se os pinos PW e BW a dois pinos digitais do Arduino. O código eu colocarei como exemplo no fim desse artigo.

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  
}