Relatório final

411 visualizações

Publicada em

Sensor ultrassonico HC-SR04

Publicada em: Engenharia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Relatório final

  1. 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. 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. 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. 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. 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
  6. 6. Anexo I
  7. 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. 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
  9. 9. // 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;
  10. 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. 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. 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; } }

×