Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Zegar RTC w Raspberry Pi

Zegar czasu rzeczywistego (RTC) znajduje się w niemal każdym urządzeniu, zaczynając od aparatów cyfrowych, smartfonów, tabletów, kończąc na komputerach i serwerach. Dzięki zegarowi RTC nasze urządzenia mają aktualną godzinę nawet gdy nie są podłączone do zasilania. Niestety, popularny Raspberry Pi jest pozbawiony zegara czasu rzeczywistego a czas pobiera z internetu podczas uruchamiania, a co jeśli nasze urządzenie nie ma połączenia z internetem? Tu właśnie przydaje się zegar RTC.

Moduł zegara RTC

Opiszę sposób komunikacji oraz obsługi modułu zegara RTC z układem DS1307 poprzez protokół I2C.

Parametry modułu Tiny RTC

  • Zasilanie : 5V
  • Komunikacja: I2C
  • Pomiar: Rok, Miesiąc, Dzień tygodnia, Dzień miesiąca, Godzina, Minuta, Sekunda
  • Pobór prądu: 500nA
  • Pamięć nieulotna: 32kbit (24C32) + 56 bit (DS1307)
  • Koszt: 11-20zł

Schemat podłączenia

Do modułu należy dolutować goldpiny oznaczone modułem P1 (SDA, SCL, VCC, GND, reszta nie jest nam potrzebna)
Moduł zasilamy napięciem 5V oraz łączymy złącza SCL i SDA.

Konfiguracja

Zaczniemy najpierw od aktualizacji systemu a następnie aktualizacji firmware-u.sudo apt-get update && sudo apt-get upgradesudo rpi-updatena koniec restartujemy malinę.

Instalujemy potrzebne pakiety

sudo apt-get install i2c-tools libi2c-dev

Następnie za pomocą narzędzia raspi-config włączamy obsługę i2c

sudo raspi-config

Wchodząc odpowiednio do Advence Option>I2C wybieramy dwukrotnie "YES"

A następnie restartujemy malinę

sudo reboot

Wykrywamy nasz moduł

sudo i2cdetect -y 1

Nasz moduł RTC posiada adres 68 oraz 50, ale drugi adres jest przeznaczony dla pamięci EEPROM i nie będziemy go używać.

Jeśli posiadamy jeszcze starą malinę rev1 zamiast 1 podajemy 0 czyli i2cdetect -y 0

Jeśli wyskoczą jakieś błędy należy się upewnić czy mamy w pliku /etc/modules dodane wpisy:

  • i2c-bcm2708
  • i2c-dev
Jeśli ich brakuje należy je dodać.

Załadowujemy moduł zegara

sudo modprobe rtc-ds1307

A następnie jako root wykonujemy polecenie

sudo bash

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

Jeśli posiadamy jeszcze starą malinę (rev1) to zamiast i2c-1 podajemy i2c-0

Wychodzimy wpisując

exit

Teraz sprawdzimy datę i godzinę z naszego modułu DS1307

sudo hwclock -r

oraz datę i czas z systemu

date

Jak widać obydwie daty różnią się między sobą. Aby zapisać datę z systemu do naszego modułu wystarczy wykonać polecenie

sudo hwclock -w

, które zapisuje datę i godzinę do modułu. Teraz po ponownym odczycie z modułu i systemu powinniśmy mieć identyczne datę i godzinę.

sudo hwclock -r && date

Jeśli wszystko nam już działa to warto dodać moduł zegara, aby ładował się wraz z uruchomieniem systemu. Wpisujemy polecenie

sudo nano /etc/modules

i dodajemy poniższą linijkę

rtc-ds1307

Następnie otwieramy plik /etc/rc.local

sudo nano /etc/rc.local

i dodajemy poniższe linijki

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device sudo hwclock -s

Przed linijką

exit 0

Polecenie hwclock -s synchronizuje czas pobierając go z RTC do Maliny.

Od teraz przy każdym restarcie bez podłączonego internetu będziemy mieli aktualny czas.

Wpis powstał z potrzeby dodania zegara RTC do mojego robota Gimli.

 

linux sprzęt hobby

Komentarze

0 nowych
okokok   12 #1 02.04.2015 22:06

Fajnie to opisałeś! Mam ten moduł, może później spróbuję to odpalić :-)

cyryllo   17 #2 02.04.2015 22:09

@okokok: Ja mam ten moduł od ponad roku i wreszcie doczekał się podłączenia ;)

mordzio   15 #3 02.04.2015 22:11

@cyryllo: To tak jak ja, kupiłem kilka modułów i teraz leżą w szufladzie.

wojtekadams   18 #4 02.04.2015 22:25

Heh ;) bardzo fajny wpis. Kilka dni temu też miałem starcie z podobnym modułem. A dzisiaj wskrzeszam RTD1195 ;)

cyryllo   17 #5 02.04.2015 22:26

@wojtekadams: to coś tam narobił? Wgrywałeś jakiś obraz?

wojtekadams   18 #6 02.04.2015 22:34

@cyryllo: już mam Androida 4.4 :)

