

O maior inimigo do conhecimento não é a ignorância, mas sim a ilusão de que conhecemos. (Stephen Hawking)

ULTRASONIC PIC
Introdução.
As ondas de ultrassom não estão apenas presentes em aparelhos médicos como imaginamos. Hoje estas ondas são aplicadas a projetos tão frequentemente a ponto de podermos usá-las facilmente. Os sensores de ultrassom utilizados em projetos como esse que vamos abordar são os responsáveis por fazerem leituras de distâncias de um objeto a sua frente. Nesta aula você vai conhecer um pouco sobre esse componente tão importante como também conhecer como ele atua e aprender a programar dentro do PIC para aplicação em seus projetos. Para amostra dos dados vamos estar utilizando um LCD 16x02. Vamos começar!
O sensor ultrassônico.
O sensor ultrassonico é um tipo de sensor que utiliza as ondas de ultrassom para detectar a distância de um objeto a sua frente por meio de cálculos. O módulo que estamos utilizando para essa aula é o sensor HC-SR04 da figura abaixo.
Segundo alguns sites de compra destes produtos, este sensor possui um alcance de leitura de até 4 metros considerando também a precisão dos cálculos feitos. Neste sensor temos o pino VCC que é o pino de alimentação, o pino Trig que é um pino de entrada de pulsos, o pino Echo que é o pino de saída de pulsos e o pino GND que é o terra do nosso sensor.
Como utilizar o módulo.
A utilização do módulo não é tão simples assim, pois temos que a passagem dos dados não é nada pronta como temos na transferência serial RS-232 pelos pinos Rx e Tx. Portanto alguns procedimentos devem ser feitos para que possamos adquirir os dados.
1. Fornecer um sinal alto (bit 1) no pino Trig
2. Manter o sinal alto por pelo menos 10us
3. Fornecer um sinal baixo (bit 0) no pino Trig (Neste momento o módulo automaticamente irá enviar um sinal de 40Khz)
4. Aguarde uma borda de subida (0 para 1) no pino Echo
5. Comece a contar o tempo
6. Aguarde até ocorrer uma borda de descida (1 para 0) no pino Echo
7. Pare a contagem do tempo
8. Pronto! A contagem que você fez é o tempo que o ultrassom levou para ecoar no objeto e voltar, agora basta calcular a distância!
O cálculo da distância pode ser obtido de duas formas, em centímetro ou em polegadas. Para obter o valor em centímetro utilizamos o seguinte cálculo:
(Tempo)/29/2
Para adquirir o valor em polegadas utilizamos o seguinte cálculo:
(Tempo)/74/2
Tempo é o valor que é obtido após a contagem do intervalo de trabalho do sensor.
Considerações para o PIC.
Como vimos anteriormente, há de se contar o tempo de trabalho do sensor, então como podemos fazer isto? A solução mais viável é utilizar o Timer 1 trabalhando com alguns comandos. São eles:
Set_timer1(): Indicamos em que valor começará a contagem.
get_timer1(): Obtemos o valor do registro do Timer 1.
Com essas duas funções podemos obter o tempo de trabalho do sensor e calcular a nossa distância com base nos valores obtidos.
Por isso faz-se necessário que se habilite o Timer 1 para o PIC.
Interface e programação para o PIC.
Vamos usar os pinos A0 e A1 para gerenciar os pinos do sensor. Nossas ligações ficarão assim:
Para a programação vamos ter que configurar o PIC e habilitar o Timer 1. Perceba que é somente para habilitar o Timer 1 e NÃO PARA ACIONAR INTERRUPÇÕES. Portanto vá na aba Timers e habilite o Timer1.
Nossa programação fica assim:
//Configurações do LCD.
#define LCD_DATA_PORT getenv("SFR:PORTB")
#define LCD_ENABLE_PIN PIN_B2
#define LCD_RS_PIN PIN_B0
#define LCD_RW_PIN PIN_B1
#define LCD_DATA0 PIN_B4
#define LCD_DATA1 PIN_B5
#define LCD_DATA2 PIN_B6
#define LCD_DATA3 PIN_B7
#define LCD_TYPE 2
#include <lcd.c>
//Atribuições de números a palavras para serem usadas no código:
#define CM 1
#define POL 0
//Atribuições de pinos a palavras para serem usadas no código:
#define TRIG PIN_A0
#define ECHO PIN_A1
float get_distance(int8); //Declaração do protótipo da função.
//Definições de variáveis:
Int16 Time;
float Distance;
//Inicio do Programa:
void main()
{
float distancia; //Definição de variável local
// Aqui fica as configurações do PIC feitas no PIC Wizard do CCS.
lcd_init(); //Inicialização do LCD
lcd_putc("\f"); //Limpa o buffer do display
While(TRUE)
{
distancia = get_distance(CM); //Chama a função get_distance()
lcd_putc("\f"); //Limpa o buffer do display
printf(lcd_putc, "%f", distancia); //Mostra os dados no LCD.
Delay_ms(300); //Espera 300ms
}
}
//Função get_distance()
float get_distance(int8 unit)
{
Output_high(TRIG); //Envia nivel alto para o pino TRIG
Delay_us(10); //Espera 10us
Output_low(TRIG); //Envia nível baixo para o pino TRIG
While(!input(ECHO)){ } //Aguarda uma borda de subida (0 para 1) no
//pino ECHO
set_timer1(0); //Começa a contar o tempo.
While(input(ECHO)) { } //Aguarda uma borda de descida (1 para 0) no
//pino ECHO
Time = get_timer1(); //Simula a parada do tempo do Timer 1
if(unit) //Se for selecionado CM
{
Distance = Time/29/2; //Calcula distancia
return Distance; //Retorna o valor em centimetros.
}
if(!unit) //Se for selecionado POL
{
Distance = Time/74/2; //Calcula distancia
return Distance; //Retorna o valor em polegadas.
}
}
Pronto galera, é simples assim! Compile e grave o código no PIC e execute na real o seu programa. Bons estudos.


