1. O documento descreve um projeto de implementação de interface entre o sensor de distância ultrassônico HC-SR04 e o microcontrolador PIC 18F4550.
2. O sensor mede a distância entre o alvo e o sensor usando pulsos ultrassônicos, e a interface calcula a distância e velocidade com base nos tempos de pulso.
3. Embora o protótipo tenha sido construído, problemas no cabo do LCD e na porta RB0 impediram que fosse totalmente testado.
1. UNIVERSIDADE FEDERAL DE SÃO JOÃO DEL-REI
CURSO DE ENGENHARIA INDUSTRIAL ELÉTRICA
MARCUS VINÍCIUS DA FONSECA
AMANDA BOTELHO AMARAL
JÚLIO CÉSAR MAGALHÃES FREITAS
IMPLEMENTAÇÃO DE INTERFACE ENTRE O SENSOR DE
DISTÂNCIA ULTRASÔNICO HC-SR04 E O
MICROCONTROLADOR PIC ® 18F4550
São João del-Rei
2013
2. Sumário
1 Introdução.............................................................................Erro! Indicador não definido.
2 Desenvolvimento ..................................................................Erro! Indicador não definido.
3 CONCLUSÕES ................................................................................................................5
4 BIBLIOGRAFIA ..............................................................................................................5
3. 1 INTRODUÇÃO
Como pré-requisito para aprovação, fomos solicitados pelo Professor Davidson
Lafitte Firmo, implementarmos um projeto utilizando o microcontrolador PIC 18F4550.
Foi escolhido, para tal fim, o desenvolvimento de um Sensor Ultrassônico da Distância,
utilizando o shield HC-SR04. O protótipo foi desenvolvido através de programação no
MPLab IDE , utilizando as bibliotecas de exemplo para implementação do LCD 8X2.
O HC-SR04 necessita, para sua correta operação, de um pulso na porta trigger em
TTL 5V, com duração de 10 ms, enviando para o microcontrolador, através do pino
echo um pulso. A medida da distância, em centímetros, entre o sensor e o anteparo é
medida pela relação entre o envio do pulso na porta trigger e o retorno na porta echo,
da seguinte forma:
[1]
2 DESENVOLVIMENTO
Por se tratar de um projeto relativamente simples, optamos pela implementação em PCB,
com acabamento e alimentação por bateria. O projeto iniciou-se pela confecção do programa,
utilizando a IDE MPLAB®.
Optamos por utilizar as preconfigurações do Timer0 e do Timer1, disponibilizadas no
arquivo MPLAB C18 C Compiler Libraries. Desta forma, utilizamos o Timer0 para a contagem do
tempo entre o pulso e o eco, e o Timer1 para a contagem do tempo entre duas medições
consecutivas, para o cálculo da velocidade.
Desta forma a distância è calculada pela fórmula [1] e a velocidade é calculada pela
fórmula:
[2]
O valor de é calculado com base no fato de que o Prescaler definido
foi de 1:4, ou seja, o timer avança 1 bit para cada quatro clocks do microcontrolador, e cada
clock do controlador é de 83,33 ns, logo:
[3]
4. A rotina desenvolvida foi, então, simulada no ISIS®, tendo em vista simular o
funcionamento do protótipo completo, assim como ser o único software com modelo de
simulação do sensor HC-SR04.
Figura 1 Esquemático do projeto
Após concluído o processo de simulação do funcionamento do sensor, desenvolveu-se,
então o protótipo físico, através da utilização do software ARES® para a confecção da PCB.
Figura 2 Estampa da PCB
5. Iniciamos, portanto o processo de implementação física do protótipo. Durante esta fase,
identificamos que a porta RB0 não estava enviando o pulso, conforme deveria ocorrer, após
exaustivas tentativas no código, identificamos que a falha ocorria devido à declaração do
registrador “ADEN = OFF”, problema que não tínhamos como prever uma vez que o registrador
tem como função, simplesmente, a desabilitação das portas do conversor A/D.
3 CONCLUSÕES
Finalmente, o trabalho apresentado foi uma grande oportunidade de
expandirmos nossos conhecimentos acerca da programação de microcontroladores
PIC. Apesar de ser um projeto de baixa complexidade, alguns imprevistos durante o
desenvolvimento e a falta de conhecimento acerca das rotinas disponibilizadas
trouxe como impacto um grande atraso, o qual não foi possível sanar. Apesar dos
impasses, o protótipo foi fisicamente montado e preparado, entretanto, não foi
possível sua verificação, uma vez que ocorreram imprevistos relacionados com o
cabeamento do LCD, assim como aquele apresentado, relativo à porta RB0.
Em conclusão, apesar de o protótipo não ter funcionado conforme esperado, os
conhecimentos adquiridos serão levados, assim como os erros que se apresentaram,
serão mitigados e deles levaremos o aprendizado.
No Anexo I é apresentada a rotina utilizada na programação do PIC 18F4550.
4 BIBLIOGRAFIA
Data Sheet (2006), PIC18F2455/2550/4455/4550. MicroshipTechnology Inc .DS39632C;
Data Sheet ,Ultrasonic Ranging Module HC – SR04.ELEC Freaks ;
Data Sheet (2013), LM78XX/LM78XXA.Fairchild Semiconductor .Rev. 1.3.0
http://www.microchip.com/forums/f57.aspx, acessado nos dias (02, 03, 07, 11, 18,
21/11/2013,3, 11, 15, 16, 17, 19 e 20/12/2013);
hlpC18Lib.chm, hlpPIC18ConfigSet.chm – Arquivos de Ajuda do compilador C18®, acesso
nos dias 10, 11, 13, 15, 17 e 19/12/2013;
MPLAB C18 C Compiler Getting Started . (2005), MicroshipTechnology Inc. DS51295F
MPLAB C18 C Compiler Libraries (2005), MicroshipTechnology Inc. DS51297F
MGD080B-FL-YBS – Specifications for Liquid Crystal, 2005
7. Rotina do arquivo main.c
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include "my_xlcd.h"
#include <delays.h>
#include <timers.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#pragma config FOSC = HSPLL_HS //HABILITA O MODO HS PARA O XTAL (20 MHZ)
#pragma config PLLDIV = 5 // CONFIGURA PLL CONFORME PG 30 DATASHEET
#pragma config MCLRE = OFF // POSSIBILITA O USO DA RE3
#pragma config PWRT = OFF //POWER UP TIMER
/** V A R I A V E I S G L O B A I S ****************************************/
int cont_vel = 0; // contador para cálculo da velocidade (tempo)
int long temp_vel = 0; //
int long temp_dist = 0;
int long dist_atual = 0;
int long dist_anterior = 0;
int long dist_vel = 0;
const int f_conver_cm = 0.02289;//174 pulsos = 1cm, com PS = 4, 4/174 = x cm
const int f_conver_ms = 0.3333;//1 tic = 4*83,33ns
int vel = 0;
int vel_1;
8. int vel_2;
int vel_3;
int dist_atual_1 = 0;
int dist_atual_2 = 0;
// armazena variavel na memória de dados (SDRAM)
// outro tipo sintaxe C para inicializar a variável na DECLARAÇÃO
//rom unsigned char linha2[20]="=60";
/** P R O T O T I P O S P R I V A D O S ***********************************/
void ConfiguraSistema(void);
void tempo(void);
void inter(void);
void Delay10ms (void)
{
Delay10KTCYx(13);
}
void main(void)
{
// Configura as portas e periféricos usados no projeto
ConfiguraSistema();
// Seleciona o endereço inicial da linha 1 (0x00) do display