Você está na página 1de 11

UNIVERSIDADE FEDERAL DE CAMPINA GRANDE

CENTRO DE CIÊNCIAS E TECNOLOGIA - CCT


DEPARTAMENTO DE ENGENHARIA ELÉTRICA
LABORATÓRIO DE ARQUITETURA DE SISTEMAS DIGITAIS
TURMA: 05

Projeto: Sensor de Ré

Josué Marcos Batista Fernandes


Matrícula: 113210657

Kaio Vitor Gonçalves de Freitas


Matrícula: 113210479

Campina Grande – PB
Abril de 2017

0
Sumário

Introdução.......................................................................................................2

Materiais utilizados.........................................................................................3

Recursos e periféricos utilizados.....................................................................3

Métodos...........................................................................................................3

Resultado.........................................................................................................4

Conclusão........................................................................................................7

Referências bibliográficas...............................................................................7

Anexo..............................................................................................................8

1
1- Introdução:

O sensor de distância é uma ferramenta muito útil em diversas aplicações, tais como:
Sensores de ré de automóveis (objeto de inspiração do projeto), corretores de rota de movimento
de máquinas, medição de nível de líquidos, detector de objetos, etc.

Neste trabalho foi utilizado o sensor ultrasônico HC-SR04, que possui 4 pinos: GND,
VCC, Echo e Trigger. Seu funcionamento consiste em enviar ondas ultra-sônicas de frequência
40 kHz (fora da faixa de frequência que o ser humano é capaz de escutar), após a onda encontrar
um obstáculo, volta para o sensor e a partir do tempo de envio e tempo de retorno, é calculada a
distância entre o sensor e o objeto.

Primeiro é enviado um sinal com duração de 10 microssegundos ao pino trigger, para


indicar o início de uma nova medição, em seguida o módulo envia automáticamente 8 pulsos de
40 kHz e o pino echo é setado para nível lógico alto, aguardando o retorno do sinal pelo
receptor, caso ocorra retorno, echo vai para nível lógico baixo e a distância é calculada a partir
da equação: distância = (tempo do pino echo em nível alto) x 340m/s (velocidade do som)/2, o
resultado é dividido por 2 pelo fato de o tempo contabilizar a ida e a volta.

Figura 1 – Funcionamento do HC-SR04

Para o cálculo da distância feito no projeto, foram utilizadas recomendações do


fabricante encontradas no datasheet do sensor, como um intervalo de 60 ms para realizar uma
nova medição e a distância encontrada em cm, fazendo distância (em cm) = tempo de echo em
nível lógico alto ( em microssegundos) * 0.017.

2
2- Materiais utilizados:
 Dois sensores ultrassônicos (HC-SR04),
 LCD 16x2 com potenciômetro (para ajuste do contraste),
 PIC 16F877A,
 3 LEDs,
 2 capacitores de 20pF,
 Cristal de 16MHz,
 2 resistores de 1k Ω (um como limitador de corrente do LED vermelho e outro como
resistor de pull-up) e 2 resistores de 470Ω (limitadores da corrente nos LEDs verde e
amarelo),
 Jumpers.

3- Recursos e periféricos do PIC utilizados:


 GPIO (General Purpose In-Out),
 Timer 1,
 Timer 2,
 Interrupção do timer 2,
 Interrupção externa no pino B0,
 Interrupção por any change on port B, usando o pino B4,
 Interrupção do RS232 (porta serial).

4- Métodos:

Na aba interrupts do wizard, foi ativada a interrupção por qualquer mudança na porta B,
sendo necessário aterrar os pinos B5, B6 e B7 para que a mudança ocorra apenas no pino B4,
que foi ligado ao pino Echo do primeiro sensor ultrassônico. Ao entrar na interrupção, um flag
teve seu nível lógico mudado para 1 enquanto o Echo recebia a onda ultrassônica do Trigger,
voltando para zero apenas na main, e foi usado o timer 1 para a contagem do tempo em
microssegundos para se fazer o cálculo da distância, iniciando a contagem assim que o Echo era
setado e desabilitando-o quando o Echo ia para zero, para se ter um tempo preciso, em micro
segundos, de ida e volta da onda ultrassônica.

