LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

Pierwsze kroki z Raspberry Pi: jak dodać RTC?

Jedną z najczęściej wymienianych wad zestawu Raspberry Pi jest brak sprzętowego układu RTC, który umożliwiał by poprawne odtworzenie czasu systemowego w przypadku, gdy żadne inne źródła synchronizacji (jak np. serwer NTP) nie są aktualnie dostępne. Brak układu RTC na płycie PCB komputerka Raspberry Pi został najprawdopodobniej podyktowany chęcią uzyskania przez projektantów minimalnego rozmiaru urządzenia, a zarazem pozwolił ograniczyć koszty jego budowy. Tym samym jednak, projektanci Raspberry Pi zostawili nam kawałek bardzo ciekawej pracy sprzętowo-programistycznej, której przebieg, krok po kroku, przedstawiono w niniejszym artykule.

 

1) Sprzętowy zegar RTC – czy to jest nam potrzebne?

Zanim rozpoczniemy proces implementacji i obsługi sprzętowego zegara RTC w Raspberry Pi warto zastanowić się, czy jest on dla nas niezbędny? Większość użytkowników RPi  może nie zauważyć tego istotnego ograniczenia, ponieważ duża liczba „malinek” jest na stałe podłączona do Internetu (choćby ze względu na fakt, że to transmisja ssh jest najpopularniejszą formą komunikacji z minikomputerkiem). Przy każdym starcie systemu Raspbian, czas systemowy jest synchronizowany przez pracujący w tle, dedykowany deamon serwera czasu NTP (ntpd).

pi@raspberrypi ~ $ ps ax | grep ntpd
 2036 ?        Ss     0:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 102:104
 2287 pts/0    S+     0:00 grep --color=auto ntpd

Dzięki ntpd, czas systemowy jest zawsze aktulany, o czym możemy się przekonać za pomocą polecenia date:

pi@raspberrypi ~ $ date
Sat Mar  1 14:35:00 UTC 2014

Jeżli komunikujemy się z RPi poprzez interfejs szeregowy, problem z aktualizacją czasu systemowego zuważymy tuż po odłączeniu kabla sieciowego i ponownym uruchomieniu Raspberry Pi. Jeżli jednak do pracy w terminalu używamy połączenia ssh, problem z synchroniazacją możemy zasymulować poprzez wyłączenie daemona ntpd:

/etc/init.d $ sudo update-rc.d ntp disable

Dokonajmy teraz nieprawidłowej modyfikacji daty systemowej:

pi@raspberrypi ~ $ sudo date -s "2 OCT 2014 18:00:00"
Thu Oct  2 18:00:00 UTC 2014
pi@raspberrypi ~ $ date
Thu Oct  2 18:00:02 UTC 2014

Jak można łatwo zauważyć po ponownym uruchomieniu Raspberry Pi, data systemowa wciąż jest niepoprawna, ponieważ domyślnie uruchamiany wraz ze startem systemu daemon ntpd został wyłączony. Odblokujmy ponownie domyślne uruchamianie ntpd i zrestartujmy Raspberry Pi:

pi@raspberrypi ~ $ sudo update-rc.d ntp enable
update-rc.d: using dependency based boot sequencing
pi@raspberrypi ~ $ sudo reboot

Jak można się przekonać po ponownym uruchomieniu minikomputera, aplikacja ntpd spełnia powierzoną jej funkcję. Sytuacja jednak nie wygląda już tak dobrze, jeżeli w realizowanym przez nas projekcie, urządzenie finalne ma pracować w warunkach braku dostępności Internetu, a czas systemowy jest niezwykle istotny (choćby na przykład ze względu na tworzony przez urządzenie dziennik systemowy). Co wówczas?

