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ę.
1 Odpowiedź
[…] były w RTC, czyli Real Time Clock (inaczej jest w Raspberry czy Banana Pi o czym pisałem tutaj: Obsługa zewnętrznego RTC w Banana Pi). Jest to układ, który jest po prostu zegarem. Bateria w komputerze (często CR2032) służy nie […]