26.12.2017

foto Petr Bravenec

Petr Bravenec
Twitter: @BravenecPetr
+420 777 566 384
petr.bravenec@hobrasoft.cz

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.

Přečtete si o desce 4x232

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.

Datasheet MCP79410

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.

Jak dlouho vydrží běžet hodiny na baterii?

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.

Datasheet CR2035

Připojení hodin k Beaglebone

Hodiny jsou připojené na sběrnici I2C na tyto vývody desky Beaglebone:

RTCBeaglebone
SCL (vývod 6)P9.19
SDA (vývod 5)P9.20

Funguje to?

Po připojení hodin a zapnutí počítače Beaglebone byste měli desku najít pomocí příkazu
i2cdetect -y -r 1
Sprá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

Časové zóny

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

Nastavení času automaticky při startu systému

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.

Hobrasoft s.r.o. | Kontakt