Raspberry i Banana Pi

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:

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

hwclock -r -f /dev/rtc0

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:

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:

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:

apt-get update && apt-get install i2c-tools

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

i2cdetect -y 2

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:

modprobe mod-ds1307

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:

apt-get install linux-image-4.4-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:

i2cdetect -y 1

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

modprobe mod-ds1307

No jest. Dopiszmy urządzenie:

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

I jeszcze raz i2cdetect -y 1:

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

ls /dev/rtc*

Jest – obecny jako rtc1, odczytajmy z niego czas:

hwclock -r -f /dev/rtc1

I dla porównania godzina systemowa:

date

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

hwclock -w -f /dev/rtc1

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

hwclock -s -f /dev/rtc1

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

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s -f /dev/rtc1

czyli wygląda to tak:

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.

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ę.

Wojtek

Zobacz komentarze

Ostatnie posty

Alternatywny firmware do programatora USBasp

Po co alternatywny firmware do programatora usbasp? Otóż posiada on jedną, użyteczną przewagę nad oryginalnym…

3 tygodnie temu

Linux na routerze z obsługą kamerki internetowej

Dziś lekki, wakacyjny wpis. Od dawna, na używanych przeze mnie routerach, instalowałem linuksa. Było o…

2 miesiące temu

Słuchanie stacji radiowych DAB+ w Linuksie

Radio nieodłącznie kojarzy się z nieśmiertelnym FM lub transmisją intermetową. Standard DAB+ wydaje się być…

6 miesięcy temu

Tani odpowiednik baterii 9V 6F22

Poniżej opiszę odpowiednik drogiej (w stosunku do pojemności) baterii 9V o oznaczeniu 6F22. Ze względu…

7 miesięcy temu

Drogowa / budowlana lampa ostrzegawcza – budowa i działanie

Widząc migającą na pomarańczowo lampę ostrzegawczą, zastanawiałem się (ciekawe czy tylko ja) jak jest zbudowana,…

7 miesięcy temu

ConsolePi – genialny serwer szeregowej konsoli

W tym wpisie przedstawię bardzo ciekawe narzędzie na RaspberryPi, przydatne każdemu administratorowi urządzeń sieciowych. W…

7 miesięcy temu