Para qualquer projeto ganhar vida, precisamos usar sensores. Os sensores atuam como olhos e ouvidos para todas as aplicações embarcadas, ajudando o microcontrolador digital a entender o que está realmente acontecendo neste mundo analógico real. Neste tutorial, aprenderemos como fazer a interface do sensor ultrassônico HC-SR04 com o microcontrolador PIC.
O HC-SR04 é um sensor ultrassônico que pode ser usado para medir distâncias entre 2cm a 450cm (teoricamente). Este sensor provou ser útil ao se encaixar em muitos projetos que envolvem detecção de obstáculos, medição de distância, mapeamento de ambiente etc. No final deste artigo você aprenderá como este sensor funciona e como fazer a interface com o microcontrolador PIC16F877A para medir a distância e exibir na tela LCD. Parece interessante certo !! Então vamos começar…
Materiais requisitados:
- MCU PIC16F877A com configuração de programação
- Visor LCD 16 * 2
- Sensor ultrassônico (HC-SR04)
- Fios de conexão
Como funciona um sensor ultrassônico?
Antes de prosseguirmos, devemos saber como funciona um sensor ultrassônico para que possamos entender muito melhor este tutorial. O sensor ultrassônico usado neste projeto é mostrado abaixo.
Como você pode ver, ele tem dois olhos circulares como projeções e quatro pinos saindo dele. As duas projeções semelhantes a olhos são o transmissor e o receptor de onda ultrassônica (doravante denominada onda dos EUA). O transmissor emite uma onda dos EUA com uma frequência de 40 Hz, essa onda viaja pelo ar e é refletida de volta quando detecta um objeto. As ondas de retorno são observadas pelo receptor. Agora sabemos o tempo que leva para essa onda ser refletida e voltar e a velocidade da onda dos EUA também é universal (3400cm / s). Usando essas informações e as fórmulas do ensino médio abaixo, podemos calcular a distância percorrida.
Distância = Velocidade × Tempo
Agora que sabemos como funciona um sensor US, vamos ver como ele pode ser conectado a qualquer MCU / CPU usando os quatro pinos. Esses quatro pinos são Vcc, Trigger, Echo e Ground, respectivamente. O módulo funciona em + 5V e, portanto, o Vcc e o pino de aterramento são usados para alimentar o módulo. Os outros dois pinos são os pinos de E / S com os quais nos comunicamos com nosso MCU. O pino do gatilho deve ser declarado como um pino de saída e alto para 10µS, isso transmitirá a onda dos EUA para o ar como uma explosão sônica de 8 ciclos. Assim que a onda for observada, o pino Echo ficará alto pelo exato intervalo de tempo que a onda dos EUA levou para retornar ao módulo do sensor. Portanto, este pino de eco será declarado como entradae um cronômetro será usado para medir quanto tempo o pino ficou alto. Isso pode ser melhor compreendido pelo diagrama de tempo abaixo.
Espero que você tenha chegado a uma tentativa de fazer a interface deste sensor com o PIC. Estaremos usando o módulo Timer e o módulo LCD neste tutorial e suponho que você esteja familiarizado com ambos, se não, volte para o respectivo tutorial abaixo, uma vez que estarei pulando a maioria das informações relacionadas a ele.
- Interface LCD com microcontrolador PIC
- Compreendendo temporizadores no microcontrolador PIC
Diagrama de circuito:
O diagrama de circuito completo para a interface do Sensor Ultrassônico com PIC16F877A é mostrado abaixo:
Como mostrado, o circuito envolve nada mais do que um display LCD e o próprio sensor ultrassônico. O sensor US pode ser alimentado por + 5V e, portanto, é alimentado diretamente pelo regulador de tensão 7805. O sensor tem um pino de saída (pino do gatilho) que é conectado ao pino 34 (RB1) e o pino de entrada (pino do eco) é conectado ao pino 35 (RB2). A conexão de pino completa é ilustrada na tabela abaixo.
S.No: |
Número PIC PIC |
Nome do Pin |
Conectado a |
1 |
21 |
RD2 |
RS de LCD |
2 |
22 |
RD3 |
E de LCD |
3 |
27 |
RD4 |
D4 de LCD |
4 |
28 |
RD5 |
D5 de LCD |
5 |
29 |
RD6 |
D6 de LCD |
6 |
30 |
RD7 |
D7 de LCD |
7 |
34 |
RB1 |
Gatilho dos EUA |
8 |
35 |
RB2 |
Eco dos EUA |
Programando seu microcontrolador PIC:
O programa completo para este tutorial é fornecido no final desta página, mais abaixo eu expliquei o código em pequenos pedaços completos para você entender. Como dito anteriormente, o programa envolve o conceito de interface de LCD e Timer que não será explicado em detalhes neste tutorial, pois já os cobrimos nos tutoriais anteriores.
Dentro da função principal, começamos inicializando os pinos IO e outros registradores como de costume. Definimos os pinos IO para o sensor LCD e US e também iniciamos o registro do Timer 1 configurando-o para funcionar em 1: 4 pré-escalar e para usar o relógio interno (Fosc / 4)
TRISD = 0x00; // PORTD declarado como saída para interface LCD TRISB0 = 1; // Define o pino RB0 como entrada para usar como pino de interrupção TRISB1 = 0; // O pino do gatilho do sensor US é enviado como pino de saída TRISB2 = 1; // O pino de eco do sensor dos EUA é definido como pino de entrada TRISB3 = 0; // RB3 é o pino de saída do LED T1CON = 0x20; // 4 relógio pré-escalar e interno
O Timer 1 é um temporizador de 16 bits usado em PIC16F877A, o registro T1CON controla os parâmetros do módulo de temporizador e o resultado será armazenado em TMR1H e TMR1L, uma vez que é um resultado de 16 bits, os primeiros 8 serão armazenados em TMR1H e o próximos 8 em TMR1L. Este cronômetro pode ser ligado ou desligado usando TMR1ON = 0 e TMR1ON = 1 respectivamente.
Agora, o cronômetro está pronto para ser usado, mas temos que enviar as ondas US para fora do sensor, para fazer isso temos que manter o pino Trigger alto por 10uS, isso é feito pelo seguinte código.
Gatilho = 1; __delay_us (10); Gatilho = 0;
Conforme mostrado no diagrama de tempo acima, o pino Echo permanecerá baixo até o retorno da onda e então irá alto e permanecerá alto pelo tempo exato necessário para as ondas retornarem. Este tempo deve ser medido pelo módulo Timer 1, o que pode ser feito pela linha abaixo
enquanto (Eco == 0); TMR1ON = 1; enquanto (Eco == 1); TMR1ON = 0;
Uma vez que o tempo é medido, o valor resultante será salvo nos registros TMR1H e TMR1L, esses registros devem ser batidos para se reunir para obter o valor de 16 bits. Isso é feito usando a linha abaixo
time_taken = (TMR1L - (TMR1H << 8));
Este time_taken estará em bytes de formato, para obter o valor de tempo real, temos que usar a fórmula abaixo.
Tempo = (valor do registro de 16 bits) * (1 / Relógio interno) * (Pré-escala) Relógio interno = Fosc / 4 Onde em nosso caso, Fosc = 20000000Mhz e pré-escala = 4 Portanto, o valor do relógio interno será 5000000Mhz e o valor do tempo será Time = (valor do registro de 16 bits) * (1/5000000) * (4) = (valor do registro de 16 bits) * (4/5000000) = (valor do registro de 16 bits) * 0,0000008 segundos (OR) Tempo = (valor de registro de 16 bits) * 0,8 micro segundos
Em nosso programa o valor do registro de 16 bits é armazenado na variável time_taken e, portanto, a linha abaixo é usada para calcular o time_taken em micro segundos
time_taken = time_taken * 0.8;
Em seguida, temos que descobrir como calcular a distância. Como sabemos, distância = velocidade * tempo. Mas aqui o resultado deve ser dividido por 2, uma vez que a onda cobre tanto a distância de transmissão quanto a distância de recepção. A velocidade da onda (som) de nós é de 34000cm / s.
Distância = (Velocidade * Tempo) / 2 = (34000 * (valor de registro de 16 bits) * 0,0000008) / 2 Distância = (0,0272 * valor de registro de 16 bits) / 2
Portanto, a distância pode ser calculada em centímetros como abaixo:
distância = (0,0272 * time_taken) / 2;
Depois de calcular o valor da distância e do tempo gasto, simplesmente temos que exibi-los na tela LCD.
Medindo a distância usando PIC e Sensor Ultrassônico:
Depois de fazer as conexões e enviar o código, sua configuração experimental deve ser parecida com a mostrada na imagem abaixo.
A placa PIC Perf, mostrada nesta foto, foi feita para nossa série de tutoriais PIC, na qual aprendemos como usar o microcontrolador PIC. Você pode querer voltar para aqueles tutoriais de Microcontrolador PIC usando MPLABX e XC8 se você não souber como gravar um programa usando Pickit 3, já que estarei pulando todas essas informações básicas.
Agora coloque um objeto antes do sensor e ele deve mostrar a que distância o objeto está do sensor. Você também pode notar o tempo que leva sendo exibido em microssegundos para a onda transmitir e retornar.
Você pode mover o objeto em sua distância preferida e verificar o valor que é exibido no LCD. Consegui medir a distância de 2cm a 350cm com uma precisão de 0,5cm. Este é um resultado bastante satisfatório! Espero que você tenha gostado do tutorial e aprendido a fazer algo sozinho. Se você tiver alguma dúvida deixe-os na seção de comentários abaixo ou use os fóruns.
Verifique também a interface do sensor ultrassônico com outros microcontroladores:
- Medição de distância baseada em sensor ultrassônico e Arduino
- Meça a distância usando Raspberry Pi e Sensor Ultrassônico HCSR04
- Medição de distância usando HC-SR04 e microcontrolador AVR