Obsługa zewnętrznego RTC w Banana Pi

Małe komputerki jednopłytkowe najczęściej nie posiadają zegara czasu rzeczywistego z podtrzymaniem, tak jak ma to miejsce w „dużych” komputerach czy laptopach. Zastosowano tam półśrodek – tzw. fake hwclock. Na szczęście można łatwo podłączyć i w miarę szybko skonfigurować RTC z podtrzymaniem bateryjnym lub za pomocą niskonapięciowego superkondensatora. Takie rozwiązanie na przykładzie Banana Pi i systemu Bananian 16.04 przedstawię poniżej.

Czas w Banana Pi

Na początek warto określić zegary, z jakimi mamy do czynienia – będzie to zegar systemowy i sprzętowy zegar czasu rzeczywistego (RTC – Real Time Clock). Jeśli w systemie mamy RTC z podtrzymaniem podczas zaniku zasilania, to zegar systemowy powinien synchronizować się z zegara sprzętowego. Tak to działa w PC. W Banana Pi mamy do dyspozycji RTC, ale nie jest on podtrzymywany po wyłączeniu zasilania. Na płytce znajdziemy jednak miejsce na wlutowanie kondensatorka – pole BAT1:

Bateria do rtc bpi

Zegar ten jest dostępny pod /dev/rtc0, można z niego odczytać czas wydając komendę:

Standardowo system korzysta jednak z wspomnianego wyżej fake-hwclock. Działa on w ten sposób, że zapisuje co godzinę i podczas wyłączania systemu bieżący czas do pliku /etc/fake-hwclock.data, a podczas bootowania odczytuje go i ładuje do zegara systemowego. Czyli wyłączając Banana Pi o 22.00 i włączając o 9.00, czas systemowy zostanie ustawiony na ostatnio zapisany, czyli 22.00. Jeśli urządzenie posiada dostęp do serwera czasu NTP (domyślnie skonfigurowany z internetu), to zegar systemowy zostanie zaktualizowany poprawnym, bieżącym czasem i problemu nie ma. Brak dostępu do NTP można zastąpić wbudowanym rtc z podpiętą bateryjką, licząc się z większą lub mniejszą odchyłką od bieżącej godziny w przyszłości, lub jak niżej, zastosowaniem zewnętrznego, precyzyjnego zegara RTC z bateryjnym podtrzymaniem, opartego na układzie DS3231.

Podłączenie zegara na DS3231 w Banana Pi

Do Banana Pi można podłączyć zegar RTC w postaci dedykowanego modułu na DS3231. Jest to maleńka płytka z układem:

Zegar RTC do BananaPi

Taki moduł kosztuje ok. 2$ do 5$ za oryginał, można też kupić znacznie taniej płytkę z DS3231 i pamięcią EEPROM 24C32 za około 0,7-1$ i podłączyć za pomocą kabelków:

DS3231 do BananaPi

U mnie czerwony to +3,3V, czarny to masa, żołty SCL, niebieski SDA. Moduł posiada opisane piny, do Banana Pi przydatna będzie rozpiska gniazda.

Obsługa RTC na DS3231 w Banana Pi i Bananian 16.04

Cały poniższy opis dotyczy płytki Banana Pi M1 i systemu Bananian 16.04. Po wystartowaniu systemu z podłączonym modułem RTC zaczynamy od zainstalowania i2c-tools:

Teraz możemy sprawdzić, czy nasz zegar jest wykrywany na magistrali I²C:

Mamy dwa urządzenia: pamięć EEPROM pod adresem 0x57h i zegar na DS3231 pod 0x68h.

Teraz sprawdźmy, czy mamy moduł ds1307, którym obsłużymy zegar:

No i lipa, nie ma. Rozwiązania są dwa: dokompilować do jądra brakujący składnik, lub idąc za radą ze strony: https://dev.bananian.org/view.php?id=108 skorzystać z kernela w wersji 4.X. Druga opcja wydaje się szybsza na czas testów. Jeśli zależy nam na stabilnym środowisku, lepiej dokompilować moduł. Instalacja jądra:

Nowe jądro bananian

Po zakończeniu procesu instalacji robimy restart systemu.

Jeszcze raz sprawdzamy, czy zegar został wykryty na i²C, tym razem polecenie wygląda tak:

Polecenie i2c-detect

OK, to teraz sprawdźmy obecność modułu DS1307:

ds1307 modprobe

No jest. Dopiszmy urządzenie:

I jeszcze raz i2cdetect -y 1:

Dopisane ds3231

I sprawdźmy, czy zegar jest dostępny w systemie:

rtc0 rtc1 dev

Jest – obecny jako rtc1, odczytajmy z niego czas:

I dla porównania godzina systemowa:

Data i hwclock

Jeśli czas systemowy jest aktualny, warto go zapisać do naszego RTC:

Jeśli chcemy czas systemowy zsynchronizować z RTC, polecenie wygląda tak:

Teraz warto ustawić synchronizację czasu systemowego z rtc przy starcie systemu. W tym celu do pliku /etc/rc.local przed exit 0, dopisujemy:

czyli wygląda to tak:

Plik rc.local

Teraz sprawdźmy, czy wszystko działa. Najpierw wyświetlamy czas systemowy (date) i zapisujemy do niego nieaktualny czas (date –set=”2000-01-01 0:00:00″), wyświetlamy czas systemowy (date) i dla porównania z rtc1 (hwclock -r -f /dev/rtc1). Robimy restart systemu (reboot), logujemy się ponownie i sprawdzamy czas systemowy i ten z zegara czasu rzeczywistego.

Sprawdzenie RTC w Banana

Jak widać – działa :).

Podsumowanie

Problem z brakiem RTC podtrzymywanego bateryjnie dość łatwo można rozwiązać. Zastosowanie może być różne, np. w sieci lan dla monitoringu, kontroli dostępu i systemu alarmowego bez fizycznego połączenia z internetem, banana pi z rtc może być serwerem ntp dla rejestratora i pozostałych urządzeń, gdzie czas wystąpienia zdarzenia odgrywa kluczową rolę.

Dodaj komentarz