Gdy moduł Raspberry Pi podłączony jest do sieci, jest w stanie konfigurować swój zegar pobierając czas z pomocą NTP, jednakże bez podłączenia do internetu ustawienia daty i godziny będą niepoprawne. W szeregu projektów potrzebne jest dosyć precyzyjne określanie czasu, na przykład do logowania działania RPi czy monitorowanych wydarzeń.
Rozwiązaniem tego problemu jest zegar czasu rzeczywistego (RTC). Jest to niewielki moduł, wyposażony we własną baterię, która podtrzymuje działanie układu nawet gdy zasilanie jest odłączone. Moduł ten pracuje nieprzerwanie i odlicza czas, niezależnie czy zewnętrzne zasilanie jest podłączone do układu czy nie. RPi podczas każdego uruchamiania pobierać może aktualny czas z modułu RTC.
Najprostszą metodą implementacji RTC w systemie jest wykorzystanie gotowego modułu. Na szczęście moduły RTC są niedrogie i łatwodostępne. Niektóre z modułów można łączyć bezpośrednio z pinami GPIO, inne potrzebują do podłączenia kilku kabelków.
DS1307 czy DS3231?
Moduły oparte o układu scalone DS1307 i DS3231 są bardzo popularnymi zegarami czasu rzeczywistego i nabyć je można od wielu firm. Autor poradnika zakupił oba rodzaje modułów, ale dopiero po zakupie spostrzegł, że moduł oparty o układ SD1307 jest bezużyteczny w przypadku Raspberry Pi - nie działa on z zasilaniem 3,3 V. Moduł oparty o DS3231 jest dokładniejszy i bez problemu współpracuje z systemem zasilanym napięciem 3,3 V.
Usuwanie rezystorów
Większość modułów RTC I²C ogólnego zastosowania wyposażona jest w rezystory podciągające na liniach SDA i SCL, ale ponieważ do podłączenia z Raspberry Pi rezystory te nie są potrzebne - RPi ma własne - to można je usunąć, tak aby ich obecność w żaden sposób nie zakłócała działania interfejsu.
Dodatkowo, wykorzystywany moduł wbudowany ma układ ładowania akumulatora LIR2032, który można wykorzystać do zasilania zegara. Jako że autor pragnął wykorzystać zwykłą baterię, a nie akumulator, konieczne było usunięcie jednego rezystora na PCB, co wyłączyło układ ładowania.
Do usunięcia rezystorów wystarczyła lutownica z niewielkim grotem i pęseta. Na poniższym zdjęciu zaznaczono lokalizację usuniętych oporników.
Konfiguracja sprzętowa układu
Gdy Raspberry Pi jest odłączone od zasilania przyłączyć do niego można moduł, Jest to bardzo proste, jednakże warto i tak dwa razy sprawdzić podłączenia, jakie się wykonało. Linie powinny być podłączone następująco:
Na tym etapie także trzeba podłączyć do układu baterię 3 V!
Konfiguracja I²C
Tak jak w przypadku innych układów na I²C konieczne jest skonfigurowanie tego interfejsu, zanim zacznie się z niego korzystać. Konfiguracja tego portu poprzez raspi-config opisana jest w tym projekcie.
Konfiguracja modułu DS3231
Aby upewnić się, że wszystko pójdzie dobrze podczas konfiguracji powinniśmy aktualizować system przed przystąpieniem do działania:
Teraz przystąpić możemy do modyfikacji plików systemowych, wykorzystując:
Jeśli nie ma tam wpisu “rtc-ds1307″ to dodajemy go na dole, tak że konfiguracja modułów wygląda następująco:
Wychodzimy z nano zapisując plik (ctrl+x, potem y i enter).
Następnie uruchamiamy ponownie Raspberry Pi zatrzymując je z pomocą:
Odłączamy zasilanie i gotowe.
Test interfejsu
Podłączamy układ do zasilania i po załadowaniu się systemu operacyjnego w linii komend piszemy:
Jeśli wykorzystujemy płytkę RPi Rev 1 to zamiast jedynki na końcu wpisujemy 0.
Wynikiem wpisania powyższej komendy powinno być coś podobnego do tego:
W tym przypadku 68 to heksadecymalny adres zegara czasu rzeczywistego na interfejsie I²C.
Konfiguracja układu I²C
Aby upewnić się, że układ działa poprawnie i RPi dobrze synchronizuje czas z modułem RTC musimy zmodyfikować kolejny plik systemowy:
Dodajemy tam dwie linijki przed exit 0:
Tak, że otrzymujemy plik przypominający:
Uwaga - jeśli korzystamy z RPi Rev 1 to zastępujemy “/i2c-1/” “/i2c-0/”.
Resetujemy Raspberry Pi:
Gdy teraz powtórzymy komendę i2cdetect, opisaną powyżej, zamiast 68 pod tym adresem zobaczymy UU:
Strefy czasowe i zmiana czasu na letni/zimowy
Domyślnie RPi pokazuje czas jako GMT lub UTC. Dla wielu osób nie jest to czas lokalny, więc trzeba odpowiednio skonfigurować system, aby pokazywał czas lokalny. Zmieniamy konfigurację poprzez:
W programie wybieramy “Internationalisation Options” i dalej “Change Timezone”. Można teraz wybrać lokalną strefę czasową.
Odczytywanie daty i godziny
Aby odczytać datę i czas systemowy wystarczy posłużyć się komendą "date", ale jeśli chcemy ją wykorzystać np. do konfiguracji czasu, a nie jego odczytu składnia wygląda:
Po zapisaniu daty i godziny możemy ustawienia te przenieść do RTC korzystając z komendy:
Ponowny odczyt danych z modułu zegara czasy rzeczywistego możliwy jest z pomocą:
Jeśli oddzielimy komendy odczytu zegara systemowego i czasu rzeczywistego średnikiem to możemy odczytać równocześnie obie wartości, co powinno nam zwrócić coś takiego:
Komenda "hwclock -s" dodana do rc.local ustawia czas systemowy na podstawie czasu z zegara sprzętowego.
Ostatni test
Ostatnim testem pozwalającym sprawdzić, czy RTC działa poprawnie jest sprawdzenie czy informacje o czasie ładowane są podczas startu systemu operacyjnego Raspberry Pi. Aby przeprowadzić taki test wystarczy po kolei:
* Wyłączyć RPi
* Odłaczyć kabel zasilający
* Odłączyć połączenia sieciowe
* Przyłączyć RPi do klawiatury i monitora
* Zostawić układ np. na noc
* Włączyć system i z pomocą komendy "date" odczytać czas i datę systemową. Jeśli czas się zgadza, to znaczy że wszystko zrobiliśmy dobrze i system korzysta z zegara czasu rzeczywistego podłączonego do interfejsu I²C.
Źródło: http://www.raspberrypi-spy.co.uk/2015/05/adding-a-ds3231-real-time-clock-to-the-raspberry-pi/
Rozwiązaniem tego problemu jest zegar czasu rzeczywistego (RTC). Jest to niewielki moduł, wyposażony we własną baterię, która podtrzymuje działanie układu nawet gdy zasilanie jest odłączone. Moduł ten pracuje nieprzerwanie i odlicza czas, niezależnie czy zewnętrzne zasilanie jest podłączone do układu czy nie. RPi podczas każdego uruchamiania pobierać może aktualny czas z modułu RTC.
Najprostszą metodą implementacji RTC w systemie jest wykorzystanie gotowego modułu. Na szczęście moduły RTC są niedrogie i łatwodostępne. Niektóre z modułów można łączyć bezpośrednio z pinami GPIO, inne potrzebują do podłączenia kilku kabelków.
DS1307 czy DS3231?
Moduły oparte o układu scalone DS1307 i DS3231 są bardzo popularnymi zegarami czasu rzeczywistego i nabyć je można od wielu firm. Autor poradnika zakupił oba rodzaje modułów, ale dopiero po zakupie spostrzegł, że moduł oparty o układ SD1307 jest bezużyteczny w przypadku Raspberry Pi - nie działa on z zasilaniem 3,3 V. Moduł oparty o DS3231 jest dokładniejszy i bez problemu współpracuje z systemem zasilanym napięciem 3,3 V.
Usuwanie rezystorów
Większość modułów RTC I²C ogólnego zastosowania wyposażona jest w rezystory podciągające na liniach SDA i SCL, ale ponieważ do podłączenia z Raspberry Pi rezystory te nie są potrzebne - RPi ma własne - to można je usunąć, tak aby ich obecność w żaden sposób nie zakłócała działania interfejsu.
Dodatkowo, wykorzystywany moduł wbudowany ma układ ładowania akumulatora LIR2032, który można wykorzystać do zasilania zegara. Jako że autor pragnął wykorzystać zwykłą baterię, a nie akumulator, konieczne było usunięcie jednego rezystora na PCB, co wyłączyło układ ładowania.
Do usunięcia rezystorów wystarczyła lutownica z niewielkim grotem i pęseta. Na poniższym zdjęciu zaznaczono lokalizację usuniętych oporników.
Konfiguracja sprzętowa układu
Gdy Raspberry Pi jest odłączone od zasilania przyłączyć do niego można moduł, Jest to bardzo proste, jednakże warto i tak dwa razy sprawdzić podłączenia, jakie się wykonało. Linie powinny być podłączone następująco:
| DS1307 | Pin GPIO |
| GND | P1-06 |
| Vcc | P1-01 (3,3 V) |
| SDA | P1-03 (I²C SDA) |
| SCL | P1-05 (I²C SCL) |
Na tym etapie także trzeba podłączyć do układu baterię 3 V!
Konfiguracja I²C
Tak jak w przypadku innych układów na I²C konieczne jest skonfigurowanie tego interfejsu, zanim zacznie się z niego korzystać. Konfiguracja tego portu poprzez raspi-config opisana jest w tym projekcie.
Konfiguracja modułu DS3231
Aby upewnić się, że wszystko pójdzie dobrze podczas konfiguracji powinniśmy aktualizować system przed przystąpieniem do działania:
sudo apt-get update
sudo apt-get -y upgrade
Teraz przystąpić możemy do modyfikacji plików systemowych, wykorzystując:
sudo nano /etc/modulesJeśli nie ma tam wpisu “rtc-ds1307″ to dodajemy go na dole, tak że konfiguracja modułów wygląda następująco:
snd-bcm2835
i2c-bcm2835
i2c-dev
rtc-ds1307
Wychodzimy z nano zapisując plik (ctrl+x, potem y i enter).
Następnie uruchamiamy ponownie Raspberry Pi zatrzymując je z pomocą:
sudo haltOdłączamy zasilanie i gotowe.
Test interfejsu
Podłączamy układ do zasilania i po załadowaniu się systemu operacyjnego w linii komend piszemy:
sudo i2cdetect -y 1Jeśli wykorzystujemy płytkę RPi Rev 1 to zamiast jedynki na końcu wpisujemy 0.
Wynikiem wpisania powyższej komendy powinno być coś podobnego do tego:
W tym przypadku 68 to heksadecymalny adres zegara czasu rzeczywistego na interfejsie I²C.
Konfiguracja układu I²C
Aby upewnić się, że układ działa poprawnie i RPi dobrze synchronizuje czas z modułem RTC musimy zmodyfikować kolejny plik systemowy:
sudo nano /etc/rc.localDodajemy tam dwie linijki przed exit 0:
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s
Tak, że otrzymujemy plik przypominający:
Uwaga - jeśli korzystamy z RPi Rev 1 to zastępujemy “/i2c-1/” “/i2c-0/”.
Resetujemy Raspberry Pi:
sudo rebootGdy teraz powtórzymy komendę i2cdetect, opisaną powyżej, zamiast 68 pod tym adresem zobaczymy UU:
Strefy czasowe i zmiana czasu na letni/zimowy
Domyślnie RPi pokazuje czas jako GMT lub UTC. Dla wielu osób nie jest to czas lokalny, więc trzeba odpowiednio skonfigurować system, aby pokazywał czas lokalny. Zmieniamy konfigurację poprzez:
sudo raspi-configW programie wybieramy “Internationalisation Options” i dalej “Change Timezone”. Można teraz wybrać lokalną strefę czasową.
Odczytywanie daty i godziny
Aby odczytać datę i czas systemowy wystarczy posłużyć się komendą "date", ale jeśli chcemy ją wykorzystać np. do konfiguracji czasu, a nie jego odczytu składnia wygląda:
sudo date -s "29 AUG 1997 13:00:00"Po zapisaniu daty i godziny możemy ustawienia te przenieść do RTC korzystając z komendy:
sudo hwclock -wPonowny odczyt danych z modułu zegara czasy rzeczywistego możliwy jest z pomocą:
sudo hwclock -rJeśli oddzielimy komendy odczytu zegara systemowego i czasu rzeczywistego średnikiem to możemy odczytać równocześnie obie wartości, co powinno nam zwrócić coś takiego:
Komenda "hwclock -s" dodana do rc.local ustawia czas systemowy na podstawie czasu z zegara sprzętowego.
Ostatni test
Ostatnim testem pozwalającym sprawdzić, czy RTC działa poprawnie jest sprawdzenie czy informacje o czasie ładowane są podczas startu systemu operacyjnego Raspberry Pi. Aby przeprowadzić taki test wystarczy po kolei:
* Wyłączyć RPi
* Odłaczyć kabel zasilający
* Odłączyć połączenia sieciowe
* Przyłączyć RPi do klawiatury i monitora
* Zostawić układ np. na noc
* Włączyć system i z pomocą komendy "date" odczytać czas i datę systemową. Jeśli czas się zgadza, to znaczy że wszystko zrobiliśmy dobrze i system korzysta z zegara czasu rzeczywistego podłączonego do interfejsu I²C.
Źródło: http://www.raspberrypi-spy.co.uk/2015/05/adding-a-ds3231-real-time-clock-to-the-raspberry-pi/
Fajne? Ranking DIY
