Sensor Ultra-Sônico
Autor: Jean Carlos | Publicado: 2012-04-01T08:16:00-07:00



Sensores de ultra som são componentes muito úteis no desenvolvimento de projetos microcontrolados por serem fáceis de implementar e ter uma resposta linear diretamente proporcional a distância em que se encontra de um determinado objeto.

Veremos agora como funciona o sensor de ultrasom DYP-ME007 que pode&nbsp; ser adquirido diretamente da China através do site www.goodluckbuy.com





O Sensor de ultrasom pode detectar objetos a distâncias que variam entre 2 e 350cm de distância com uma precisão de 3mm, sendo que o modelo testado retornou uma precisão de 2mm. 

A detecção de distância é feita através do disparo de um pulso de nível alto com duração de 10us no pino de Trigger do sensor, assim que ele detectar este sinal, emite uma sequencia de 8 pulsos na frequência de 40KHz, frequência esta que define o termo Ultra-sônico utilizado na nomenclatura. Após este som emitido “Bater” em algum objeto, retorna e é capturado pelo microfone do sensor para processamento das informações.







A distância “D” corresponde a real distância do objeto, como o sensor recebe a informação de distância de emissão e recepção, obtêm duas vezes a distância real, como a velocidade do som no ar a temperatura média de 25°C é de 340m/s, facilmente se obtém a relação de distância em milímetros através da equação:

Distância = Velocidade * Tempo  

2 * Distância = 340 * Tempo  

Distância = 170 * Tempo  

&nbsp; 

Todos estes cálculos são efetuados diretamente pelo sensor DYP-ME007 que ao final entrega no pino Echo um pulso ativo correspondente a distância real do objeto como mostra a figura abaixo:  

&nbsp; 

  

&nbsp; 

Para se transformar o tempo (us) retornado pelo sensor&nbsp; em distância(mm), basta dividir valor do tempo por 58.  

Este valor é obtido da seguinte relação:  

Um metro corresponte a um pulso de aproximadamente 5764us, transformando em cm temos 57,64cm que arredondamos para 58 para facilitar os cálculos no microcontrolador.  








Teste de funcionamento.




Este sensor possui quatro pinos de conexão sendo:

VCC – Alimentação de 5V (Consumo médio de 20ma)

GND – Alimentação GND 

Trigger- Pino para disparo de leitura (10ms)

Echo – Pino de retorno de informações referente a distância medida

Out – Este pino NÃO deverá ser conectado


Podemos detectar a largura de pulso do sensor de várias maneiras, porém a maneira mais elegante de se fazer isto com microcontroladores PIC, é utilizando o módulo CCP na função CAPTURE.

Para isto temos que conhecer um pouco mais sobre este módulo interno do microcontrolador. 

O módulo CCP utiliza os Timers internos do microcontrolador como base de tempo, neste caso específico do modo CCP que é o CAPTURE, é utilizado o TIMER1 incrementando a cada us. 

Desta forma quando o módulo CCP detecta a borda alta correspondente ao pino ECHO do sensor, ativa a contagem do TIMER,(incrementeado a cada us) e muda a configuração da borda de sensibilidade para baixa, aguardando assim o término do pulso referente a distância, com isto conseguimos saber qual o período do pulso entrege pelo sensor em já em us.

Após esta informação ser processada temos que alterar novamente a borda de sensibilidade para alta afin de estarmos prontos para uma nova informação proveniente so sensor.

