Professional Documents
Culture Documents
RECIFE,
28 DE JULHO DE 2010
UNIVERSIDADE FEDERAL DE PERNAMBUCO
CENTRO DE TECNOLOGIA E GEOCIÊNCIAS
CURSO DE ENGENHARIA ELETRÔNICA
TRABALHO DE GRADUAÇÃO
RECIFE,
28 DE JULHO DE 2010
Pedro Filipe Leite Correia de Toledo
Pedro Lyra Pereira Cabral
BANCA EXAMINADORA
___________________________________________________________________
Professor João Paulo Cerquinho Cajueiro – Universidade Federal de Pernambuco
___________________________________________________________________
Professor Mauro Rodrigues dos Santos – Universidade Federal de Pernambuco
___________________________________________________________________
Professor Tomaz de Carvalho Barros – Universidade Federal de Pernambuco
DEDICATÓRIA
Eu dedico este trabalho a toda minha família e amigos, em especial a minha avó Edite Leite
da Silva (in memoriam)
Pedro Toledo
Dedico este trabalho a meus queridos pais e irmãs, que sempre me apoiaram nesta longa
empreitada da graduação
Pedro Cabral
“Probabilitas enim est gradus certitudinis, et ab hac differt ut pars à toto."
Jacob Bernoulli
RESUMO
1 INTRODUÇÃO ..................................................................................................................... 10
2 OBJETIVO ............................................................................................................................ 11
5 MICROCONTROLADOR .................................................................................................... 22
5.2 Histórico.......................................................................................................................... 22
6 PERIFÉRICOS ...................................................................................................................... 25
7 ALGORITMO ....................................................................................................................... 37
7.1.1 Fluxograma............................................................................................................... 38
7.2.1 Fluxograma............................................................................................................... 40
10 CONCLUSÃO ..................................................................................................................... 49
REFERÊNCIAS ....................................................................................................................... 50
1 INTRODUÇÃO
Nos dias de hoje a eletrônica está cada vez mais presente no cotidiano. Um dos objeti-
vos da engenharia é desenvolver aplicações tecnológicas que possam tornar a vida das pessoas
mais confortável.
Apesar de ser uma tecnologia já existente no mercado, foi desenvolvido um interruptor
de palmas. É muito prático, por exemplo, ao chegar em casa simplesmente acender as luzes
com o bater de palmas. Também é útil quando se está deitado e deseja-se apagar as luzes.
Para isto foi desenvolvido um circuito completo com diversas etapas analógicas e digi-
tais que tem por objetivo processar o sinal sonoro das palmas e com isso ativar o interruptor.
11
2 OBJETIVO
O objetivo básico do projeto é detectar o som do bater de palmas das mãos e com isso
ativar uma lâmpada.
O primeiro objetivo é desenvolver um sensor que com duas palmas acenda uma luz e
com uma única palma apague-a. Outro ponto crucial do projeto é a ampliação do mesmo para
que ao toque de uma sequência de palmas o interruptor seja ativado.
É um requisito do projeto a utilização do microcontrolador PIC 16F877A, por ser o
disponível para uso.
12
Para reconhecer o som da palma é necessário um transdutor que converta o sinal me-
cânico do som em um sinal elétrico, ou seja, um microfone. Em seguida uma interface para
digitalizar o sinal.
São necessários vários estágios para realizar esta função. Inicialmente há um microfo-
ne que faz a conversão entre o sinal mecânico do som e um sinal elétrico. Em seguida um
filtro ativo passa-altas depois há um capacitor de acoplamento e um circuito LM555 ligado
como monoestável. Na saída do LM 555 é colocado um filtro passa-baixas.
Para captar o sinal sonoro é utilizado um microfone. Ele capta a vibração do ar provo-
cado pelo som, transformando essa vibração mecânica em impulsos elétricos, produzindo on-
das de mesma frequência que o som que a gerou.
O microfone converte vibrações mecânicas na faixa audível (em frequências de 20 Hz
a 20 kHz - seja no ar, água ou num material sólido) em um sinal elétrico. Na maioria dos mi-
crofones em uso as ondas sonoras são convertidas em vibrações mecânicas através de um dia-
fragma (palavra oriunda do grego diáphragma, significa literalmente barreira, separação) fino
e flexível e em seguida convertidas em sinal elétrico. Serão brevemente analisados aqui al-
guns dos tipos mais comuns de microfone: carvão, cristal, condensador, eletreto e dinâmico.
O microfone de carvão possui um grande número de grânulos de carvão dentro de pe-
queno invólucro. Quando esses grânulos são comprimidos, sua resistência é baixa e quando
14
são soltos, sua resistência é alta, o que faz com que a resistência varie quando ondas sonoras
atingem o diafragma.
O microfone de carvão é um exemplo de transdutor passivo pois não pode produzir
uma tensão de saída por si mesmo. É necessário ter uma fonte de tensão contínua para obter
corrente através de R. Essa corrente é necessária para produzir a tensão de áudio.
Como se deseja que o circuito atue quando houver uma palma, mas não quando hou-
ver uma voz muito alta, um filtro que separe um sinal do outro foi implementado. Dado que a
voz humana se concentra em baixas frequências, enquanto que uma palma pode ser aproxi-
mada por um delta de Dirac e, portanto, tem componentes em todas as frequências, um filtro
passa-altas deve atenuar a voz e deixar passar apenas as palmas.
É o utilizado o circuito com amplificador operacional, mostrado na Figura 10.
E a frequência de corte
O circuito 555 é extremamente popular e encontra diversas aplicações. Ele pode ser
utilizado em geração de pulsos, temporização sequencial, atraso de tempo, modulação de lar-
gura de pulso (PWM) e geração de rampa linear.
O CI 555 pode ser conectado de diversas maneiras. No caso escolheu-se a ligação co-
mo monoestável para detectar quando ocorreu uma palma.
O multivibrador monoestável ou one-shot é uma variação do flip-flop, que é um mul-
tivibrador biestável, no qual uma das saídas está capacitivamente acoplada a uma das entra-
das. Assim o circuito permanece em um estado, sendo forçado a outro estado por um pulso
momentâneo. Ele retorna ao estado inicial após certo tempo determinado pelo valor do resis-
tor e capacitor.
Neste modo de operação o timer funciona como um one-shot. O capacitor externo está
inicialmente descarregado. Após a aplicação de um pulso trigger negativo de menos de um
⅓VCC (Pino 2) o flip-flop é ativado e capacitor começa a ser carregado.
A voltagem no capacitor cresce exponencialmente por um período T=1,1.R1.C1, até
que a voltagem se iguala a ⅔VCC. O comparador do threshold então reseta o flip-flop, o qual
descarrega o capacitor a partir do transistor do pino e leva a saída para o nível lógico zero.
Deseja-se um tempo de aproximadamente 8 ms e escolheu-se arbitrariamente um ca-
pacitor de 680 nF, então R deve ser igual a 10,7 kΩ. Considerando esse valor, foi utilizado o
valor comercial mais próximo e mais comum, que é 10 kΩ. Logo, o novo valor para o tempo
será de 7,48 ms.
A forma como foi ligado no circuito é mostrada na Figura 15.
20
5 MICROCONTROLADOR
5.2 Histórico
5.3 Estrutura
O PIC16x é muito simples, tem somente 33 instruções de 12 bits de largura fixa, inclu-
indo diversas instruções de salto condicional a flags para a próxima instrução (para loops e
rotinas condicionais), produzindo um código enxuto importante para aplicações em sistemas
embarcados. Ele tem pipelines marginais (2 estágios, 1 de busca e 1 de execução), combina-
dos com execução em um ciclo (exceto para saltos, com 2 ciclos), tendo um desempenho mui-
to bom para a sua categoria.
23
O PIC 17x tem mais modos de endereçamento (direto, indireto, e relativo; as instru-
ções de modo indireto gastam 2 ciclos para execução), mais instruções (58 de 16 bits), mais
registradores (232 a 454), mais até 64k palavras de espaço de programa (2k a 8k no chip). As
versões top de linha também possuem instruções de multiplicação de 8 bits sem sinal de 1
ciclo. Esse modelo está obsoleto, não sendo mais recomendado para novos projetos de acordo
com a Microchip.
O modelo de controlador disponível para este projeto foi o PIC 16F877A da empresa
Microchip. Este modelo possui 40 pinos, sendo que destes 40 pinos, 7 pinos são usados para
alimentação e controle do mesmo.
Os demais pinos são conhecidos por I/Os (Inputs/Outputs). Estas I/Os são agrupadas
em portas (ports), de no máximo 8 pinos cada (limitação pois o componente possui um núcleo
de 8 bits).
Há um total de 33 I/Os disponíveis, que podem ser configuradas como entradas ou
saídas em tempo de execução.
24
Alguns pinos, porém, possuem outras funções além de serem entradas ou saídas digi-
tais. Por exemplo, pode-se observar que os pinos 2 a 10 (exceto o pino 6) são entradas analó-
gicas, e podem ser usados para detectar uma variação de tensão entre 0V e 5V, transformando
esta variação em uma informação binária de 10 bits. Os pinos 39 e 40 também são pinos usa-
dos na gravação do microcontrolador, e os pinos 25 e 26 são usados para comunicação SERI-
AL padrão RS232. Os pinos 16 e 17 são pinos geradores de pulso (PWM), muito útil para
controle de velocidade de motores, por exemplo. O pino 6 é um pino usado para contagem
rápida.
25
6 PERIFÉRICOS
E um duty cycle
Além dos tipos, tamanhos, cores e pinagens diferentes é preciso também observar a
ligação do pino comum. Ele pode ser do tipo Anodo Comum com ligação no VCC ou Catodo
Comum com ligação no GND. A escolha de um ou outro depende do tipo do projeto, mas um
não substitui o outro.
28
São necessários sete (ou oito se for considerado o ponto) pinos de I/O do microcontro-
lador para ligar um display. Se for necessário ligar mais de um display seriam necessários
muitos pinos. Para isto é possível utilizar o modo de varredura.
A varredura não serve apenas para entradas, mas também saídas. A Figura 25 mostra
como isso pode ser implementado. Ligam-se todas as linhas dos segmentos juntas. Assim
quando é enviado um valor para um display, é enviado para todos.
vel visualizar um valor com um número de dígitos, todos mostrados ao mesmo tempo. Em
média podem-se usar tempos de 5 ms (0,005s) a 30 ms (0,03s).
No caso do circuito montado foi utilizado esse modo varredura no circuito de duas
palmas para visualizar o tempo entre as duas palmas.
Para uma melhor interface máquina–usuário, um display de cristal líquido (LCD) está
configurado para mostrar todas sequências gravadas do experimento. Mas antes, devemos
inicializá-lo, isto é, configurar o LCD. Para isso, exige-se que um protocolo de configuração
seja implementado.
Existem muitos LCDs no mercado, mas trabalhar-se-á com o modelo mais padrão de
todos. Trata-se de um display de duas linhas com 16 caracteres cada uma. Esse display é bem
conhecido por ser o modelo utilizado nos telefones públicos (orelhões). Outra característica
importante do display que estaremos estudando é que ele já possui um drive de controle inter-
30
no. Desta forma, nos comunicaremos com ele através de uma comunicação paralela, passando
comandos e caracteres que desejamos escrever, diretamente em código ASCII.
Os dois primeiros pinos (Vss e Vdd) são relativos à alimentação do componente e de-
vem ser ligados a uma tensão nominal de 5VDC. As tensões mínima e máxima para alimenta-
ção podem variar conforme o fabricante, mas na maioria dos casos ficam entre 4,75 e
5,25Vdc.
O pino Vo é utilizado para controle contraste e normalmente o ligamos ao centro de
um potenciômetro de 10k com as extremidades ligadas ao Vss e ao Vdd. Na verdade, esse
pino deve possuir uma tensão entre Vss e Vdd.
31
O pino R/W muda o estado do LCD entre Leitura (Read) e Escrita (Write). Essa mu-
dança pode ser feita para escrevermos um comando ou dado e checarmos quando o LCD ter-
minou a operação e está pronto para darmos continuidade ao processo.
Tabela 3 - Descrição do R/W
Neste caso, o LCD só opera em modo de escrita. Por isso, precisamos garantir o ter-
mino das operações internas do módulo de LCD através de tempos pré-estabelecidos. Esses
tempos serão descritos adiante.
O pino E(Enable) é utilizado para efetivar a leitura da informação escrita no barramen-
to de dados. Essa leitura é efetuada na borda de descida deste sinal.
Os pinos DB0 na DB7 equivalem ao barramento de dados paralelo. Apesar de existi-
rem oito vias de dados, esses displays também podem operar com apenas quatro vias (DB4 a
32
DB7), com as demais vias ficando sem função. Neste caso, as informações são enviadas em
dois pacotes de 4 bits cada um. O pinoas A(Anode) e K(Katode) são usados para ligação do
Backligth(iluminação de fundo). O fato é que, apesar da existência dos pinos, nem todos os
displays possuem essa iluminação.
Para nós, então, valerá a comunicação em oito vias de dados, acrescida dos controles
RS e E, dando um total de dez pinos interligando o PIC ao LCD. Desta forma, para enviarmos
uma informação ao LCD precisaremos primeiramente ajustar RS para informarmos se é um
comando ou um dado. Em seguida, devemos escrever a informação no barramento de dados.
Próximo passo é darmos um pulso em E.
for(contador=0;contador<4 ;contador ++ ){
DATA = tabela [ contador + 1] ;
E = 1;
E = 0;
delay_ms(2);
}
}”
Vejamos agora quais são os comandos existentes no display. As nomeclaturas utiliza-
das respeitam a maioria dos datasheets existentes para esse tipo de componente. Para infor-
mações mais detalhadas, recomendamos a consulta direta ao manual do modelo em uso no seu
projeto. Os tempos apresentados também podem variar de um modelo pra outro. Alguns co-
mandos estão tabelados.
7 ALGORITMO
Com o periférico capture será capturado cada pulso para entrar em uma interrupção.
Dentro de cada interrupção será gravada a diferença de tempo entre pulsos, isto é, entre pal-
mas em um registrador.
Outro ponto principal é a varredura a qual tem como objetivo mostrar os tempos entre
palmas. A varredura consiste em maximizar o uso dos pinos para jogar informação em cada
Displays de 7-segmentos. Nesse caso, são usados 4 transistores npn para chavear cada display
de 7 segmentos. Em cada ciclo de trabalho de cada display as informações são jogadas através
de 8 pinos do PIC.A figura abaixo mostra o diagrama temporal do chaveamento do displays e
o layout do circuito. Existe um pequeno delay para ativar cada display que está relacionado
com o tempo de chaveamento do transistor.
7.1.1 Fluxograma
7.2.1 Fluxograma
1 – Estrutura geral: Azul -> LED de operação, Amarelo-> Simulação do sensor da palma e
Verde-> dysplays de 7 segmentos (varredura)
3 - Azul-> Indica que a segunda palma aconteceu. Verde-> Como o tempo foi maior que 3
segundos(3,3 segundos jah que o oscilador externo está em 10Hz) então a LUZ(Vermelho)
não acendeu.
4 - Azul-> Indica que a segunda palma aconteceu. Verde-> Como o tempo foi menor que 3
segundos(1,7 segundos jah que o oscilador externo está em 10Hz) então a LUZ(Vermelho)
acendeu.
43
2 – Fase de gravação da musica, isto é, da primeira sequencia (a1, a2,..., aN): Amarelo -> bo-
tão de gravação ativado. Azul -> sequencia de tempos gravados.
44
3 – Gravação da segunda sequencia (b1,b2,b3....bN): Verde- Está habilitado para tentar ligar a
luz ; Vermelho: A musica não está sendo gravada e sim testada ; Azul: O LCD está mostrando
as duas sequencias.
9 RESULTADOS OBTIDOS
Também foi feita uma melhoria para detectar uma sequência de palmas, ou seja, uma
“música”. Ele recebe uma sequência de palmas, gravando os tempos correspondentes e depois
verifica se a sequência é repetida.
Neste caso, como havia vários valores de tempos, foi preferível utilizar um mostrador
de LCD. Foi utilizado o popular mostrador de LCD que tem duas linhas com 16 caracteres
cada uma. Após alguns estudos, funcionou como esperado, mostrando os tempos das palmas e
48
depois mostrando a comparação entre as diferenças. Se estivesse dentro do limite tolerável ele
ativava a saída.
Foram encontradas algumas dificuldades quanto a montagem do display LCD pois
este tem 16 pinos. Quando foi ser feita a ligação do PIC com o LCD foi escolhida a porta D
do PIC. Porém verificou-se que os pinos da porta D não estão adjacentes no PIC, fazendo com
que se tornasse trabalhoso ligar todos os pinos do PIC e do LCD. Uma melhoria possível seria
escolher pinos no PIC colocados de forma contínua, fazendo com que a ligação entre PIC e
display LCD fosse mais prática.
49
10 CONCLUSÃO
REFERÊNCIAS
HOROWITZ, P.; HILL, W. The Art of Electronics. 2ª. ed. Cambridge: Cambridge
University Press, 1989.
SOUZA, D. J.; LAVINIA, N. C. Conectando o PIC 16F877A: Recursos Avançados. 3ª. ed.
São Paulo: Érica, 2003.
#include <16f877A.h>
#device adc=8
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT
#priority timer0, ccp1
}
controle2++;
}
#int_timer0
void trata_t0(){
if(controle%4==0){
//varre a unidade
output_a(2);
output_d(codificacao[unidade]);
}
if(controle%4==1){
//varre a dezena
output_a(16);
output_d(codificacao[dezena]);
}
if(controle%4==2){
//varre a dezena
output_a(8);
output_d(codificacao[centena]);
}
if(controle%4==3){
//varre a dezena
output_a(4);
output_d(codificacao[milhar]);
}
controle++;
}
void main(){
/* Configuração */
//configuração da conversao
setup_adc(ADC_OFF);
//configuração da varredura
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
set_timer0(0);
//habilitação da interrupção
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_CCP1);
/* liga o computador */
output_high(PIN_B1); //ligando a maquina
/* configuração do capture 1 */
setup_timer_1(T1_EXTERNAL); // habilita o timer 1 com clock externo
set_timer1(0); //limpando o timer 1
setup_ccp1(CCP_CAPTURE_FE) ; // coloca a entrada CCP1 em captura com sensibilidade na borda descida
/*Computador*/
while(true){
atualiza(diferenca);
}
}
55
#include <16f877.h>
#include <REGS.h>
#device adc=8
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT
//definição das variáveis de controle//
int botaoDeGravacao=0,verificacaoIgualdade=0,botaoDeMostraTempoGravados = 0,
botaoDeMostraTempoTestados = 0,acende=0,apagaLuz=0,i2=0;
int numeroDePalmas=0;
int numeroDePalmasTeste=0;
int numeroDePalmasTotal=0;
int vetorDeTempos[15]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int vetorDeRazoes[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int vetorDeTemposTeste[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int vetorDeRazoesTeste[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//rotina da interrupção de borda de descida da entrada CCP1 pino 17//
#define DATA PORTD
#define RS PORTE_0
#define E PORTE_1
#define lcd_seg_lin 0x40
char const tabela[6] = { 0x30,0x38,0x0f, 0x01, 0x06,0x01};
void lcd_pos_xy(char x ,char y){
char endereco;
if(y!=1) endereco = lcd_seg_lin;
else
endereco = 0 ;
endereco = endereco + (x - 1);
RS=0;
endereco = 0x80 | endereco;
DATA = endereco ;
E = 1;
E = 0;
delay_ms(2);
}
void lcd_ini(void){
delay_ms(15);
char contador = 0;
RS=0;
E = 0;
for(contador=0;contador<3; contador++){
DATA = tabela[0];
56
E = 1;
E = 0;
delay_ms(3);
}
for(contador=0;contador<4;contador ++ ){
DATA = tabela [ contador + 1] ;
E = 1;
E = 0;
delay_ms(2);
}
}
void lcd_escreve(char caracter){
RS = 1 ;
delay_us(100);
DATA = caracter ;
E = 1;
E = 0;
}
void limpa_lcd(){
lcd_pos_xy(1,1);
lcd_escreve(" ");
lcd_pos_xy(1,2);
lcd_escreve(" ");
}
#INT_CCP1
void trata_ccp1(){
//zerando a variavel acende//
acende = 0;
//caso a opção de gravação foi requisitada//
if(botaoDeGravacao==1){
//começando a gravação//
numeroDePalmas++; //conta o numero de palmas
vetorDeTempos[numeroDePalmas-1] = CCP_1; //grava os tempos entre as palmas
//imprimindo os tempos das palmas
lcd_pos_xy(2*(numeroDePalmas)-1,1);
printf(lcd_escreve,"%d",vetorDeTempos[numeroDePalmas-1]);
numeroDePalmasTotal = numeroDePalmas; //grava o numero total de palmas
//se não for a palma para desligar a luz, então essa rotina grava os interlos entre as palmas que serão compa-
rados
//com os intervalos gravados anteriormente
if(apagaLuz == 0){
//verificação da música
if((botaoDeGravacao==0)&&(vetorDeTempos[0]!=0)){
57
numeroDePalmas=0; //essa variável é zerada caso uma nova musica seja gravada denovo
numeroDePalmasTeste++; //conta o número de palmas
vetorDeTemposTeste[numeroDePalmasTeste-1] = CCP_1; //grava os tempos entre as palmas
TRISE=0b00000000;
lcd_ini();
lcd_pos_xy(1,1);
lcd_escreve("TG 2010.1");
lcd_pos_xy(1,2);
lcd_escreve("Pedro s");
delay_ms(2000);
limpa_lcd();
set_timer1(0);
/*Computador*/
while(true){
//verificando se o sistema está em fase de gravação ou não
botaoDeGravacao = input(PIN_B4);
botaoDeMostraTempoGravados = input(PIN_C3);
botaoDeMostraTempoTestados = input(PIN_C4);
if((botaoDeGravacao == 1)){
output_low(PIN_B2);
}else{
output_high(PIN_B2);
}
//verificando se o sistema está em fase de apagamento
botaoDeApagamento = input(PIN_B5);
//atualiza os display para verificar os tempos entre as palmas
if((verificacaoIgualdade == 1)){
output_high(PIN_B6);
//formando as razoes para a verificação e comparando as razoes
limpa_lcd();
for(i=1;i<numerodePalmasTotal;i++){
//formando o vetor de razões da musica gravada//
vetorDeRazoes[i-1]=vetorDeTempos[i] - vetorDeTempos[i-1];
lcd_pos_xy(2*i-1,1);
printf(lcd_escreve,"%d",vetorDeRazoes[i-1]);
//formando o vertor de razões da musica de teste//
vetorDeRazoesTeste[i-1] = vetorDeTemposTeste[i] - vetorDeTemposTeste[i-1];
lcd_pos_xy(2*i-1,2);
printf(lcd_escreve,"%d",vetorDeRazoesTeste[i-1]);
//testando a igualdade//
if((vetorDeRazoesTeste[i-1]>=vetorDeRazoes[i-1]-2)&&(vetorDeRazoesTeste[i-1]<=vetorDeRazoes[i-
1]+2)){
acende++;
}
delay_ms(3000);
}
59
TOTAL 41,6
63
TOTAL 71,67
64