Autor edytował komentarz.
SpeX   7 #7 03.04.2015 01:14

A mi by się przydał moduł do radiowej aktualizacji czasu (z zegara atomowego) :/

  #8 03.04.2015 06:33

@SpeX: Zbudować samemu na bazie prostego układu.
http://www.jm.pl/page,nowosc_produktowa,id_n,302,mas-micro-analog-systems-oy-mas...
Gotowce są na Allegro.

cyryllo   17 #9 03.04.2015 07:14

@SpeX: jest taki układ DCF77 koszt ~15$.

zoolek   3 #10 03.04.2015 07:46

Coś mi tu nie gra. sudo na koncie root ?

cyryllo   17 #11 03.04.2015 08:18

@zoolek: Ja używam minibiana i tam jest tylko konto root-a, ale używając raspbiana musisz użyć sudo, chyba że przelogujesz się na roota sudo su

Autor edytował komentarz.
  #12 03.04.2015 15:40

RTC nie dokonuje pomiaru czasu, jedynie go zlicza

rm7   5 #13 03.04.2015 15:44

@cyryllo: Zamiast sudo su można użyć sudo -s (s jak shell).

@GUTEK@   5 #14 04.04.2015 17:31

Też się zastanawiałem nad podpięciem takiego DS1307 pod malinkę, tylko z drugiej strony po co. Skoro to ma i tak dostęp do internetu i się synchronizuje z ntp. Taki RTC miałby sens przy czymś prymitywniejszym, bez ciągłego dostępu do internetu. To już bardziej przydatne byłoby podpięcie jakiegoś zegar co "ściąga" sygnał DCF77.
Także puki co na i2c u mnie pozostaje jedynie BMP180 :)

  #15 04.04.2015 18:51

Jest:
"Zasilanie : 5V"

Powinno być:
Zasilanie : 3V

cyryllo   17 #16 04.04.2015 23:50

@zgred123 (niezalogowany): układ DS1307 ma w specyfikacji podane 5V więc ma być 5V :) źródło: http://www.dipmicro.com/?datasheet=DS1307.pdf

@@@GUTEK@ No jeśli czas nie jest dla Ciebie ważny to po co ci ten układ? ;)

Autor edytował komentarz.
  #17 21.06.2015 17:39

@cyryllo: Masz może możliwość sprawdzić jak działa ten moduł z RPi2? U mnie mierzy czas 6x szybciej i nie bardzo wiem jak to ugryźć:/

cyryllo   17 #18 21.06.2015 23:13

@Anonim (niezalogowany): mam RPi2. W wolnej chwili sprawdzę

  #19 30.06.2015 19:15

Dzięki za dobre chęci. Ten moduł musiałbyć uszkodzony. Nie ma tego złego, za grosze dostałem coś takiego i działa:) http://www.switchdoc.com/ds3231-real-time-clock-module/

cyryllo   17 #20 01.07.2015 07:11

@Anonim (niezalogowany): każdy jest za grosze ;)

  #21 18.11.2015 10:29

Ciut odkopuję.
Czy RPI nie ma GPIO na poziomach 3,3V a RTC 5V? Nie spalę maliny? Chyba potrzebuję logiclevel na jakimś bss123?n Czy to działa - bo działa?

  #22 18.11.2015 10:57

Jednak najwyraźniej trzeba usunąć rezystory podciągające do 5V. np. jeden z podobnych opisów: https://learn.adafruit.com/downloads/pdf/adding-a-real-time-clock-to-raspberry-p...
Dodatkowo widziałem na czyimś blogu (niestety wypadło mi z RAMu gdzie), że trzeba zazwyczaj usunąć (wylutować,przerwać) na takim module identycznie wyglądającym ładowanie akumulatora (LIR2032!) by wsadzić zwykłą baterię CR2032. Na WWW sprzedają te tiny rtc z ..bateriami (lub piszą w opisie o baterii) - ja tak kupiłem, a na płytce mam te ładowanie (dioda+rezystory) jak drut.

  #23 07.05.2016 14:23

mam dwa różne moduły ds3231. Nie rozumiem w jaki sposób udało ci się uzyskać rzeczywistą datę po restarcie malinki. Wszelkie wcześniejsze ustawienia daty znikają!. Nie ważne że jest to układ 1307 czy ds 3231. Podejrzewam raczej, że nie usunąłeś "fake-hwclock" i stąd ta cała zmyłka, że Ci pokazuje poprawny czas. Czas jest zawsze opóźniony od rzeczywistego ponieważ fake-hwclock zapisuje czas do pliku, by później od niego rozpocząć odliczanie. Te układy RTC to blef. To nie rtc działa poprawnie tylko wymyślony przez programistę fake-hwclock

Wpisanie polecenia: sudo i2cdetect -y 1 niczego nie wnosi, tylko informuje pod jakim adresem działa zegar.
Po drugie nie wyjaśniłeś po co jest to:
ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device.
To polecenie przygotowuje RTC do pracy.
Wpisz ponownie polecenie
sudo i2cdetect -y 1, a zobaczysz że zamiast adresu 68 masz dwie literki UU.