Instalacja zegara czasu rzeczywistego w Raspberry Pi

Instalacja zegara czasu rzeczywistego w Raspberry Pi

Zegar czasu rzeczywistego (Real Time Clock - RTC) to układ elektroniczny, który mierzy rzeczywisty upływ czasu i przechowuje informacje o aktualnej godzinie i dacie. Układy takie są instalowane w komputerach i innych urządzeniach elektronicznych, aby te mogły odmierzać upływ czasu, nawet gdy samo zasadnicze urządzenie jest wyłączone.

Komputer jednopłytkowy Raspberry Pi nie jest fabrycznie wyposażony w układ czasu rzeczywistego. Oznacza to, że za każdym razem, gdy wyłączamy ten minikomputer i odłączamy od niego zasilanie 'zapomina' on jaka jest godzina. Po ponownym uruchomieniu system operacyjny musi bazować na czasie, który uzyska z innych źródeł, na przykład z sieci etc. Co jednak w przypadku urządzeń, które nie są podłączone w czasie pracy do żadnej sieci czy Internetu? Tutaj w sukurs przychodzi zegar czasu rzeczywistego - RTC.

Zegar czasu rzeczywistego to zazwyczaj układ scalony, wyposażony we własne zasilanie, który podłączony jest do komputera interfejsem cyfrowym. Własne, niezależne zasilanie - najczęściej w postaci baterii - pozwala na ciągłą pracę, nawet gdy sam komputer jest wyłączony. Interfejs cyfrowy, którym RTC połączony jest z komputerem, pozwala na przesyłanie do systemu operacyjnego informacji na temat aktualnego czasu i daty w dowolnym momencie.

W poniższym artykule zapiszemy w jaki sposób podłączyć zegar czasu rzeczywistego poprzez interfejs szeregowy I2C i w jaki sposób skonfigurować system operacyjny, aby mógł z nim współpracować. Wykorzystać możemy wiele układów scalonych, takich jak chociażby DS1307 czy DS3231 firmy Dallas-Maxim lub PCF8523, produkowany przez NXP semiconductors.

Podłączenie układu do minikomputera

Rysunek 1. Schemat przykładowego modułu zegara czasu rzeczywistego opartego na układzie scalonym DS1307

Scalony zegar czasu rzeczywistego wymaga podłączenia zaledwie kilku dodatkowych elementów, aby móc poprawnie działać. Najważniejsze to oscylator kwarcowy o częstotliwości oscylacji równej 32,768 Hz (to dokładnie 215 Hz) oraz bateria, która podtrzymywać będzie pracę zegara w czasie, gdy odłączone od modułu jest zasilanie. Schemat przykładowego modułu pokazany jest na rysunku 1. Linie SDA, SCL oraz zasilanie (+5 V) i masę podłączamy do 40-pinowego złącza rozszerzeń Raspberry Pi, zgodnie z odpowiednimi sygnałami, jak opisano w tabeli 1.

Jeśli nie chcemy samodzielnie montować takiego modułu, na rynku dostępnych jest wiele modułów ze scalonymi zegarami czasu rzeczywistego. Większość z nich wyposażona jest w złącza kompatybilne ze złączem rozszerzeń Raspberry Pi. Moduły te wyposażone są w różne układy RTC, takie jak wymienione we wcześniejszej części artykułu.

Włączenie interfejsu I2C w Raspberry Pi

Aby móc korzystać z zegara czasu rzeczywistego, podłączonego do magistrali I2C, musimy ten interfejs aktywować. Domyślnie interfejs jest dezaktywowany w systemie operacyjnym. Na szczęście można łatwo uruchomić go, nie zagłębiając się w pliki systemowe - wystarczy skorzystać z wbudowanego w Raspbiana konfiguratora systemu. W pierwszej kolejności uruchamiamy wspomniany konfigurator z uprawnieniami roota:

sudo raspi-config

W menu, które się pojawi po wpisaniu tej komendy wybieramy pozycję piątą: Interfacing Options, a następnie w kolejnym menu wybieramy, również piątą, pozycję I2C. Następnie potwierdzamy, że chcemy aktywować ten interfejs, automatycznie załadować moduł jądra i na koniec ponownie uruchomić system operacyjny. Od teraz interfejs jest już aktywny i gotowy do działania.

