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.
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.
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.
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 :).
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ę.
Mega tanie, bezprzewodowe moduły Internet of Things na dobre zadomowiły się w naszych sieciach. Od…
Pewnie nie każdy posiadacz tytułowej stacji lutowniczej wie, że posiada ona możliwość aktualizacji firmware'u. Producent…
Jakiś czas temu, przeglądając Aliexpress natknąłem się na ciekawy shield do Arduino Nano. Według opisu…
W mailach i komentarzach kilka razy przewijała się prośba o ten wpis. Chodzi o aktualizację…
Dziś tematyka audio, a nawet audiofilska. Uznany wzmacniacz słuchawkowy Lehmann Black Cube Linear o dość…
Tradycyjnie w styczniu, publikuję podsumowanie minionego roku na stronie grylewicz.pl. Poniżej trochę liczb, lista najpopularniejszych…
Zobacz komentarze