Hello hello rapaziada :D!
Pois é, estou de volta com mais um tutorial onde vos vou explicar como usar ou fazer interagir um RTC, mais propriamente o DS1307 (http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2688) da Maxim-Dallas com o Arduino! Agora já podem adicionar um relógio e dar horas no vosso projecto!
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fworld-educational-services.net%2Fcart%2Fimages%2F8pin.jpg&hash=8306124d865d1e7751d6755c72f0cee9c0768475)
Antes de mais o que é um RTC ou Real Time Clock? Um RTC é um dispositivo que dá horas, é verdade, conta o tempo! Todos nós os temos em casa, quer seja nos relógios digitais, na motherboard dos nossos computadores, nos telemoveis, etc..
O RTC que vou introduzir hoje é, como já disse, o DS1307 (http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2688). Este RTC comunica por i2c e tem bastantes características interessantes:
- Interface i2c;
- Conta segundos, minutos, horas, dias de semana, dias do mes, mes, ano e considera anos bissextos;
- Tem uma RAM de 56 bytes com capacidade para escritas infinitas;
- Gera sinais quadrados programaveis;
- Comuta automaticamente para a bateria se detectar falha de energia;
- Consome menos de 500 nA (nano Amperes).
A questão da alimentação da bateria é interessante, de certeza que todos sabem que nas motherboards dos nossos computadores temos la uma pilha, e "ah pois é" essa pilha é a que alimenta o RTC do nosso computador! Este integrado pode ser alimentado por uma fonte de energia normal como qualquer outro integrado mas pode ainda estar a ser alimentado por uma bateria, normalmente uma pilha de 3V como as que os nossos computadores têm na motherboard (CR2032 por exemplo)! Este integrado se detectar que a fonte de alimentação não está presente comuta automaticamente para a bateria e passa a funcionar com a energia da bateria. Com uma destas pilhas totalmente carregada, o integrado matém-se a contar o tempo durante pelo menos 9 anos, "cool" não é? Ah, mas atenção, a bateria é obrigatória!
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fitp.nyu.edu%2Fphyscomp%2Fuploads%2Fbattery_coin.jpg&hash=421f36b30720fb7dd68fc95b68ffb9dd5eea7717)
O funcionamento do RTC, muito sucitamente, é o seguinte:
- Ligar;
- Alimentar com bateria;
- Definir data de arranque;
- Iniciar;
- Ler data!
Eehe até parece simples... E é! Claro que se começarmos a ler o Datasheet do DS1307 (http://datasheets.maxim-ic.com/en/ds/DS1307.pdf) até nos assustamos com tanta informação e realmente interpretar aquilo é chato e massador! Por um lado é bom pois qualquer dúvida ou informação que queiramos saber está lá explicada, por outro lado é chato pois podiam fazer um guia mais simples do funcionamento do integrado em vez de colocarem a informação toda no mesmo documento.
Entrando em mais promenores mas sem aprofundar muito (Ai não, queriam a papinha toda não era?! Seus malandros) como este dispositivo tem interface I²C (http://en.wikipedia.org/wiki/I%C2%B2C) não nos podemos esquecer das resistências de Pull-Up do canal! Se ainda não tiverem nenhum dispositivo i²c na vossa breadboard tem de colocar duas resistências na vossa montagem, caso contrário já têm as resistências colocadas (se não nem sei como funciona o vosso dispositivo) e então é so encaixarem lá o vosso novo integrado, o RTC!
Para o cristal... pois é, é aqui que a "porca torce o rabo", o cristal que se usa com este RTC e com todos os outros RTC's (sim na motherboard está lá um mas nem pensem em tirá-lo para o bem da vossa "mobo"!) é um cristal com a frequência de 32.768KHz. É dificil de encontrar à venda nas lojas, pelo menos aqui em Lisboa, mas online encontra-se bastante facilmente e em casa também.... "O QUÊ EM CASA?" Ah pois é "bébés" em encontrei o meu num brinde do chinês, daqueles que fazem o que é suposto, não funcionar, mas que supostamente davam horas! Sim abri aquilo e tirei de lá o belo cristal de 32.768KHz ehehe mas também o podem encontrar em relógios digitais, alarmes etc., la dentro há sempre um destes cristais!
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg.en.china.cn%2F0%2F0%2C0%2C112%2C925%2C360%2C360%2Cd7476a64.jpg&hash=76e2d2bf15dcfa6953d0f9fb99f716df005793f3)
Assim, com a introdução feita, vamos ver como são as ligações:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi240.photobucket.com%2Falbums%2Fff159%2Fsuper-mascarada%2Frtc-1.jpg&hash=5718d86e9daf3e9d465c9601c86f50946157cc74)
Mais uma vez, A bateria é obrigatória e portanto o RTC não funciona sem a ter ligada! Eu aproveito o pino de 3V do Arduino!
Em anexo deixo um código que vai enviar a data "actual" por Serial, o código está bastante comentado e se seguirem os comentário fica fácil de entender. Vai também um ficheiro "ds1307.pde" com as rotinas que fiz para comunicar com o RTC. Basiei-me em código que vi em sites da internet mas que alterei de forma a respeitar o Datasheet do DS1307 (http://datasheets.maxim-ic.com/en/ds/DS1307.pdf) e que também optimizei. Creio que é bastante fácil de entender e se tiverem dúvidas do porquê "disto e daquilo", se não estiver em comentário deixo-vos o desafio de irem consultar o datasheet :D!
Tenham atenção à função "ds1307setup();", esta função só é necessária na primeira vez que ligam o RTC, se o alimentarem com uma pilha de 3v ou bateria nunca mais precisam desta função! Isto porque a função o que faz é preparar o RTC, definir a data de arranque e mandar o RTC contar o tempo, uma vez que ele nunca mais vai perder energia (pois tem uma bateria ligada) nunca vai parar de contar. Se por acaso lhe tirarem a alimentação, precisam de executar a função da próxima vez que o ligarem.
Agora para o fim digo-vos que a Sparkfun (http://www.sparkfun.com/commerce/categories.php) vende um KIT com este RTC já com as resistências de i2c, com o cristal e pilha de 3V, tudo bonitinho sendo so preciso ligar dois fios de alimentação e os dois fios para comunicar:
http://www.sparkfun.com/commerce/product_info.php?products_id=99 (http://www.sparkfun.com/commerce/product_info.php?products_id=99)
É claro que comprar isto, além de ser caro, não mete piada nenhuma porque já vem tudo feito! Mas para quem não gosta de se divertir a ligar coisas e tem dinheiro para gastar...
Eu mandeir vir samples deste RTC do site da Maxim e aqui está o link de Samples de DS1307 (http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2688/t/or). Mandem vir o DS1307+, este é PDIP 8, ou seja tem 8 pinos e dá para encaixar na breadboard. O '+' significa que é RoHS Lead Free e daí dar para vir para a Europa (Se não for RoHs não podem enviar para cá, regras da U.E. e acho bem)!
Bom... código em anexo leiam com atenção e ainda se podem rir :D
Exemplo de output do programa:
Sao: 23:15:15 Quinta-feira dia 12 de Marco de 2009
Sao: 23:15:16 Quinta-feira dia 12 de Marco de 2009
Sao: 23:15:17 Quinta-feira dia 12 de Marco de 2009
Cumprimentos! ;)
Contribuição do metRo_ RTC + PCD8544 (http://lusorobotica.com/index.php/topic,681.msg6034.html#msg6034)
como posso encontrar o valor dele? há algum medidor?
um medidor da frequência de cristais:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fblog.makezine.com%2F_art_pics_AVR_freq_overall.jpg&hash=bc6751012bf8cb80a158d5bc59be7a5138968064)
http://blog.makezine.com/archive/2008/08/how_to_build_a_frequency.html ;)
tava pra criar um novo post pra isto :D