Po ponownym uruchomieniu się systemu operacyjnego i zalogowaniu się na konto użytkownika możemy sprawdzić, czy I2C działa. W tym celu wpisujemy w terminalu:

ls /dev/*i2c*

Na co system powinien zwrócić nam informację:

/dev/i2c-1

Konfiguracja systemu operacyjnego do współpracy z RTC

Kiedy już podłączymy moduł z zegarem czasu rzeczywistego do naszego komputera jednopłytkowego i uruchomimy interfejs I2C w systemie, możemy przejść do ostatniego kroku projektu - konfiguracji systemu operacyjnego, by poprawnie rozpoznawał dołączony układ i pobierał z niego aktualny czas systemowy.

W pierwszej kolejności zacznijmy od przetestowania naszego modułu. Aby to zrobić przeskanujmy interfejs I2C w poszukiwaniu podłączonych do niego urządzeń. Wpisujemy w terminalu komendę:

sudo i2cdetect -y 1

(Komenda ta działa na większości Raspberry Pi, jednakże najstarsze wersje pierwszego modelu tego komputera miały zamienione kontrolery interfejsu I2C i w takim wypadku wpisać musimy sudo i2cdetect -y 0.)

Wyświetli to tabelę z różnymi adresami I2C. Jeżeli pod jakimś adresem Raspberry Pi wykryje urządzenie, w pozycji tej znajdziemy rzeczony adres, inaczej system wypełni to pole dwoma myślnikami „--”. Typowym adresem, pod jakim powinniśmy zobaczyć nasz moduł jest 0x68 - w kolumnie „8” i wierszu „60” wpisana będzie liczba 68. Oczywiście, jeżeli korzystamy z innego układu RTC, niż wymienione tutaj, adres może być inny. Informacje o tym, pod jakim adresem znaleźć możemy dany układ znajdują się w jego karcie katalogowej. W ten sposób znajdować możemy także inne urządzenia I2C, dołączone do naszego Raspberry Pi.

Jeśli poprawnie wykryliśmy obecność zegara czasu rzeczywistego w naszym systemie, możemy poinformować o nim system operacyjny. Aby to zrobić, należy wpisać odpowiednią komendę w pliku konfiguracyjnym config.txt. W tym celu otwieramy ten plik w edytorze nano, wpisując w terminalu:

sudo nano /boot/config.txt

Na końcu tego pliku dodajemy, zależnie od zastosowanego zegara czasu rzeczywistego jedną z poniższych linijek:

dtoverlay=i2c-rtc,ds1307
dtoverlay=i2c-rtc,pcf8523
dtoverlay=i2c-rtc,ds3231

Teraz możemy zresetować komputer poleceniem:

sudo reboot

Po ponownym uruchomieniu komputera, system automatycznie rozpocznie korzystanie z RTC. Teraz, po wpisaniu ponownie komendy:

sudo i2cdetect -y 1

w miejscu, gdzie wcześniej widzieliśmy adres zegara czasu rzeczywistego (np. 68) teraz widoczne będzie „UU”, co oznacza adres zajęty przez moduł jądra (w tym wypadku obsługujący właśnie RTC). Możemy też manualnie pobrać czas z modułu RTC i go wyświetlić:

sudo hwclock -r
date

Jeśli data czy godzina się nie zgadza, najpierw musimy ustawić czas systemowy (oczywiście wpisując aktualną datę i godzinę):

sudo date -s "Thu Aug 9 21:31:26 UTC 2012"

a następnie zapisać go w module RTC:

sudo hwclock -s

Teraz możemy cieszyć się zawsze aktualną godziną i datą w naszym komputerze jednopłytkowym, niezależnie czy jest podłączony do sieci, czy nie.

Nikodem Czechowski

Artykuł ukazał się w
Elektronika Praktyczna
wrzesień 2019
Zobacz też
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik maj 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio czerwiec 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje maj 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna maj 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich maj 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów