Com o letreiro pronto e funcionando, a estrutura foi pintada na cor preta fosca, para que em um ambiente noturno, conseguíssemos ver apenas os LEDs, sem interferência luminosa devido a reflexos que poderiam ser feitos por luzes sobre a estrutura. Uma foto da estrutura final é vista na figura 35.
50
Ao iniciar o letreiro, é preciso escolher uma frase através da conexão com um computador/notebook. Assim que a frase é escolhida, o letreiro passa a apresentar a frase até que receba outra informação de escolha, trocando a frase a ser mostrada.
Os testes de formação das frases foram feitos para 2 tipos de frases coloridas, uma frase grande e outra pequena, com pouca variação entre as velocidades exigidas pelo motor, para que fosse feita a sincronização que causasse o efeito desejado.
O primeiro teste foi feito com as palavras FATEC – SP. Conforme a foto tirada no momento do teste, vista na figura 36.
51
O segundo teste foi feito com uma frase grande, completando a circunferência formada pelo eixo giratório. A frase usada foi TRABALHO DE CONCLUSÃO DE
CURSO! Uma parte da frase é mostrada na figura 37.
Figura 37: Foto do letreiro em funcionamento.
Nos momentos em que as fotos foram tiradas, os textos se apresentavam sem movimentos, devido ao controle da velocidade do motor.
4.1 PROBLEMAS E DIFICULDADES
O principal problema encontrado foi a compatibilidade entre compilador e gravador, devido ao compilador ser antigo e sua ultima atualização ser do ano de 2005, onde não existiam os modelos de 8051 gravados pelo gravador utilizado, que
52
apresentam mudanças na estrutura, como a quantidade de memória RAM. O compilador PEQUI disponibiliza 128 Kbytes de memória RAM e os microcontroladores gravados pelo gravador 8051 USB possuem 256 Kbytes de memória RAM
Essa falta de compatibilidade fez com que nenhuma instrução utilizando a memória RAM funcionasse, afetando o objetivo inicial do trabalho.
O objetivo inicial do trabalho era o usuário do letreiro poder escrever uma frase, que seria reconhecida pelo microcontrolador e o letreiro mostraria o que foi digitado. Para isso, os dados digitados deveriam ser gravados na memória RAM do microcontrolador e depois comparados com os caracteres programados.
O manual do gravador 8051 USB indica que a maioria dos compiladores geram arquivos .HEX incompletos, conforme a imagem da figura 38, retirada do manual.
53
No manual, os fabricantes deram duas alternativas, a primeira é utilizar o compilador BASCOM, porém este compilador é pago e sua compra é feita em dólares. Existe a versão DEMO, mas disponibiliza pouca memória de gravação.
A segunda alternativa é utilizar o programa ICPROG, para compatibilizar o arquivo HEX com o gravador. O ICPROG compatibiliza o arquivo a ser gravado apenas criando outro arquivo HEX maior, compilando a memória de programação usada e o restante não usado em um único arquivo. O ICPROG não compatibiliza a quantidade de memória RAM compilada de 128 Kbytes para uma RAM de 256 Kbytes que é utilizada pelos novos microcontroladores.
Devido à falta de compatibilidade, o objetivo principal foi mudado para frases pré-programadas, que podem ser escolhidas pelo usuário.
54
5. CONCLUSÃO
Neste trabalho foi desenvolvido um letreiro utilizando 7 LEDs, que são girados por um motor permitindo a visualização de um texto devido a uma anomalia na retina humana denominada persistência da retina. Esta anomalia consiste na retenção de um estímulo visual pela retina humana por uma fração de segundo, mesmo após o desaparecimento da fonte de luz que o provocou. Graças a esta anomalia, podemos ver o texto formado a partir da sincronização entre velocidade do motor e controle dos LEDs por um microcontrolador.
O microcontrolador é responsável por controlar os LEDs necessários para formação de cada letra e o tempo que cada um permanece aceso ou apagado.
Foram realizados diversos testes para conseguir uma sincronização perfeita, gerando a visualização das frases de modo que conseguíssemos ver o texto em qualquer ponto da circunferência.
Os cálculos apresentados sobre frequência e velocidade do motor são apenas aproximados, devido a necessidade da modificação da velocidade do motor para cada tipo de combinação das letras, devido ao fato da frequência variar para cada frase formada.
Os circuitos utilizados são simples e não requerem um grande estudo para a utilização dos mesmos. A maior parte dos circuitos utilizados é disponibilizada pelos próprios fabricantes dos componentes, em seus respectivos datasheets.
Durante o desenvolvimento, surgiram pequenos contratempos durante a soldagem dos componentes na montagem da placa de circuito e na montagem da
55
estrutura, pois sendo de plástico, precisou ser colada com solda plástica, para uma melhor fixação das caixas.
Os resultados finais foram satisfatórios, após a escolha da frase, o letreiro começa a apresentar a frase e a visualização é perfeita. O letreiro mostra as frases sem movimento, com movimento horário e com movimento anti-horário que podem ser escolhidos variando a velocidade do motor.
5.1 TRABALHOS FUTUROS
O letreiro pode ser melhorado em alguns setores, como estrutura, comunicação e programação. Com uma estrutura mais rígida e aerodinâmica, poderiam ser feitas sincronizações com velocidades mais altas, sem a preocupação de a velocidade de giro danificar a estrutura.
A comunicação pode ser feita sem utilização de cabos, aumentando a comodidade do usuário, e mudando a frase sem precisar desligar o motor. A comunicação poderia ser feita por WI-FI, simples sinais de rádio frequência, ou por celulares, simplesmente discando o código necessário. Poderiam ser enviados sinais por celulares, tablets e outros equipamentos eletrônicos.
A programação pode ser aperfeiçoada, diminuindo o número de instruções, como o tamanho da programação não foi vista como algo preocupante no decorrer do trabalho, a programação acabou ficando grande, mas pode ser otimizada.
A programação pode ser incrementada, por exemplo, com uma rotina de relógio, para mudar a frase com o passar do tempo ou em determinadas horas.
56
6. REFERÊNCIAS
[1] NICOLOSI, D. E., Microcontrolador 8051 Detalhado, 6ª edição, São Paulo: Érica, 2007. Cap. 1, 2, 3, 8 e 10.
[2] Atmel Corporation. Datasheet do microcontrolador AT89S8253. Disponível em: <http://www.atmel.com/Images/doc3286.pdf>; Acessado em 04/10/2011.
[3] Maxim inovation delivered. Datasheet do circuito integrado MAX232. Disponível em: <http://www.maxim-ic.com/datasheet/index.mvp/id/1798>. Acessado em 29/10/2011.
[4] Instituto Newton C. Braga. Efeito estroboscópico. Disponível em: <http://www.newtoncbraga.com.br/index.php/almanaque/1829-alm248.html>.
Acessado em 15/02/2012.
[5] Cerne tecnologia e treinamento. Manual do gravador 8051 USB. Disponível em: <http://www.cerne-tec.com.br/gp8051usb.pdf>. Acessado em 12/03/2012.
57
7. ANEXO A: PROGRAMA
Neste anexo, estão contidas as linhas de programação principais, uma rotina de frase e uma rotina de letra.
Prog: (rotina que configura a comunicação e recebimento do código digitado) Mov Tmod,#20h; (configura timer 1 p/ MODO 2 (recarga automática))
MOV TH1,#0E6H; (recarrega o timer para taxa de 1200bps)
SETB TR1; (liga o temporizador 1)
MOV IE,#90H; (habilita interrupção pela comunicação)
MOV SCON,#50H; (configura comunicação para MODO 1 (taxa variável))
RECEBE: SJMP $; (loop infinito até receber algum dado pela comunicação)
Org 0023h; (endereço para onde o programa salta quando tem interrupção)
Mov A,Sbuf; (move o dado recebido em SBUF para o acumulador)
CLR RI; (limpa o aviso de interrupção do receptor, habilitando nova recepção)
JMP compara; (salta para a rotina de comparação)
compara: ( rotina que compara o que foi digitado e salta para a frase escolhida) cjne a,#61h,frase2; (compara o que foi digitado, se for diferente de #61, salta para frase2)
jmp inicio; (salta para a frase com código #61)
frase2: cjne a,#62h,frase3; (compara o que foi digitado, se for diferente de #62, salta para frase3, se for igual, salta para a frase escolhida)
jmp inicio1; (salta para a frase com código #62)
frase3: cjne a,#63h,frase4; (compara o que foi digitado, se for diferente de #63, salta para frase4, se for igual, salta para a frase escolhida)
jmp inicio2; (salta para a frase com código #63)
frase4:cjne a,#64h,frase5; (compara o que foi digitado, se for diferente de #64, salta para frase5, se for igual, salta para a frase escolhida)
jmp inicio3; ( pula para a frase com código #64)
frase5: cjne a,#65h,frase6; (compara o que foi digitado, se for diferente de #65, salta para frase6, se for igual, salta para a frase escolhida)
jmp inicio4; (salta para a frase com código #65)
frase6: cjne a,#66h,frase7; (compara o que foi digitado, se for diferente de #66, salta para frase7, se for igual, salta para a frase escolhida)
jmp inicio5; (salta para a frase com código #66)
frase7: ( rotina que acende cada LED com uma cor diferente e chama rotina que envia a informação de código não aceito)
mov p1,#11011110b; mov p2,#00011000b; CLR p3.5;
CLR p3.4; CLR p3.2;
58 CLR p3.3;
call envia; ( chama rotina que envia a informação de código não aceito)
JMP RECEBE; (salta para rotina RECEBE)
INICIO: ( rotina que cria uma das frases) mov r2,#0CCh; ( carrega o registrador r2)
call letraspc; ( chama rotina que cria um espaço de 4 colunas)
call atraso; ( chama rotina que cria um espaço entre as letras)
mov r2,#0CCh; (carrega o registrador r2)
call letraEverde; ( chama a rotina que cria a letra E verde)
call atraso; ( chama rotina que cria um espaço entre as letras)
mov r2,#0CCh; call letraCverde; call atraso; mov r2,#0CCh; call letraPverde; call atraso; mov r2,#0CCh; call letraMverde; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraPred; call atraso; mov r2,#0CCh; call letraSred; call atraso; mov r2,#0CCh; call letraco; call atraso; mov r2,#0CCh; call letraCazul; call atraso; mov r2,#0CCh; call letraEazul; call atraso; mov r2,#0CCh; call letraTazul; call atraso; mov r2,#0CCh; call letraAazul;
59 call atraso; mov r2,#0CCh; call letraFazul; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso; mov r2,#0CCh; call letraspc; call atraso;
60
Durante a execução, são chamados 31 caracteres por frase. A execução fica em
loop infinito, formando a mesma frase repetitivamente até que receba outro código.
letraEamarelo: ( rotina que cria a letra E amarela)
djnz r2,letraEamarelo; ( decrementa r2 para criar um atraso, após isso, acende uma coluna com as próximas instruções)
CLR P1.0; ( acende o LED ligado a porta P1.0)
CLR P2.1; CLR P3.4; CLR P1.1; CLR P2.2; CLR P3.2;
mov r2,#0B0h; ( carrega o registrador r2)
letraEamarelo4: djnz r2,letraEamarelo4; ( decrementa r2 para criar um atraso, que mantem os LEDs acesos)
call apaga;
mov r2,#0B1h; ( carrega o registrador r2)
letraEamarelo33: djnz r2,letraEamarelo33; ( decrementa r2 para criar um atraso, que mantem os LEDs apagados)
CLR P1.0; CLR P2.1; CLR P3.4; CLR P1.1; CLR P2.2; CLR P3.2;
mov r2,#0B0h; ( carrega o registrador r2)
letraEamarelo3: djnz r2,letraEamarelo3; ( decrementa r2 para criar um atraso, que mantem os LEDs acesos)
call apaga;
mov r2,#0B1h; ( carrega o registrador r2)
letraEamarelo22: djnz r2,letraEamarelo22; ( decrementa r2 para criar um atraso, que mantem os LEDs apagados)
CLR P1.0; CLR P2.1; CLR P3.4; CLR P1.1; CLR P2.2; CLR P3.2;
mov r2,#0B0h; ( carrega o registrador r2)
letraEamarelo2: djnz r2,letraEamarelo2; ( decrementa r2 para criar um atraso, que mantem os LEDs acesos)
call apaga;
mov r2,#0B1h; ( carrega o registrador r2)
letraEamarelo13: djnz r2,letraEamarelo13; ( decrementa r2 para criar um atraso, que mantem os LEDs apagados)
CLR P1.6; CLR P1.3; CLR P1.0;
61 CLR P2.1; CLR P2.4; CLR P2.7; CLR P3.4; CLR P1.5; CLR P1.7; CLR P1.1; CLR P2.2; CLR P2.5; CLR P3.6; CLR P3.2;
mov r2,#0B0h; ( carrega o registrador r2)
letraEamarelo1: djnz r2,letraEamarelo1; ( decrementa r2 para criar um atraso, que mantem os LEDs acesos)
call apaga; ( chama rotina que apaga todos os LEDs)