quinta-feira, 14 de junho de 2012

Tratando sensores ultra-sônicos com Arduino

Estou atualmente trabalhando com Arduino + Sensores ultra-sônicos e me deparei com problemas que eu achei interessante publicar. A ideia do projeto é utilizar os sensores para contar entrada e saída de pessoas em um estabelecimento, para isso está sendo utilizado dois sensores para detectar o sentido que a pessoa passa na porta (entrada ou saída).

Pois bem, irei apresentar os trechos de código que fazem parte da solução final.

1º - Rotina para leitura do sensor:

 unsigned long Timing(int trigger,int echo)  
 {  
   digitalWrite(trigger, LOW);  
   delayMicroseconds(2);  
   digitalWrite(trigger, HIGH);   
   delayMicroseconds(10);  
   digitalWrite(trigger, LOW);  
   unsigned long duration=pulseIn(echo,HIGH)/29/2;  
   return duration;  
 }  

Onde:
  • trigger: é a porta que será enviado o sinal para o sensor e,
  • echo: é a porta que receberá a resposta do sinal.
O valor que retorna do pulseIn está sendo dividido por 29 e depois por 2. Isso é para que o resultado dessa rotina retorne a distância que o sensor está levando em consideração a velocidade do som. A divisão por dois é para considerar apenas a ida (no caso do sensor ultra-sônico, é preciso que o sinal retorne para calcular a distância que é de ida e volta).

É importante também manter os valores dos delays (que estão em microsegundos), para evitar problemas com o processo do arduino.


2º - Rotina para verificar a existência de uma pessoa no sensor:

 boolean CheckDuration(unsigned long value)  
 {  
   if ( ((value<height)||(value > deadSignal)) && (value > 0) )  
   {  
     return true;   
   }  
   else   
     return false;  
 }  

Onde:
  • value: é o valor que retorna da função Timing,
  • height: é a altura mínima que deseja considerar nos cálculos e,
  • deadSignal: é o valor máximo que retorna do sensor (isso deve ser considerado pois pode acontecer do sensor perder o sinal, que significa que algo passou por ele. No meu caso o valor é de 500, que é a distância máxima que o sensor retorna de 5 metros)
Caso a função retorne verdadeiro, significa que o sensor detectou algo, caso contrário, o sensor não detectou nada.

Segue abaixo um exemplo de como trabalhar com essas duas funções:

 void loop()  
 {  
   if (CheckDuration(Timing(ETrig, EEcho)))  
   {  
     for (int i = 0; i < 14; i++)  
     {  
       delay(25);  
       if (CheckDuration(Timing(LTrig, LEcho)))  
       {  
         // DO SOMETHING  
         break;  
       }  
     }  
     delay(25);  
   }  
 }  

Nenhum comentário:

Postar um comentário