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 :)
„date -s „$(wget -qSO- –max-redirect=0 google.com 2>&1 | grep Date: | cut -d’ ’ -f5-8)Z””
Po co taka dziwna metoda, jak można użyć NTP?
Ja np. nie miałem NTP zainstalowanego na RPi (mimo, że poradnik pisałem zaczynając od czystego raspbiana w pełnej wersji), więc uznałem że nie ma sensu instalować dodatkowego softu jak tylko jednorazowo potrzebujemy zsynchronizować datę.