26.12.2017
Pro fotovoltaické elektrárny dodáváme jednoduché zařízení FotobotHW se čtyřmi sériovými porty a aplikaci Fotobot pro sběr a ukládání dat. Aplikace je přístupná pod GPL licencí a za povšimnutí stojí její webový server popsaný v samostatném článku HTTP server pro C++ a Qt.
Praktické zkušenosti při provozování aplikace FotobotHW ukázala, že zařízení postrádá hodiny reálného času. Při každém restartu se hodiny vynulovaly - i když je zařízení většinou připojené k internetu a synchronizace času přes NTP protokol je spolehlivá, občas se stane, že na elektrárně funguje po výpadku vše kromě internetu – data jsou tak sice sbíraná, ale kvůli špatnému času jsou k nepotřebě – musí se buď ručně opravit informace o času, nebo data oželet a prostě je zahodit.
Do druhé verze desky 4x232 jsme se proto rozhodli zabudovat i hodiny reálného času.
Můj první nápad bylo použít čip DS1307, ale můj hardwerář mě upozornil na některá negativa a doporučil použít podobný čip MCP79410 – oproti DS1307 funguje s nižším napájecím napětím a je tak lépe sloučitelný s úrovní 3,3 V použitou v počítači Beaglebone. Krátký průzkum ve zdrojácích linuxového kernelu ukázal, že problém není ani s driverem, čip je velmi podobný čipu DS1307 a je podporovaný stejným jaderným modulem.
Obvod pro své fungování potřebuje minimum dalších součástek – krystal 32768 Hz, záložní baterii, dva kondenzátory a dva pull-up rezistory (teď už vím, že se správně říká "pull-up" – "push-up" je na kozy). Pokud vaše rozšiřující deska pro Beaglebone kromě hodin obsahuje další obvody, měli byste osadit na takovou desku i EEPROM paměť – pak jsou pull-up rezistory potřebné i pro EEPROM. Ale obvod by měl fungovat i bez jakýchkoliv dalších součástek i bez pull-up rezistorů a kondenzátorů – stačí jen krystal a baterie.
Spotřeba obvodu MCP79410 je při chodu hodin a napájecím napětí 3 V maximálně 1,2 µA. Klasický článek CR2032 má udávanou kapacitu 240 mAh. Při nepřetržitém napájení hodin ze záložní baterie bez externího napájení by měly hodiny vydržet běžet minimálně nějakých 200 tisíc hodin – přes 22 let. Samovybíjení článku můžeme zanedbat, dělá zhruba 1% ročně – poločas vybití takového článku je zhruba 70 let. Přestanou-li vaše hodiny fungovat už po dvaceti letech, mohl by to být důvod k reklamaci. Schovejte si proto účtenky.
Hodiny jsou připojené na sběrnici I2C na tyto vývody desky Beaglebone:
RTC | Beaglebone |
---|---|
SCL (vývod 6) | P9.19 |
SDA (vývod 5) | P9.20 |
i2cdetect -y -r 1Správně fungující hodiny by se měly objevit na výpisu adres:
root@beaglebone:~# i2cdetect -y -r 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 6f 70: -- -- -- -- -- -- -- --Adresy 0x54 až 0x57 se používají pro EEPROM rozšiřujících desek, na adrese 0x6f najdete svoje hodiny. Linuxovému kernelu řekneme, jak má s touto adresou zacházet, jaký driver má použít pro obsluhu připojeného zařízení:
echo mcp7941x 0x6f > /sys/class/i2c-adapter/i2c-1/new_device
Ve výpisu adres by teď mělo být zařízení označeno jako použité:
root@beaglebone:~# i2cdetect -y -r 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU 70: -- -- -- -- -- -- -- --
Od této chvíle by měly být hodiny přístupné přes zařízení /dev/rtc1. Prvním krokem by mělo být nastavení času v RTC (pokud to nejde, vyzkoušejte přepínač --debug):
hwclock -wu -f /dev/rtc1
Podařilo se zapsat aktuální čas a datum nastavený v systému? Prozradit by to měl příkaz pro čtení z RTC. Zde tiše předpokládám, že máte svůj Beaglebone připojený k internetu a čas je nastavený pomocí NTP protokolu:
hwclock -ru -f /dev/rtc1 Ne 22. únor 2015, 13:30:39 CET -0.509279 seconds
Poznámka k přepínači -u – v Linuxu bývá zvykem, že harwareové i systémové hodiny běží ve světovém čase (UTC). Tento čas běží spojitě, bez posunů na letní a zimní čas dvakrát ročně. Zobrazení času je pouze uživatelská záležitost, v Linuxu můžete mít na jednom počítači uživatele ze střední Evropy i z Austrálie a přitom mohou všichni používat čas, se kterým jsou spokojení. Předpokládá to ovšem, že RTC i systémový čas používají UTC – proto přepínač -u. Pro celý systém nastavíte časové pásmo v počítači Beaglebone black příkazem:
dpkg-reconfigure tzdata
Hodiny fungují, zbývá zautomatizovat nastavení času při startu systému.
Vytvořte si jednoduchý skript pro inicializaci hodin a nastavení času. Uvedený příkazy můžete zkopírovat přímo do povelové řádky (pozor na znaky < a >):
#---- cut here mkdir -p /usr/share/rtc-mcp7941x cat <<! > /usr/share/rtc-mcp7941x/clock-init.sh #!/bin/sh sleep 10 echo mcp7941x 0x6f > /sys/class/i2c-adapter/i2c-1/new_device hwclock -su -f /dev/rtc1 # Reads from MCP7941x RTC hwclock -wu -f /dev/rtc0 # Writes to Beaglebone RTC ! chmod +rx /usr/share/rtc-mcp7941x/clock-init.sh cat <<! > /lib/systemd/system/rtc-mcp7941x.service [Unit] Description=MCP7941x RTC Service [Service] Type=simple WorkingDirectory=/usr/share/rtc-mcp7941x ExecStart=/bin/sh /usr/share/rtc-mcp7941x/clock-init.sh SyslogIdentifier=rtc-mcp7941x [Install] WantedBy=multi-user.target ! systemctl enable rtc-mcp7941x.service #---- cut here
Po restartu systému byste měli mít s trochou štěstí nastavený čas i bez připojení k internetu.