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
Sumário
1 Introdução ............................................................................. Erro! Indicador não definido.
2 Desenvolvimento .................................................................. Erro! Indicador não definido.
3 CONCLUSÕES ................................................................................................................ 5
4 BIBLIOGRAFIA .............................................................................................................. 5
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]
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
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
Anexo I
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;
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
// Escreve a string da "ROM" no display LCD
// Laço infinito
cont_vel = 0;
while(1)
{
PORTBbits.RB0 = 1;
Delay10ms();
PORTBbits.RB0 = 0;
if (~cont_vel)
{
cont_vel = 1;
OpenTimer0 (TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256);
OpenTimer1 ( TIMER_INT_OFF & T1_16BIT_RW & T1_SOURCE_INT &
T1_PS_1_8 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF);
}
else
{
OpenTimer0 ( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256);
temp_vel = ReadTimer1();
cont_vel = 0;
}
while (~PORTBbits.RB1)
{
Nop();
}
temp_dist = ReadTimer0();
//dist_atual = temp_dist * f_conver_cm;
dist_vel = dist_atual - dist_anterior;
vel = (dist_vel)* 1000 / f_conver_ms;//cm/s
SetDDRamAddr (0x00);
putrsXLCD("D");
if (dist_atual < 100)
{
putrsXLCD(" ");
}
putIntXLCD(dist_atual);
SetDDRamAddr(0x07);
putrsXLCD("c");
putrsXLCD("m");
SetDDRamAddr (0x40);
putrsXLCD("V");
if (vel < 100)
{
putrsXLCD(" ");
}
putIntXLCD(vel);
SetDDRamAddr(0x45);
putrsXLCD("c");
putrsXLCD("m");
putrsXLCD("/");
putrsXLCD("s");
dist_anterior = dist_atual;
Delay10KTCYx(72);
WriteCmdXLCD(0b00000001); // Clear display
}
}//end main
void ConfiguraSistema (void)
{
TRISBbits.TRISB0 = 0; // TRIS PARA RB0 -> SAÍDA
TRISBbits.TRISB1 = 1; //TRIS PARA RB1 -> ENTRADA
RCONbits.IPEN = 0;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
INTCONbits.TMR0IE = 1;
TMR0H = 0;
TMR0L = 0;
//Configura os pinos que são usados pelo LCD 16x2 alfa-numerico
OpenXLCD();
}//end ConfiguraSistema
#pragma interrupt inter
#pragma code inter = 0x08
void inter (void)
{
_asm
GOTO tempo
_endasm
}
#pragma code
void tempo (void)
{
PIR1bits.TMR1IF = 0;
if (INTCONbits.TMR0IF)
{
WriteCmdXLCD(0b00000001);
SetDDRamAddr (0x00);
putrsXLCD("FORA DE");
SetDDRamAddr (0x41);
putrsXLCD("ALCANCE");
INTCONbits.TMR0IF = 0;
}
}
Top Related