Při pohledu na prototypovací desky, které jsme doposud v našem seriálu o programování elektroniky používali, asi nikdo nezůstane na pochybách, jaké řídící čipy mám osobně nejraději. Je to samozřejmě ESP8266 s výborným poměrem cena/výkon.
Jsou rychlé, oproti tradičním atmelům na deskách arduino disponují desítkami kB RAM, mají rozměrné flashové úložiště SPIFFS, ke kterému lze přistupovat podobně jako k SD kartě, mnohem pokročilejší režim spánku a konečně Wi-Fi konektivitu.
Dnes ale přesto svět jednoduchých mikrokontrolerů opustíme a podíváme se na prototypovací desku s multi-taskingovým procesorem a Linuxem. A ne, řeč rozhodně nebude o armovém Raspberry Pi – zabrouzdáme totiž do mnohem větší exotiky.
Linuxový počítač pro IoT za 5 dolarů
Už je to nějaký čas, co skupinka inženýrů představila na Kickstarteru titěrný linuxový počítač Omega2 za 5 dolarů s podtitulkem „Nejmenší linuxový server na světě!“

Linuxový počítač Omega2 je opravdu maličký. Takto vypadá jeho srovnání s několika prototypovacími deskami včetně nejmenšího a největšího Raspberry Pi.
Nu, ve skutečnosti se jich tou dobou na scéně i díky crowdfundingu objevilo hned několik a komunita se dodnes dohaduje, který z nich je nejlepší, já si však počítač o velikosti poštovní známky přesto objednal a to v o něco dražší verzi Omega2 Plus s větší pamětí, dvojnásobným úložištěm a slotem pro microSD kartu. Nutno podotknout, že na konci kickstarterové kampaně lehce podražil i základní pětidolarový model.




Omega2 je linuxový počítač o velikosti poštovní známky
Počátkem letošního roku mi konečně dorazila malá krabička, jejíž cena původní metu překročila hned několikrát kvůli vysokému poštovnému z USA. V každém případě jsem ale získal prototypovací mašinku s těmito parametry:
- SoC platforma: MediaTek MT7688
- CPU: 580MHz 32bit MIPS 24Kec
- OS: LEDE (OpenWrt)
- RAM: 128 MB
- Úložiště: 32 MB flash + micro SD
- Wi-Fi: 802.11bgn
- Rozhraní: 15× GPIO, 2× UART, 1× I2C, 1× SPI, 1× I2S, USB, ethernet
Paráda! Malý počítač má dostatečný výkon procesoru, dostatek RAM, flashové úložiště pro programy, a pokud by nestačilo, lze připojit SD kartu a třeba po vzoru Raspberry Pi vše přenést na ni.

Pinout mikropočítače Omega2. Nechybí základní GPIO, UART, SPI, I2C, ale také piny pro USB a ethernet. Oproti mikrokontrolerům nicméně chybí alespoň jeden analogový vstup.
Bez doku si začátečník neškrtne
Omega2 je malá a levná, jenže tato její výhoda se snadno promění v nepříjemnost. Leckdo narazí už jen při pokusu Omegu připojit k napájení. Na rozdíl od mnoha ostatních prototypovacích desek tu totiž nenajdete žádný napájecí USB konektor.

Napájení Omegy pomocí obvodu s měničem na 3,3V LD1117. Kvůli nestandardnímu rozestupu pinů bohužel nelze Omegu zacvaknout přímo do nepájivého pole.
Omega je opravdu jen šváb, takže pracovní napětí 3,3 V a proud 500 mA mu musíte dodat sami. 500 mA? Tak moc? No ano, toto už opravdu není mikrokontroler, který k běhu potřebuje zpravidla jen pár desítek mA.
Možná jen mávnete rukou a napadne vás, že prostě použijete nějaký starý zdroj od mobilu, měnič z 5 V na 3,3 V a celé to společně se švábem Omegy zapíchnete do nepájivého pole. Jenže to má jeden podstatný háček. Omega je tak malá i díky tomu, že nemá tradiční rozestup pinů 2,54 mm, ale jen 2 mm. Na pinech ze stejného důvodu nebude dobře držet ani obvyklá kabeláž.



Jelikož Omega2 nemá USB port a nemá standardní rozestup pinů pro nepájivé pole, ke snadnému prototypování pomůže některý z dostupných doků. Zleva: Breadboard Dock, Arduino Dock, Mini Dock
Aby tedy byla Omega dostatečně kompatibilní s ostatní prototypovací elektronikou, nejlépe uděláte, když si připlatíte za některý z doků. Já si k mikropočítači dodatečně objednal Expansion Dock za dalších 15 dolarů s vyvedeným pin headerem standardních rozměrů, RGB diodou, vypínačem, tlačítkem reset a také velkým USB (host) portem a malým micro USB pro napájení.



