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;
}
}

Relatório final

  • 1.
    UNIVERSIDADE FEDERAL DESÃ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! Indicadornão definido. 2 Desenvolvimento ..................................................................Erro! Indicador não definido. 3 CONCLUSÕES ................................................................................................................5 4 BIBLIOGRAFIA ..............................................................................................................5
  • 3.
    1 INTRODUÇÃO Como pré-requisitopara 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 desenvolvidafoi, 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 oprocesso 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
  • 6.
  • 7.
    Rotina do arquivomain.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; intdist_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
  • 9.
    // Escreve astring 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;
  • 10.
    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
  • 11.
    } }//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
  • 12.
    } #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; } }