Este documento descreve um relógio analógico criado usando o princípio de persistência de visão (POV). O relógio usa uma barra de LEDs acoplada a uma hélice motorizada para exibir imagens dos ponteiros das horas, minutos e segundos no ar. Um microcontrolador controla a rotação do motor e o acionamento dos LEDs para criar a ilusão de um relógio analógico convencional.
Boas práticas de programação com Object Calisthenics
POV- Propeller Clock- Relógio Analógico
1. UNIVERSIDADE PAULISTA
INSTITUTO DE CIÊNCIAS EXATAS E TECNOLÓGICAS- ICET
TRABALHO DE APS - 8º SEMESTRE
ENGENHARIA MECATRÔNICA
SÃO JOSÉ DOS CAMPOS-SP
2013
2. UNIVERSIDADE PAULISTA
INSTITUTO DE CIÊNCIAS EXATAS E TECNOLÓGICASICET
RELÓGIO ANALÓGICO POV
PROPELLER CLOCK
(PERSISTENCE OF VISION)
FABIANO FORMAGINI– A554JI0
JENNIFER DINIZ MACIEL-A496157
ANDRESS HEIJI NOMURA-A578CD5
JONATHAN YUJIRO GONDO-A4764J8
EDSON GABRIEL COLMAN MAIA-A4286I0
JONATHAN GUILHERME T DE MORAES-A480080
SÃO JOSÉ DOS CAMPOS-SP
Novembro de 2013
3. ÍNDICE
RESUMO
Pg4
ILUSÃO DE ÓPTICA
Pg4
EXPLICANDO O FENÔMENO POV
Pg5
O PROJETO
Pg5
PCI e MOTOR
Pg6
ALIMENTAÇÃO
Pg6
LEDs
Pg7
DRIVER
Pg7
MICROCONTROLADOR E SOFTWARE
Pg7
ACIONAMENTO DA BARRA DE LEDs
Pg8
MOSTRAGEM DOS PONTEIROS
Pg9
CÓDIGO FONTE
Pg10
DIAGRAMA ESQUEMÁTICO
Pg19
LAYOUT DA PLACA
Pg20
FOTO DO PROTÓTIPO
Pg21
REFERÊNCIAS BIBLIOGRÁFICAS
Pg22
3
4. RESUMO
Este é um dispositivo diferenciado, pois diferentemente dos relógios convencionais,
neste não existem ponteiros reais nem painéis estáticos.
Como o próprio nome deixa subentendido, “The PropellerClock ” é um relógio
constituído de uma hélice acoplada ao eixo de um motor. A interface deste é efetivada
através de uma barra de LEDs que se encontra acoplada a esta hélice.
Utilizando os princípios de varrimento mecânico, a barra de LEDs é previamente
programada para que, em determinados momentos já pré-estabelecidos, pisquem,
provocando aos observadores a ilusão de imagens serem exibidas no ar. Estes são
conhecidos também como Displays Aéreos.
Especificamente o “The PropellerClock”, consiste em um RTC – implementado por
software – que exibe, no ar, a imagem de um pseudo-relógio analógico mecânico.
ILUSÃO DE ÓPTICA
O termo Ilusão de Óptica aplica-se a todos os fenômenos que tem a capacidade de
distorcer a resposta do sistema visual humano, sendo capaz de induzir o ser a ver algo
que não está fisicamente presente ou simplesmente alterar a forma de percepção visual.
Estas podem assumir caráter fisiológico ou até mesmo cognitivo, surgindo
naturalmenteou sendo induzidas.As cores e as formas usuais sobre o que pode ser visto, surge
instantaneamente noscircuitos neurais dos seres humanos e influenciam na representação de
alguma cena. Aspropriedades percebidas dos objetos, tais como o brilho, tamanho angular e
cor sãodeterminadas inconscientemente e não são propriedades físicas reais. A interpretação
doque o ser humano vê no mundo exterior é uma tarefa muito complexa.
Estudos mostram que existem mais de trinta áreas diferentes de cérebro humano
voltadas a reproduzir e processar as imagens do mundo exterior. Algumas áreas
parecem corresponder ao movimento outras à cor, outras à profundidade e mesmo à
direção de um contorno. Existe também uma tendência do cérebro humano a simplificar
as coisas em relação ao que elas realmente são. E é essa simplificação que permite ao
ser humano uma apreensão mais rápida. - ainda que imperfeita - da realidade exterior, o
que dá origem às ilusões de óptica.
4
5. Foi em 1995 que Bob Blick desenvolver um relógio utilizando o conceito de escrita
por varrimento mecânico, utilizando um array de sete LEDs acopladas a um motor.Batizou
seu projeto de PropellerClock , a partir de então, inúmeros outros projetos foram criados.
EXPLICANDO O FENÔMENO POV
Foram encontradas em cavernas pré-históricas as primeiras sequências de figuras
desenhadas pelo homem de modo a produzirem a sensação de movimento.Essa descoberta
confirma a percepção de que quando folheamos rapidamente desenhos ou fotografias em
sequência elas parecem se mover. Foi só em 1826 que o médico e filólogo inglês Peter Mark
Rogetpublicou um estudo sobre o assunto.
Segundo o cientista, o olho humano retém a imagem que se forma na retina por alguns
décimos de segundo a mais (aproximadamente 1/24 de segundo) mesmo após o clarão que a
provocou haver desaparecido.Essa peculiaridade do sistema óptico humano capaz de reter a
imagem por esse pequeno lapso de tempo é conhecida como persistência da visão ou
persistência retiniana.
Três anos após essa descoberta, o físico belga Joseph-Antoine Plateau foi o primeiro a
medir o tempo da persistência da visão ao concluir quepara uma série de imagens darem a
ilusão de movimento é necessário que se sucedam à razão de dez por segundo.
Baseados nessas descobertas, inúmeros equipamentos foram criados para captar a
imagem do movimento. Os primeiros aparelhos de projeção eram formados por discos com
várias imagens coladas em posições diferentesque ao serem rodados, davam a impressão de
mobilidade. Para filmar um corpo em movimento, são feitas várias fotos (fotogramas) em
intervalos bem curtos e hoje a velocidade de filmagem e projeção é padronizada em 24
fotogramas por segundo.
Como a imagem na retina persiste no intervalo de tempo compreendido entre duas
imagens sucessivas, o fotograma seguinte é projetado no exato instante em que o fotograma
anterior está desaparecendo de nossa "memória visual", o que produz a sensação de
movimento contínuo.
A ciência da visão é muito mais complexa do que tudo que foi acima citado.
5
6. O PROJETO
Todos os componentes com exceção do microcontrolador são em SMD
( Surface Mounting Devices) em razão da miniaturização constate nos dias de hoje.
PCI e MOTOR
A PCI ( placa de circuito impresso) é de fenolite com um lado cobreado, o layout foi
montado no software Eagle, (EasilyApplicableGraphicalLayout Editor) da Cadsoft , e
impresso em folha A4 ,este foi transferido para a placa de fenolite por compressão e calor e
assim mergulhada na solução de percloreto de ferro para a corrosão do cobre. As partes
pintadas não são corroídas eas partes nú o ácido reage com o cobre corroendo o mesmo.
O alinhamento e o balanceamento foi observado com critério, uma vez que a placa
desbalanceada causa vibração no momento do giro. O motor usado é um Motor DC Mabuchi,
e com giro de 950RPM. A rotação do motor foi setada variando-se a tensão de alimentação do
mesmo e o eixo do motor foi acoplado ao centro de gravidade da placa.
ALIMENTAÇÃO
A alimentação do circuito é feita com 3 bobinas de 33uH, L1,L2 e L3 estas acopladas
posterior a placa. Estaticamente temos um imã , que com a rotação da PCI as bobinas geram
um campo eletromagnético e a DDP gerada é retificada por onda completa pelos diodos
retificadores de chaveamento rápido ( Schottky) fabricados pela Rohm, de PartNumber
RB161M-20, e D1,D2 e D3, se apresentam em encapsulamento SOD-1231 . A tensão é filtrada
por dois capacitores, C3 e C4.
A tensão gerada é insuficiente para acender os LEDs, esta então é elevada e
estabilizada em 5.3Volts pelo CI Step-UP EUP2584 2. A alimentação do PIC® é feita
através de D5 e mesmo com o motor parado, temos alimentação para o PIC® graças a um
capacitor de back-up ,C7, um Gold-Cap3 da Serie SD do fabricante Panasonic, PartNumberGC5.5V0.33F .Com este cuidado o PIC continua contando as horas sem que resete o
relógio, neste momento o diodo D5 desempenha outra função, impedir que a tensão retorne e
alimente os LEDs, descarregando C7.
6
7. LEDs
Os LEDs são montados em linha sendo intercaladas as cores para assim se obter o
ponteiro das horas ,minutos e segundos em cores distintas, um LED foi adicionado para
marcar a posição das horas e um segundo LED faz o circulo em torno do relógio, este
mantem-se aceso constantemente e com o giro do dispositivo, temos o contorno do relógio.
Para uma melhor visualização dos ponteiros, aumentamos o numero de "pixels"
(LEDs) ,usando 21 LEDs na cor Vermelha e 26 LEDs na cor verde. Os LEDs vermelhos,
LED 1 a LED 21 e LED48, são do fabricante Multicomp ,de PartNumber
MCL-S290SRC4 e encapsulamento 06035 com 15mcd de intensidade luminosa cada. Os LEDs
verde e o LED azul,( LED 22 a LED 47e LED 49) são do fabricante KingBright, de
PartNumber KP-2012SGC6, e encapsulamento 0603 com 15mcd de intensidade luminosa
cada.
DRIVER
O controle de alimentação dos LEDs é feito por 4 transistores Mos-Fet Canal-P SMD,
fabricado pela Advance Power Electronics Corporation, de PartNumber AP2301GN7,
suportam uma corrente de até -2.6A cada. Entretanto , a corrente máxima aplicada em cada
transistor neste projeto não passa de algumas centenas de mA.
Os resistores limitadores de corrente são SMD de encapsulamento 0603. R1 a R21 são
de 470 Ohms e R22 a R48 são de 240 Ohms .
MICROCONTROLADOR E SOFTWARE
O Microcontrolador escolhido foi o PIC16F6848 do fabricante Microchip, uma vez
que ele consome em operação normal com cristal de 32.768Khz apenas 11µA . A
programação é em Assembly, que é a língua primitiva dos micro-controladores. Linguagem
Assembly, como opróprio nome sugere é definida como linguagem de montagem. Tem essa
definição pois é uma linguagem de baixo nível, sendo ela a mais próxima da linguagem de
máquina.
A lógica de funcionamento do software pode ser dividida em quatro etapas: a
primeira etapa é o pré-set do relógio; a segunda etapa é responsável pelo controle da
7
8. base de tempo do relógio; a terceira etapa é a responsável por detectar a posição da barra e a
última etapa, responsável por controlar o acionamento da barra de LEDs – levando em
consideração as duas primeiras etapas.
Primeiramente, é necessário fazer o pré-set do horário para isso utilizam-se duas
portas do micro-controlador que estão conectadas a um sensor infravermelho. Cada vez que
um sensor é ativado, tem um respectivo valor de tensão analógico, zero, este que é
reconhecido e tratado pelo micro-controlador. Cada sensor tem uma função distinta: T1 ajusta
as horas e T2 os minutos.
Como é proposto em seu próprio título, é necessário criar um relógio para o controle
da base de tempo. A idéia inicial para implementação deste relógio foi utilizar o clock gerado
pelo cristal e dividir para se obter uma freqüência de 1Hz. Pensando nas limitações mecânicas
do dispositivo e nas limitações do próprio micro-controlador optou-se em implementar um
RTC (real time clock) por software. Para implementação do RTC foi adaptada uma biblioteca
pronta. Esta biblioteca configura um timer interno do micro-controlador para atender uma
interrupção a cada segundo, fazendo assim com que haja o incremento de segundo. Para
incremento do minuto, testa-se a variável que armazena os segundos. Para incremento da
hora, testa-se a variável dos minutos.
O monitor de posição é efetuado através da resposta do Sensor de efeito Hall, IC2
PartNumberA11049, da Allegro Micro Systems. Este sensor atua sempre que o motor
completa um giro de 360º marcando cada volta. Nos micro-controladores da família PIC®
existe um pino que pode ser configurado para atender uma interrupção externa toda vez que
detectar uma troca de nível de sinal,ou seja, sempre que o sensor atuar.
Para calcular a rotação do motor utiliza-se uma interrupção externa, esta que será
atendida sempre que o sensor atuar detectando uma borda de descida no pino do microcontrolador. Toda vez que esta interrupção externa for atendida, o programa incrementa uma
variável, que a cada segundo conta quantas vezes foram detectadas estas interrupções ou seja,
guarda o número de voltas que foram dadas pelo motor durante um segundo.
ACIONAMENTO DA BARRA DE LEDs
O controle para o acionamento dos LEDs é dependente das supra-referidas etapas,
pois o acionamento dos mesmos ocorre com base na hora e velocidade atual.
8
9. Primeiramente é necessário salientar o número de posições que cada ponteiro pode assumir.
O ponteiro responsável pela exibição das horas pode assumir 12 posições, enquanto os
ponteiros responsáveis pela exibição dos minutos e segundos assumem 60 posições cada.
Para saber a posição exata de cada ponteiro, é necessário que exista um ponto de
referência fixo. Para isto, o sensor de efeito Hall foi estrategicamente posicionado, servindo
de referência ao software e fazendo com que, no momento em que o sensor é acionado, o
dispositivo esteja na posição 12 Horas. É este ponto de referencia que possibilita estimar o
tempo necessário para atingir cada passo dos ponteiros. Partindo destas premissas, é possível
controlar devidamente o dispositivo.Feita a leitura do horário atual calcula-se a velocidade de
rotação do motor para corrigir o tempo de passo dos ponteiros. Com base no horário obtido,
sabem-se quantos passos é necessário dar para o ponteiro chegar à respectiva posição. Após
saber o número de passos necessários, configura-se um timer interno do micro-controlador
para aguardar o tempo correto para poder efetivar o acionamento da barra de LEDs no ponto
correspondente. Este procedimento é efetuado para os três ponteiros.
MOSTRAGEM DOS PONTEIROS
HORA
Para a mostrar o ponteiro marcador das horas as portas RC0 e RC4 do PIC® passam
o nível lógico para "1" para "0".
MINUTOS
Para a mostrar o ponteiro marcador dos minutos as portas RC3 e RC4 do PIC®
passam o nível lógico para "1" para "0".
SEGUNDOS
Para a mostrar o ponteiro marcador dos segundos as portas RC0 e RC1 do PIC®
passam o nível lógico para "1" para "0".
9
10. CÓDIGO FONTE
LIST P=16F684, R=DEC
INCLUDE "p16f684.inc"
__CONFIG _FCMEN_OFF & _IESO_OFF & _BOD_OFF & _CPD_OFF & _CP_OFF &
_MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
CBLOCK 0x20
hours, minutes, seconds, hrpos
w_save, stat_save, pc_save
temp, tick, tickNotch
debounce:2
ENDC
ORG 0
goto
; iniciaprograma
main
ORG 4
; ISR é chamado a cada segundo
movwf
w_save
; salvaWreg
swapf
STATUS, w
; salvasem stat reg
movwf
stat_save
; troca flags
btfss
PIR1, TMR1IF
; TMR1 interrupção
goto
start
; -processo de sinc de pulso
movlw
128
; seta prox. interrupção
movwf
TMR1H
; separa 1 segundo
incf
seconds, f
; carrega o código ISR
movlw
60
subwf
seconds, w
btfss
STATUS, Z
10
11. goto
ISR_end
clrf
seconds
incf
minutes, f
movf
hours, w
movwf
hrpos
addwf
hrpos, f
addwf
hrpos, f
addwf
hrpos, f
addwf
hrpos, f
movf
minutes, w
movwf
temp
movlw
12
incf
hrpos, f
subwf
temp, f
btfsc
STATUS, C
goto
$-3
decf
hrpos, f
movlw
60
subwf
minutes, w
btfss
STATUS, Z
goto
ISR_end
clrf
minutes
incf
hours, f
; seconds = segundos (mod 60)
; hrpos = horas
; hrpos = horas * 5
; hrpos += floor(minutos/12)
; minutes = minutos (mod 60)
movlw 12
subwf
hours, w
11
12. btfss
STATUS, Z
goto
ISR_end
clrf
hours
; horas = horas (mod 12)
bcf
PIR1, TMR1IF
; limpainterrupção
swapf
stat_save, w
; carrega original flags in STATUS
movwf
STATUS
swapf
w_save, f
swapf
w_save, w
ISR_end
; restore Wreg
retfie
main
; código principal
clrf
PORTA
clrf
PORTC
movlw 0x07
movwf
CMCON0
; comparadores OFF
bsf
STATUS, RP0
; chaveiapara BANK 1
clrf
ANSEL ^ 0x80
; todas entradas digitais
clrf
TRISA ^ 0x80
; PORTA saída
bsf
TRISA ^ 0x80, 2
; INT pin para entrada
clrf
TRISC ^ 0x80
; enable PORTC para saída
bsf
TRISC ^ 0x80, 5
; PORTC pin 5 é entrada
bsf
PIE1 ^ 0x80, TMR1IE
; enable TMR1 interrupts
bcf
OPTION_REG^0x80, 6
; interromper ao cair nível RA2
bcf
STATUS, RP0
; retorna para BANK 0
movlw b'00001111'
; enable TMR1 com clock externo
12
13. movwfT1CON
bsf
INTCON, PEIE
bsf
INTCON, INTE
bcf
PIR1, TMR1IF
clrf
hours
clrf
hrpos
clrf
minutes
clrf
seconds
clrf
tick
; posiçãoatual da placa
clrf
tickNotch
; led azul, posição
incf
tickNotch, f
bcf
INTCON, INTF
; clear INT flag
bsf
INTCON, GIE
; (re)-enable todas interrupções
start
loop
; loop
movlw
b'011011'
movwf
PORTC
decfsz
tickNotch, f
goto
$+4
bsf
PORTC, 2
movlw
5
movwf
tickNotch
movf
seconds, w
subwf
tick, w
btfss
; apaga display
STATUS, Z
; set the Z flag
; liga led azul
; tickNotch = 5
13
14. goto
check_min
bcf
PORTC, 0
bcf
PORTC, 1
; exibir ponteiro segundos
check_min
movf
minutes, w
subwf
tick, w
btfss
STATUS, Z
goto
check_hours
bcf
PORTC, 3
bcf
PORTC, 4
; exibir ponteiro minutos
check_hours
movf
hrpos, w
subwf
tick, w
btfss
STATUS, Z
goto
$+3
bcf
PORTC, 1
bcf
PORTC, 4
call
delayOn
movlw
b'010111'
movwf
PORTC
call
delayOff
; gap delay
incf
tick, f
; atualiza mostrador de horas
; exibir ponteiro horas
; apaga display
movlw 60
subwf
tick, w
btfss
STATUS, Z
14
16. incf
debounce+1, f
btfss
debounce+1, 4
goto
$-6
call
incHours
; atualiza horas
call
blink
; pisca led azul
btfsc
PORTA, 3
; botão de minutos pressionado?
goto
wait4Press
; Não - aguarde pressionar
incf
debounce, f
btfsc
STATUS, Z
incf
debounce+1, f
btfss
debounce+1, 4
goto
$-6
call
incMinutes
; atualiza minutos
call
blink
;pisca led azul
; 4096*8 = 32msec
return
checkMinButt
; 4096*8 = 32msec
return
incHours
; incrementa horas mod 12
bcf
INTCON, GIE
incf
; desabillita interrupções
hours, f
movlw 12
subwf
hours, w
btfsc
STATUS, C
; hora é >= 12 ?
clrf
hours
; SIM - limpa
movf
hours, w
; computa nova posição de hrpos
16
17. movwf hrpos
; hrpos = hours
addwf
hrpos, f
addwf
hrpos, f
addwf
hrpos, f
addwf
hrpos, f
movf
minutes, w
movwf
temp
movlw
12
incf
hrpos, f
subwf
temp, f
btfsc
STATUS, C
goto
$-3
decf
hrpos, f
bsf
INTCON, GIE
inc
Minutes
bcf
INTCON, GIE
incf
minutes, f
; hrpos = hours * 5
; hrpos += floor(minutes/12)
return
; incrementa minutos mod 60
movlw 60
subwf
minutes, w
btfsc STATUS, C
; minutos é >= 60 ?
clrf
minutes
; YES - limpa
bsf
INTCON, GIE
return
blink
; pisca led azul base te tempo de 100ms
17
18. bsf
PORTC,2
movlw
100
movwf
temp
movlw
250
addlw
-1
btfss
STATUS, Z
goto
$-2
decfsz
temp, f
goto
$-5
bcf
PORTC, 2
; led azul, on
; desliga led azul
return
delayOn
; formar intervalo de tempo para mostrar posição horas
movlw
10
addlw
-1
btfss
STATUS, Z
goto
; e ponteiros
$-2
return
delayOff
; formar intervalos entre minutos
movlw 90
; mostrador
addlw -1
btfss STATUS, Z
; a soma dos dois últimos retardos não deverá
exceder 110 msec para prevenir efeitoflicker
goto
$-2
return
END
18