O timer 1 possui 16 bits, foi configurado para uma resolução de 2µs e período de
overflow de 131ms (65535*2µs= 131ms). Logo, a distância máxima que poderia ser encontrada
usando o timer 1 na interrupção do pino ECHO seria de 0.017*131ms= 2227cm. Uma vez que o
alcance máximo do sensor ultrassônico é de 4m, não há nenhuma preocupação em usá-lo.

Para o segundo sensor, utilizou-se uma interrupção externa, ligando o pino Echo no
pino B0 do PIC utilizado. Apesar do processo ser semelhante ao do outro sensor, o uso do timer
2 para a contagem do tempo fez com que fosse necessária uma interrupção periódica para a
contagem de quantos overflows tinham acontecido no timer enquanto o pino Echo estava em
nível lógico alto.

3
O timer 2 possui 8 bits, foi configurado para resolução de 4µs e contagem até 249,
tendo, assim, um período de overflow de 249*4µs= 996µs. Portanto, a distância máxima que
poderia ser calculada por ele seria de 0.017*996µs= 16,9cm, sendo muito baixa para a aplicação
de sensor de ré. A interrupção periódica dele atribuía valores à variável “cont”, que era
multiplicado a 249 e somada ao valor atual do timer na interrupção externa, sendo esse valor
atribuído à uma variável auxiliar que ainda era multiplicada por 4 (por conta da resolução), para
se ter o tempo em microssegundos. Após uma medida da distância, a variável “cont” era zerada
na própria interrupção externa.

Foram usadas condições para ligar o LED vermelho ou verde, que sinalizam se há um
objeto mais próximo da esquerda ou da direita, a partir do valor da distância de cada sensor
encontrado.

Além disso, os LEDs só acendem a uma distância default máxima de 10cm, podendo
ser modificada por qualquer valor escrito na porta serial. Ao mandar qualquer dado pela serial,
inicia-se a interrupção do RS232 em que todos os valores entre 2 (menor valor em centímetros
capturado pelo sensor) e 49, que são enviados em hexa, sejam interpretados como decimal a
partir de uma conversão feita na interrupção. Ao se colocar um valor maior do que o esperado
(49), é setado um LED amarelo que simboliza a volta ao valor default de distância máxima.
Todos esse valores podem ser modificados e vistos no Serial Port Monitor do compilador PCW.

Para o uso da porta serial, foi utilizada a USB virtual com os pinos TX e RX de uma
placa de arduíno, como será explicado mais a frente.

5- Resultados:

A distância pôde ser calculada com precisão a partir da medição do tempo em que o
pino echo permaneceu em nível lógico alto, os resultados foram testados utilizando-se uma
régua. Cada um dos dois sensores utilizados teve seus respectivos tempos calculados utilizando
diferentes timers: O timer1 e o timer2, e como pôde ser visto nos testes, não houve qualquer
influência das contagens de tempo de um sensor em outro. Foi verificada uma interferência
quando ambos os sensores foram dispostos no mesmo sentido, provocando variações
equivocadas nas medições, para solucionar este contratempo, a ligação dos sensores foi feita de
modo que ficassem postos em direções opostas, o que acabou por trazer um maior sentido físico
para o projeto, possibilitando medição de distância com relação ao lado direito e ao lado
esquerdo.

4
Figura 2 – Medição de duas distâncias, feita simultaneamente

A utilização de uma variável de contagem na interrupção do timer2 para contornar o


problema de overflow, que ocorria pelo fato de o timer2 ter apenas 8 bits e medir uma distância
de aproximadamente 16,9 cm, se mostrou eficiente, tendo em vista que os micro segundos de
atraso que apareciam caso o timer estourasse resultaram em um tempo muito curto comparado
com o tempo total, e como foi comprovado experimentalmente, não houve perda de acurácia.

Figura 3 – Medição de uma distância de 18 cm utilizando o timer 2

O algoritmo utilizado para a conversão do número em hexadecimal recebido pela porta


serial, para decimal (base que o usuário deve inserir e visualizar os dados como resposta) se
mostrou eficiente, pois, como o objetivo era definir uma distância mínima para que o sensor
desse uma resposta (acender um LED), a precisão está entre 2cm e 400 cm, e o algoritmo pode
ser implementado até 99cm de distância mínima (aproximadamente 1 m), é possível fazer uma
calibragem aceitável. O intervalo de 0 a 49 cm foi satisfatório para o teste e mostrou uma ótima
resposta.

5
Figura 4 – Dado enviado pela porta serial (maior que 49)

