relatório final

12
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

Upload: marcus-vinicius-fonseca

Post on 29-Nov-2014

176 views

Category:

Engineering


0 download

DESCRIPTION

Sensor ultrassonico HC-SR04

TRANSCRIPT

Page 1: Relatório final

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

Page 2: Relatório final

Sumário

1 Introdução ............................................................................. Erro! Indicador não definido.

2 Desenvolvimento .................................................................. Erro! Indicador não definido.

3 CONCLUSÕES ................................................................................................................ 5

4 BIBLIOGRAFIA .............................................................................................................. 5

Page 3: Relatório final

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]

Page 4: Relatório final

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

Page 5: Relatório final

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

Page 6: Relatório final

Anexo I

Page 7: Relatório final

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;

Page 8: Relatório final

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

Page 9: Relatório final

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

Page 10: Relatório final

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

Page 11: Relatório final

}

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

Page 12: Relatório final

}

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

}

}