Omega2 v rozšiřujícím Expansion Docku. Výsledkem je prototypovací deska o něco menší než Arduino Uno
Maličkou Omegu pak stačí do doku zacvaknout a ten už do sítě připojit třeba pomocí běžné micro USB nabíječky telefonu.
Fóra podpory jsou plné nadávek, proč nemá Omega USB port už od výroby a také standardní rozteč pinů, ale dává to smysl. Holá Omega je určená pro finální instalaci do nějakého trvalejšího projektu a pro rychlé prototypování tu jsou ony doky. Ve výsledku tedy sice zaplatíte 20 dolarů, ale připojování komponent k Omeze už bude stejně snadné jako na Arduinu, Raspberry Pi a tak dále.
Ostatně největším konkurentem této třídy linuxových mikropočítačů je právě Raspberry Pi Zero W, která má navíc HDMI port.
O běh programů se stará Linux a instalační systém opkg
Jelikož se o běh stará miniaturní linuxová distribuce LEDE odvozená z populárního „routerového“ OpenWrt, k instalaci balíčků se používá program opkg a jako webový server poslouží zdejší uhttpd. Na spuštěném webové serveru ostatně běží i webové konfigurační rozhraní Omegy, které nabízí jednoduchou počáteční instalaci, webový linuxový terminál a také textový editor, takže se při spojení s počítačem obejdete i bez SSH konzole – stačí opravdu webový prohlížeč.



Na Omeze běží webový server, který slouží ke správě a grafickému ovládání pinů. Samozřejmě se ale můžete s počítačem spojit i skrze síťový terminál SSH.
Protože je v nitru SoC plnohondotný operační systém – Linux, aplikace můžete psát prakticky v ledasčem. Na rozdíl od jednoduchých mikrokontrolerů, kde náš program tvoří vlastně jedinou náplň čipu a je napsaný v C/C++, v případě Omegy to může být třeba skript v Pythonu, NodeJS, PHP a tak dále, který bude skrze rozhraní Linuxu přistupovat k periferiím desky a bude to vlastně jen jeden z mnoha programů běžících vedle sebe.


Přímo z webového prohlížeče můžete otevřít také emulovaný linuxový terminál a také textový editor s přístupem do souborového systému Omegy
Vývoj v čistém C/C++ bude paradoxně na rozdíl od Arduina pro začátečníka zdaleka nejsložitější a to z toho důvodu, že v systému chybí překladač gcc. Dává to smysl. 580MHz procesor je sice výkonný z hlediska použití pro IoT, ale ne k překladu programů do strojového kódu. Namísto toho se používá tzv. technika cross-compile, kdy se program pro cílový maličký procesor přeloží na běžném PC.
Napíšeme si to v Pythonu
Já však dnes zůstanu u Pythonu, se kterým jsme si hráli už v létě na poněkud rozměrnějším Raspberry Pi. Repozitář balíčků pro Omegu myslí na malou paměť, a tak je k dispozici i odlehčená verze python-light, která nespotřebuje tolik místa. Chybějící knihovny pro Python pak lze doinstalovat samostatně skrze opkg, anebo instalátor pip, který důvěrně zná každý vývojář v Pythonu.

Instalování programů pomocí opkg
V našem případě se to týká zejména knihoven pro práci s hardwarovým rozhraním. Pro práci se sériovou linkou se tedy bude hodit balíček python-pyserial, pro práci s I2C rozhraním balíček pyOnionI2C a pro GPIO a nastavování logických stavů HIGH a LOW konečně knihovna pyOnionGpio.
Suma sumárum, když jsem pomocí opkg doinstaloval vše potřebné, zbývalo mi ve vnitřní paměti stále 14 MB volného místa, což je optikou našich dosavadních hrátek naprostý luxus. Vždyť naše programy zabíraly vždy nejvýše pár desítek kB a textový soubor se skriptem napsaným v Pythonu na tom bude podobně.
Tak si to pojďme vyzkoušet v praxi.
Přečteme teplotu a vlhkost vzduchu ze senzoru SHT30/31
Kombinovaný teploměr a vlhkoměr z řady SHTx od Sensirionu mám velmi rád, jedná se totiž o velmi přesná čidla, což platí zejména u modelů SHT31 a SHT35. Já mám doma hromadu starších destiček SHT30, které najdete třeba v populární meteostanici Netatmo. Odchylka měření při pokojové teplotě se pohybuje okolo 0,3 °C a o něco vzroste při teplotách hluboko pod bodem mrazu, i tak se ale bude pohybovat okolo půl stupně.