Através do uso deste módulo, trabalhamos apenas com interrupções liberando o microcontrolador para outras tarefas tornando o programa mais eficiente.

 
Abaixo segue o programa exemplo da placa PK2Lab para uso com estes sensores.
/******************************************************************************
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JL Audio Manutenção Eletrônica
Data: 01/2012Autor: Jean CarlosProjeto: Sensor de distância DYP-ME007Microprocessador: PIC18F4550Clock do processador: 8MHzEstação de desenvolvimento: PK2Lab V 1.1Compilador: MikroC PRO V 4.60.0.0Versão atual:Descrição:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Este projeto demonstra o uso do sensor de distancia DYP-DM007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Com a placa PK2Lab, o valor referente a distância entre o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objeto e o sensor é exibido no display LCD.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Trigger -&gt; RC0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Echo&nbsp;&nbsp;&nbsp; -&gt; RC2 -&gt; Entrada do módulo CCP1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O resultado da captura é salvo em CCPR1H e CCPR1L
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Para efetuar este projeto, iremos configurar o TMR1 como contador&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sincrono,para ser incrementado pela fonte de clock externo que é&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o cristal de 8MHz conectado a placa PK2Lab(Sem PLL).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8MHz -&gt; (Fosc/4)2MHz -&gt; Prescaler 2:1 -&gt; 1MHz (1uS)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Para calcular a distancia em centimetros, usamos a formula abaixo:

*******************************************************************************/// Configuração do LCD da placa PK2Lab V.1.1
sbit LCD_RS at RB2_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;
//******************************************************************************// Definições e&nbsp; Variáveis Globais
#define Trigger RC0_bit
char txt[4];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Usado para conversão de dados em stringchar Tempo_H, Tempo_L, Distancia_cm;unsigned int Periodo;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Variável que armazena o período do Pulso ECHO
//******************************************************************************// Funções Auxiliares
void interrupt(){if(CCP1IF_bit &amp;&amp; CCP1CON.B0)&nbsp; // Captura por CCP1 e borda configurada como subida...{&nbsp; CCP1IF_bit&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Limpa a flag para nova captura&nbsp; CCP1IE_bit&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Desabilita interrupção por periféricos(CCP1)&nbsp; CCP1CON&nbsp;&nbsp;&nbsp;&nbsp; = 4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Configura a borda de captura para DESCIDA. (ESTE EVENTO CAUSARIA INTERRUPÇÃO ERRÔNEA)&nbsp; CCP1IE_bit&nbsp; = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Habilita interrupção por periféricos(CCP1)&nbsp; TMR1H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Zera registradores do TMR1 para contagem de tempo&nbsp; TMR1L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0;&nbsp; TMR1ON_bit&nbsp; = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Habilita contagem de tempo.}
else if(CCP1IF_bit)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CCP1IF_bit&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Limpa a flag para nova captura&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TMR1ON_bit&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Desabilita contagem de tempo.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CCP1IE_bit&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Desabilita interrupção por periféricos(CCP1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CCP1CON&nbsp;&nbsp;&nbsp;&nbsp; = 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Configura a borda de captura para SUBIDA. (ESTE EVENTO CAUSARIA INTERRUPÇÃO ERRÔNEA)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CCP1IE_bit&nbsp; = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Habilita interrupção por periféricos(CCP1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tempo_H&nbsp;&nbsp;&nbsp;&nbsp; = CCPR1H;&nbsp; // Carrega valores de tempo capturado(Neste caso em us)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tempo_L&nbsp;&nbsp;&nbsp;&nbsp; = CCPR1L;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
}
Pulso()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Gera o Pulso de trigger para o sensor ultra som.{Trigger = 1;Delay_us(10);Trigger = 0;}
//******************************************************************************//Rotina Principal
void main(){TRISC&nbsp; = 0b00000100;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Entrada CCP1PORTC&nbsp; = 0b00000000;INTCON = 0b11000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Liga interruptores GIE e PEIETMR1IE_bit = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Desabilita interrpções de TMR1CCP1IE_Bit = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Habilita interrupções por CAPTURA(CCP1)CCP1CON&nbsp;&nbsp;&nbsp; = 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Configura módulo CCP1 para CAPTURA e borda de SUBIDA.
T1CKPS1_bit = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Prescaller TMR1 2:1T1CKPS0_bit = 1;TMR1CS_bit&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Clock selecionado -&gt; OSC/4TMR1ON_bit&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Timer -&gt; 1 = Habilita contagem
Lcd_Init();Lcd_Cmd(_Lcd_Cursor_Off);Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"***&nbsp; PK2Lab&nbsp; ***");Lcd_Out(2,1,"Distancia:&nbsp;&nbsp;&nbsp; cm");Delay_ms(100);
while(1){Pulso();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Dispara leitura de distância.Delay_ms(100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Intervalo entre leituras.Periodo = (Tempo_H&lt;&lt;8)+ Tempo_L;&nbsp;&nbsp; // Obtenção do período relativo ao ECHODistancia_cm = Periodo/58;&nbsp;&nbsp;&nbsp; // Conversão da distância informada para cm
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------------------//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Um Pulso de 58us corresponde a uma distância de 1cm&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------------------//
// Distância MINIMA 3cm e MAXIMA 3m
if((Distancia_cm &lt; 3)||Distancia_cm &gt;300) Lcd_Out(2,12,"---");else&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; byteToStr(Distancia_cm, txt);&nbsp;&nbsp; // Converte texto para impressão&nbsp;&nbsp;&nbsp; Lcd_Out(2,12,txt);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Imprime valores no display&nbsp;&nbsp;&nbsp; }}}