Figura 5 – Resposta do LED amarelo para um valor inserido maior que 49

Não foi possível utilizar o buzzer como sinalizador, juntamente com os LEDs, pois, o
constante desligamento seguido de religamento do timer2 (que define a frequência do PWM nos
pinos CCP1 e CCP2) durante a interrupção externa, fazia com que o sinal PWM que chegasse
no buzzer fosse de duração muito curta, tornando o som de sinalização imperceptível, isso fez
com que o alerta de distância mínima atingida fosse feito apenas pelos LEDs vermelho e verde.

Foi possível realizar a gravação do código no PIC de maneira mais prática quando
passou a ser utilizado o software Bootloader, pois, todas as ligações feitas na protoboard
dificultavam a retirada do PIC para nova gravação. Ao fazermos uso da placa do Arduíno (Foi
feita a retirada do CI AT MEGA 328P - PU, para liberação dos pinos), foi possível realizar:
Alimentação do circuito, gravação do código no PIC através do Bootloader e comunicação
serial, de uma maneira rápida e eficiente.

6
Figura 6 - Placa Arduino utilizada

6- Conclusão

Foi verificado que é possível realizar medições simultâneas de distância utilizando


sensores ultrasônicos e diferentes recursos do PIC, tais como: Interrupções, timers, etc. As
dificuldades e singularidades encontradas puderam ser contornadas utilizando técnicas e
lógicas de programação, e, otimizações na construção do projeto puderam ser feitas
utilizando recursos externos, que não foram expostos em sala.

7- Referências bibliográficas

http://buildbot.com.br/blog/como-utilizar-o-sensor-ultrasonico-hc-sr04/

7
8- Anexo:

#include "C:\Users\Margarene\Desktop\ufcg\projeto\projeto.h"
#include "LCD_16x2_Lib.c"
long int value= 0, tus= 0, distancia1= 0, duty= 0, cont= 0, value2=
0, tus2= 0, distancia2= 0, new= 10, val;
short flag1= 0, flag2= 0;

#int_RDA
RDA_isr()
{
val= getch();
if(val <= 9)
{
new= val;
output_low(pin_b1);
}
else if(val > 9 && val <= 27)
{
new= val - 6;
output_low(pin_b1);
}
else if(val > 27 && val <= 41)
{
new= val - 12;
output_low(pin_b1);
}
else if(val > 41 && val <= 57)
{
new= val - 18;
output_low(pin_b1);
}
else if(val > 57 && val <= 73)
{
new= val - 24;
output_low(pin_b1);
}
else
{
new= 10;
output_high(pin_b1);
}

printf("\fValor registrado= %ld\n", new);


}

#int_TIMER2
TIMER2_isr()
{
cont= cont+1;
}

#int_EXT
EXT_isr()
{
set_timer2(0);
while(input(pin_b0))

8
{
setup_timer_2(T2_DIV_BY_16,249,1);
flag1= 1;
}

setup_timer_2(T2_DISABLED,249,1);
value= (249*(cont)) + get_timer2();
cont= 0;
tus= (value*4);
distancia1= (tus*0.017);
}
#int_RB
RB_isr()
{
set_timer1(0);

while(input(pin_b4))
{
flag2=1;
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
}

setup_timer_1(T1_DISABLED);
value2=get_timer1();
tus2=(value2*2);
distancia2=(tus2*0.017);
}

void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_ccp2(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_pwm2_duty(0);
enable_interrupts(INT_EXT);
enable_interrupts(INT_CCP1);
ext_int_edge(L_TO_H);
enable_interrupts(INT_TIMER2);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
ini_lcd_16x2();

while(1)
{
output_high(pin_a1);
delay_us(10);
output_low(pin_a1);

if(!flag1)
{
delay_ms(60);
}

9
output_high(pin_a0);
delay_us(10);
output_low(pin_a0);

if(!flag2)
{
delay_ms(60);
}

printf(exibe_lcd, "\fDistancia1=%ldcm \ndistancia2=%ldcm",


distancia1 distancia2);
flag1= 0;
flag2= 0;

if(distancia1 <= new || distancia2 <= new)


{
if(distancia1<distancia2)
{
output_high(pin_b2);
output_low(pin_b3);
}
else
{
output_high(pin_b3);
output_low(pin_b2);
}
}
else
{
output_low(pin_b3);
output_low(pin_b2);
}

}
}

10

Você também pode gostar