Prototypovací modul teploměru a vlhkoměru SHT30 (zkušení poznali, že se jedná o shield pro Wemos D1 Mini) připojený na mikropočítač Omega2
SHT30 používá ke komunikaci sběrnici I2C, takže vedle dvou napájecích vodičů má ještě piny SCL (časovač) a SDA (samotná data). Tyto piny jsou vyznačené i na rozšiřujícím doku Omegy, do kterého je připojený mikropočítač, takže stačí čidlo přímo připojit k desce a vše bude fungovat (pro pokročilé: není třeba připojovat pull-up rezistory).
Tak a teď přijde ta největší zábava. Programování v Arduinu aspol. Je jednoduché hlavně proto, že komunita připravila prakticky ke každému čidlo knihovnu. To samozřejmě platí i o teploměru SHT30. U exotičtějších mikropočítačů, kam patří i Omega, to však už neplatí, a tak musíme jít až na dřeň, nastudovat si specifikaci čipu SHT30 a dle dokumentace zjistit, jak s ním skrze I2C komunikovat, aby nám odeslal teplotu a vlhkost.
Anebo pomůže náhled do zdrojových kódů knihoven pro Arduino a algoritmus prostě analogicky přepíšeme z C/C++ do Pythonu.

Webový textový editor běžící přímo na Omeze a kód teploměru v Pythonu
Zrychlím to. Aby mi teploměr SHT30 předal údaje, musím jej o to nejprve požádat. V praxi to znamená, že mu skrze rozhraní I2C odešlu do registru 0x2C bajt s hodnotou 0x06. Poté počkám pár set milisekund a poprosím o šest bajtů dat s odpovědí, ve které jsou zakódované i údaje o teplotě a vlhkosti.
Dnes nám nejde o popis komunikace s konkrétním čipem, ale o obecnou komunikaci skrze sběrnici I2C v Pythonu na desce Omega2, takže nebudu zabředávat do dalších detailů a rovnou vám ukážu kód, který by každých pět sekund vypisoval teplotu a vlhkost vzduchu. Bude se jednat třeba o soubor teplomer.py.
# Encoding: utf-8
# Načtení knihovny pro práci se sběrnicí I2C
from OmegaExpansion import onionI2C
# Načtení knihovny pro práci s časem
from time import sleep
print("*************************************************************")
print("Test spojení s teploměrem Sensirion SHT30 pomocí sběrnice I2C")
print("*************************************************************\n")
# Deska Omega2 má pouze jedno rozhraní I2C, proto jako index použiji 0
i2c = onionI2C.OnionI2C(0)
# Proměnná s I2C adresou teploměru SHT30. V mém případě to je 0x45
zarizeni = 0x45
# Nekonečná smyčka (podobně jako loop na Arduinu)
while True:
# Odešlu skrze I2C požadavek ke změření dat
# Do registru 0x2C na teploměru odešlu bajt s hodnotou 0x06
i2c.writeByte(zarizeni, 0x2C, 0x06)
# Nyní dám teploměru trošku čas a počkám 500 ms
sleep(0.5)
# Nyní si skrze I2C od teploměru vyžádám 6 bajtů s odpovědí
data = i2c.readBytes(zarizeni, 0x00, 6)
# Podle dokumentace přepočítám bajty na teplotu a vlhkost
teplota = ((((data[0] * 256.0) + data[1]) * 175) / 65535.0) - 45
vlhkost = 100 * (data[3] * 256 + data[4]) / 65535.0
# A konečně vypíšu teplotu a vlhkost do výstupu
# V našem případě se bude jednat o linuxový terminál (SSH)
# Stejně tak bych ale nyní mohl data odeslat někam na web,
# uložit do souboru atp.
print("Teplota: " + str(teplota) + " °C")
print("Vlhkost: " + str(vlhkost) + " %\n")
# Počkám 5 sekund a smyčka se zopakuje
sleep(5)
Teď už pouze stačí program spustit třeba v terminálu SSH nebo v tom webovém příkazem python teplomer.py a na obrazovce se začne každých pět sekund vypisovat změřená teplota a vlhkost vzduchu. Nekonečnou smyčku mohu ukončit třeba klávesovou zkratkou CTRL+C.

Výpis teploty a vlhkosti do linuxového terminálu na mikropočítači Omega2
Data bych samozřejmě mohl pomocí dalších knihoven pro Python posílat kamkoliv na web, ukládat do souboru přímo na mikropočítači Omega a tak dále. V takovém případě bych potřeboval ještě nastavit, aby se můj program spouštěl po startu Omegy, respektive běžel na pozadí jako jakýkoliv jiný.
Takhle tedy vypadá a funguje mikropočítač Omega2 s Linuxem. Holý šváb je malý a levný, s prototypovacím dokem však náklady citelně poskočí vzhůru – zvláště když připočítáte vysoké poštovné. No, a to se pak už hodí investovat do nejlevnějšího armového Raspberry Pi Zero W.