Raspberry Pi – Konfiguracja sprzętowego zegara RTC

Z reguły moje Raspberry służy mi w roli serwerów przeróżnych usług, do któych mam dostęp w sieci LAN oraz przez VPN. Zdarza się jednak, że musimy wykorzystać moc malinki w miejscu gdzie nie ma dostępu do internetu. Wtedy okaże się, że kiedy komputer straci zasilanie to przestanie odliczać czas. Spowodowane jest to tym, że twórcy Raspberry Pi w celu zmniejszenia kosztów produkcji zrezygnowali z wyposażenia płytki w moduł zegara czasu rzeczywistego, który byłby podtrzymywany bateryjnie. A skoro nam nie dali to musimy sobie zrobić sami :)

Zanim przystąpimy do pracy musimy zaopatrzyć się w moduł DS3231. Istnieją oczywiście inne zegarki wspierane przez Raspbiana, ale mój wybór padł na ten konkretny z uwagi na bardzo dużą dokładność (maksymalnie minuta odchyłki w skali roku) oraz przystępną cenę. Moduł ten posiada w sobie wbudowany rezonator kwarcowy, termometr do kompensacji temperatury (m.in. dzięki niemu mamy tak wysoką dokładność) oraz dodatkowy układ pamięci EEPROM do którego możemy zapisać 32 KB danych.

Podłączenie modułu

Moduł należy podłączyć do Raspberry Pi wg. poniższego schematu:

Konfiguracja

UWAGA, wszystkie poniższe polecenia będziemy wykonywali poprzez sudo!

Tak jak zawsze pierwszym krokiem będzie odświeżenie repozytoriów i paczek. Wpisujemy więc jako administrator do konsoli:

apt-get update
apt-get upgrade

Teraz możemy zainstalować paczkę o nazwie i2c-tools:

apt-get install i2c-tools

Zanim jednak spróbujemy wykryć jakieś urządzenia podłączone do magistrali I2C musimy upewnić się, że jest ona włączona w systemie. W tym celu uruchamiamy

raspi-config

Wybieramy opcję numer 5, czyli Interfacing Options, a następnie I2C. Program zapyta nas, czy chcemy włączyć interfejs I2C, na co odpowiadamy twierdząco i wychodzimy z konfiguratora.

Teraz za pomocą programu i2c-detect możemy wykryć urządzenia podłączone do magistrali. W tym celu wpisujemy

i2cdetect -y 1

no chyba, że mamy stare RPi 1 – wtedy musimy wpisać

i2cdetect -y 0

Powinniśmy otrzymać mniej więcej taki wynik:

Jeżeli widzimy na tej liście adres 68, to bardzo dobrze. Oznacza to, że zegar został wykryty. Jeżeli nie widzimy takiej liczby to należy sprawdzić połączenia i upewnić się, że moduł DS3231 jest sprawny.

Teraz sprawimy, aby system połączył się z zegarem i potrafił się z nim komunikować. W tym celu przejdźmy do edycji pliku /boot/config.txt.

nano /boot/config.txt

i na samym końcu dopiszmy

dtoverlay=i2c-rtc,ds3231

Po zapisaniu pliku i wyjściu z edytora uruchamiamy ponownie system malinki:

shutdown -r now

Teraz możemy ponownie wywołać program i2cdetect. Tym razem powinien zwrócić nam taki wynik:

Jak łatwo zaważyć adres 68 zmienił się w UU. Oznacza to, że system poprawnie skomunikował się z zegarem i zastrzegł ten adres.

Możemy teraz pozbyć się z systemu programu fake-hwclock, który zapisuje czas systemowy podczas wyłączania maliny i przywraca go kiedy zbootujemy system od nowa (lepsze to niż po każdej utracie zasilania mielibyśmy rok 1970 ;) ). W celu odinstalowania oszukańczego zegara wpisujemy w konsolę następujące komendy:

dpkg --purge fake-hwclock 
update-rc.d -f fake-hwclock remove

Teraz trzeba zedytować plik /lib/udev/hwclock-set. Wpisujemy więc

nano /lib/udev/hwclock-set

I komentujemy następujące linie:

if [ -e /run/systemd/system ] ; then
 exit 0
fi

za pomocą znaku # na początku każdej z nich.

Podstawowe polecenia do ustawiania daty

Aktualny systemowy czas możemy sprawdzić za pomocą polecenia date.

Jeżeli czas jest poprawny możemy zapisać go do RTC za pomocą polecenia

hwclock -w

W celu odczytania zapamiętanej przez sprzętowy zegar godziny należy wydać komendę

hwclock -r

Jeżeli chcemy ustawić w zegarku inną godzinę wystarczy, że wpiszemy

hwclock --set --date="DATA"

gdzie DATA to ciąg znaków np. 15-11-2017 11:56:20.

Poleceniem hwclock -s możemy ustawić w systemie czas pobrany z zegara sprzętowego.

Pobranie daty z internetu

Jeżeli w danym momencie mamy dostęp do internetu możemy wykonać następujące polecenia w celu zsynchronizowania zegara:

date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
hwclock -w

Pobranie czasu z RTC podczas startu systemu

Aby nasze Raspberry zawsze pobierało czas z zegara RTC należy w pliku /etc/rc.local dopisać polecenie hwclock -s.

Ważne, aby znajdowało się ono przez instrukcją exit 0.

Teraz po każdym uruchomieniu malinki będzie ona pobierała czas ze sprzętowego zegarka. Nie zapomnijcie tylko włożyć do niego baterii :)