Linux | Pojďme programovat elektroniku | Python

Pojďme programovat elektroniku: Vyzkoušíme linuxový počítač Omega2 za stokorunu

  • Má velikost poštovní známky
  • Stojí něco málo přes stovku
  • A tvrdí o sobě, že je to nejmenší linuxový počítač

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ě!“

Klepněte pro větší obrázek
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.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
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.

Klepněte pro větší obrázek
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.

Klepněte pro větší obrázek
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áž.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
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í.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
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č.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
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.

Klepněte pro větší obrázekKlepněte pro větší obrázek
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.

Klepněte pro větší obrázek
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ě.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
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.

Klepněte pro větší obrázek
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.

Klepněte pro větší obrázek
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.

Diskuze (7) Další článek: Tesla obdržela největší objednávku na elektrické kamiony. Budou vozit Budweiser

Témata článku: Linux, Programování, Pojďme programovat elektroniku, USA, Arduino, Open source, Python, USB, Raspberry Pi, Netatmo, Kickstarter, C++, Populární router, PI Zero, Elektro, SoC, Malá paměť, Logický stav, Arduino aspol, RGB LED, Flashové úložiště, Odlehčená verze, Malá krabička, SSH, Paráda