Jedynym wyjściem z sytuacji jest dołączenie sprzętowego zegara RTC z podtrzymaniem bateryjnym. Kontynuując przyjętą w poprzednio prezentowanych artykułach konwencję, w której ten sam efekt finalny można osiągnąć dwiema drogami, również i w tym artykule przedstawione zostaną dwie metody skonfigurowania zestawu Raspberry Pi do współpracy ze sprzętowym modułem RTC – DS1307 (w niniejszym artykule wykorzystano zestaw modRTC dostępny w KAMAMI.pl, jednak całą przedstawioną poniżej procedurę można zrealizować z dowolnym układem RTC, dobierając wyłącznie odpowiedni sterownik w jądrze systemu Linux – niezależnie od wybranego układu, programowa obsługa w przestrzeni użytkownika jest niezmienna). Pierwsza z przedstawionych opcji sprowadza się wyłączenie do edycji odpowiednich plików konfiguracyjnych/startowych umożliwiających automatyczne załadowanie modułów jądra oraz wykrycie dołączonego sprzętu. Druga z opcji – bardziej czasochłonna i złożona, jednak z cennym walorem edukacyjnym, przedstawia konfigurację i kompilację jądra systemu Linux z włączonymi „na stałe” modułami obsługi zegara RTC, co pozwala uniknąć wprowadzania jakichkolwiek zmian w plikach przestrzeni użytkownika.

 

2) Przygotowanie dystrybucji Raspbian

Całośc poniżej przedstawionej procedury została zrealizowana na najnowszej wersji dystrybucji Raspbian dostępnej do pobrania pod adresem:

http://www.raspberrypi.org/downloads

Po zainstalowaniu systemu, warto zadbać o aktualizację wszystkich dostępnych pakietów:

sudo apt-get update
sudo apt-get -y dist-upgrade

W przypadku gdy zdecydujemy się na kompilację jądra systemu Linux bezpośrednio na Raspberry Pi (szczegóły przedstawiono w kolejnych rozdziałach), wówczas musimy doinstalować w systemie następujące pakiety:

apt-get -y install gcc make bc screen ncurses-dev

 

4) Połączenia sprzętowe – moduł modRTC (układ DS1307)

Większość dostępnych na rynku układów zegara RTC to moduły komunikujące się za pomocą interfejsów szeregowych SPI lub I2C. W niniejszym artykule skupiliśmy się na układach pracujących pod kontroloą magistrali I2C. Sposób dołączenia typowych układów I2C do zestawu Raspberry Pi został przedstawiony w artykule – „Pierwsze kroki z Raspberry Pi: obsługa magistrali I2C na przykładzie LED RGB”. Przy podłączeniu urządzenia warto zwrócić uwagę na wykorzystywaną wersję płytki, ponieważ w zależności czy jesteśmy posiadaczami urządzenia w wersji rev.1 czy rev.2, w tym samym miejscu na złączu wyprowadzeń umieszczono interfejs i2c-0 lub i2c-1 (o wybranych różnicach pomiędzy płytkami przeczytasz w artykule „Raspberry Pi – różnice między wersjami”).

W przypadku dołączenia modRTC należy zwrócić uwagę, że na płytce modułu umieszczony został układ DS1307 przystosowany do zasilenia napięciem +5 V. Rezystory zamontowane na płytce modułu realizują „podciąganie” magistrali również do wartości tego napięcia, stąd bezpośrednie dołączenie do wyprowadzeń GPIO mogło by spowodować uszkodzenie RPi. Wyjściem z sytuacji jest zastosowanie układu DS1337 (przystosowanego do zasilania napięciem o wartości +3,3 V), układu DS1307 z rezystorami pull-up podłączonymi do wartości napięcia +3,3 V, lub użycie niewielkiego układu realizującego konwersję napięć na magistrali (TXS0102 lub MAX3784).

Po wykonaniu wyszystkich połączeń sprzętowych, dla kontroli ich porawności warto zainstalować:

pi@raspberrypi ~ $ sudo apt-get install i2c-tools

Za pomocą narzędzia i2cdetect (z pakietu i2c-tools) możemy zrealizować proste skanowanie wybranej magistrali I2C (i2c-1 dla Raspberry Pi rev.2):

sudo i2cdetect -y 1

oraz dla wersji rev.1:

sudo i2cdetect -y 0

Poprawne wykonanie połączeń sprzętowych powinno „zaowocować” znalezieniem na magsitrali urządzenia o adresie 0x68 (w przypadku wybrania układu DS1307):

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

 

Łukasz Skalski - absolwent Politechniki Gdańskiej, miłośnik FLOSS, autor książki "Linux. Podstawy i aplikacje dla systemów embedded" oraz szeregu artykułów dotyczących programowania systemów wbudowanych. Zawodowo związany z firmą Samsung. Wszystkie wolne chwile poświęca projektowaniu i programowaniu urządzeń wyposażonych w mikroprocesory 8-/16- i 32-bitowe. Szczególnym zainteresowaniem obejmuje tematykę systemu Linux w aplikacjach na urządzenia embedded.