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

Słuchanie stacji radiowych DAB+ w Linuksie

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

2 tygodnie temu

Tani odpowiednik baterii 9V 6F22

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

4 tygodnie 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,…

1 miesiąc temu

ConsolePi – genialny serwer szeregowej konsoli

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

2 miesiące temu

Adapter USB-HDMI Grabber Video

Poniżej opiszę mały, przydatny gadżet, który przechwytuje obraz i dźwięk z portu HDMI i przekazuje…

2 miesiące temu

Przejściówka USB-RS232 PL2303HXA PHASED OUT SINCE 2012

Tytuł tego wpisu zawiera część komunikatu z menedżera urządzeń systemu Windows 11, po wsadzeniu w…

2 miesiące temu