Tato lekce navazuje volně na lekci A15, doporučuji si nejdříve projít lekci A15 než začnete s touto lekcí. Na začátku si řekneme, co jsou komunikační protokoly a pak si vytvoříme jednoduchý příklad na komunikaci mezi dvěma micro:bity způsobem Master-Slave.
název: A16 Komunikace mezi micro:bity II
kategorie: A začátečníci
ref.číslo: A16
projekt: kurz micro:bit
verze: 01, 2017-07-11
autor: Ivo Obr, Lanškroun
Pokud chtějí dva lidé mezi sebou komunikovat, musí se předem domluvit na určitých pravidlech, jak spolu povedou hovor, obecně komunikaci. Předem se domluví, jakým jazykem budou komunikovat, zda to bude hovor nebo písemná forma, na jaké téma budou mluvit, kdo otevírá komunikaci, jak budou mluvit hlasitě, jaké použijí písmo a mnoho dalších věcí, které patří ke komunikaci. My si už v běžném rozhovoru neuvědomujeme tato pravidla, máme je už předem nastavena jako standardní pravidla. Pokud by jste ale navštívili například anglický královský dvůr, pak budou pravidla jiná a budete se muset s nimi seznámit, dodržovat je, jinak nás zdvořile a bez řečí vyvedou ven.
Těmto předem dohodnutým pravidlům v komunikaci se říká komunikační protokoly. Aby mohly mezi sebou komunikovat počítače, obecně zařízení, je nutno, aby dodržovaly také předem nastavená pravidla komunikace – komunikační protokoly. Na fyzické úrovni jde například o to, jaká elektrická napětí a proudy budou používat, jaké budou rychlosti signálů, jak budou data uspořádána aby ta druhá strana mohla identifikovat strukturu zasílaných informací.
Na programové úrovni je to například jak budou vypadat adresy zařízení, jak se zjistí, že přenos dat byl uskutečněn bez chyb atd.
Tyto komunikační protokoly jsou už naprogramovány a jsou světově uznávány. Takže výrobci už vytvářejí hardware podle standardů a my se tím už nemusíme zabývat. Přesto si ale v našem aplikačním programu nebo programech musíme předem domluvit, co budeme posílat za data, abychom si vzájemně rozuměli. Když se například dotáži druhého zařízení na teplotu, musíme se domluvit, že mi zařízení pošle číslo (hodnotu) a to ve stupních Celsia. Nebude mi například posílat text ” je čtyři a půl stupně Celsia nad nulou” ale pošle mi hodnotu 4,5.
My si dnes projdeme příklad, kdy budeme mít dvě zařízení, jedno bude řídící (Master) a druhé bude pasivní (Slave). Předem si řekneme, jak bude komunikace vypadat:
- Použijeme Sériovou linku, viz lekce A15 s nastavením PIN0 – vysílá, PIN1 – přijímá, rychlost komunikace nastavíme na 19200 na obou zařízeních.
- Na řídícím zařízení, když stiskneme tlačítko “A”, odešleme příkaz (bude to znak “T”). Abychom byli přesní, budeme posílat jednak znak “T” následovaný zakončovacím znakem “#”. Tyto dva znaky pošleme na zařízení Slave a budeme očekávat na vstupním pinu (PIN1) zaslání znakového řetězce, ve kterém jsou znaky číslic, udávající teplotu ve stupních Celsia, zakončeného posledním znakem “#”.
- Na řídícím zařízení, když stiskneme tlačítko “B”, odešleme příkaz (bude to znak “I”). Abychom byli přesní, budeme posílat jednak znak “I” následovaný zakončovacím znakem “#”. Tyto dva znaky pošleme na zařízení Slave a budeme očekávat na vstupním pinu (PIN1) zaslání znakového řetězce, ve kterém jsou znaky identifikace zařízení Slave (“S1”), zakončeného posledním znakem “#”.
- Abychom si nepopletli které zařízení je které, tak na zařízení Master bude v klidu svítit znak “M”, na zařízení Slave pak znak “S”. Po přijetí znakového řetězce na zařízení Master vypíšeme řetězce dat jak na Master tak na zařízení Slave.
Je to příklad, který nemá velký praktický význam, ale ukážeme si na něm základní postupy komunikace.
Takže nejdříve vytvoříme oba začátky programů, kde v kleštích bloku “on start” si nastavíme základní komunikační parametry viz bod a). Také jsme si určili, že zakončovací znak bude “#”, který znamená ukončení přenosu dat.
Je jasné, že budeme psát dva rozdílné programy, které si spolu musí rozumět. Dali jsme si pravidla, jak budou spolu programy komunikovat a to je náš komunikační protokol.
Začneme programem Master. Na přiloženém obrázku je celý program a budeme si ho vysvětlovat.
V programu použijeme dvě proměnné. Prvá proměnná je se jménem “pozadavek”. V klidu je v této proměnné obsah jednoho znaku a to “X”, který jsme tam vložili v bloku “on start”.
První blok “while” bude při stisknutém tlačítku stále dávat do proměnné “pozadavek” znak “T”, (požadujeme teplotu). Jakmile tlačítko “A” uvolníme, program pokračuje dále. Další blok “while” je vynechán, pokud zároveň nedržíme i tlačítko “B” (nedržíme).
Nyní se první blok “if” uplatní, protože “pozadavek” se rovná “T”. V kleštích je blok, který odešle na sériovou linku řetězec znaků “T#”. Znak “#” říká, že tam končí odesílaná data. Druhý blok “if” je přeskočen, protože jsme dali požadavek na teplotu.
Třetí blok “if” je proveden, pokud jsme dali jakýkoliv požadavek, buď “T” nebo “I”. Modrý blok v prvém řádku kleští čeká na příjem dat. Pokud data přicházejí, nic se neděje až do okamžiku, kdy je přijat zakončovací znak (za until). Výsledkem modrého bloku je řetězec znaků bez zakončovacího “#”. Tím nám zařízení Slave dá najevo, že všechna data jsou odeslána a my můžeme to, co jsme přijali a dali do proměnné “prijem” zobrazit na displeji. Na něm se nachází znak “M”, tak ho smažeme (jinak to celé ujíždí a zbytky písmene “M” ruší čtení přijatých dat na displeji – můžete si to vyzkoušet bez “clear screen”).
Protože tímto byl náš požadavek na zaslání teploty splněn, dáme do proměnné “pozadavek” znak “X” a vypíšeme opět na displeji znak “M” (Master).
Obdobně program funguje pro tlačítko “B”, kde se odesílá řetězec “I#”. Pokud pracujete pečlivě, zbývá program nahrát do prvého micro:bitu a také si ho uložit do počítače například pod názvem A16M (A16M.hex).
Program Slave.
Na začátku programu nastavíme stejné parametry přenosu jako na programu Master. Na displej však vypíšeme znak “S” abychom identifikovali, který micro:bit je Master a který Slave. Pro příjem dat použijeme blok události “serial on data received” (byla přijata data na sériovém portu s ukončovacím znakem “#”). Tento blok má v kleštích trochu složitější konstrukci, kterou si vysvětlíme.
Ukončovací znak už uživatel nedostane, ale modrý blok “serial read until” nám dodá řetězec o třech znacích. Nás však zajímá jen znak s “T” nebo s “I”, který očekáváme. Proto si z tohoto textového řetězce vezmeme jen jeden znak, který je na úplném začátku. Jeho index je nula, je to prvý znak v řetězci. Tento znak vložíme do proměnné se jménem “s1”.
V kleštích bloku “forever” neustále testujeme bloky “if” obsah proměnné “s1”. Jakmile dojde k přenosu dat, událost přenosu nám do této proměnné vloží znak, který byl odeslán z Master. Jestliže je požadováno odeslání teploty (znak “T”), pak se uplatní první blok “if”. Vrátíme zpátky obsah proměnné “s1” na hodnotu “X”. Protože nám blok “temperature” dá hodnotu číselnou nikoliv řetězec znaků (číslic), použijeme blok “serial write number”, který převede hodnotu na znakový řetězec a ten odešle po sériové lince. Nesmíme zapomenout na odeslání zakončovacího znaku a na displeji vypíšeme stejnou hodnotu teploty. No úplně stejná být nemusí, ale rozdíl v řádu jednotek milisekund snad nevadí. (Jinak bychom si museli dát do nějaké proměnné teplotu před odesláním dat a pak tuto proměnou použít jak k odeslání na sériovou linku tak i k výpisu na displej).
Obdobně funguje i blok, který odesílá identifikaci. Protože stačí odeslat je jeden řetězec včetně zakončovacího znaku, je zde o jeden blok méně.
Za bloky “if” je pak blok “show string”, který se stará znovu o výpis znaku “S” na displeji. Program nahrajeme do druhého micro:bitu. Nezapomeňte si také program uložit do počítače pro pozdější úpravy nebo opravy, nejlépe pod názvem A16S (A16S.hex). Po nahrání programů nejdříve zapneme napájení z baterií do obou micro:bitů a pak teprve propojíme PINy micro:bitů. Pokud to uděláme opačně, prvý zapnutý micro:bit reaguje na změny napěťových úrovní na PINech druhého microbitu a program se zablokuje. (měl jsem také problém se zapnutými a propojenými micro:bity, pokud se do nich nahrával program. Dá se tomu zamezit, ale to už je mimo rámec této lekce).
Poznámky :
Micro:bity mají možnost komunikovat bezdrátově (Bluetooth), ale jen na omezenou vzdálenost. Pokud by jste chtěli například komunikaci na vzdálenost několika desítek metrů, pak drátové propojení je jedním ze spolehlivých řešení. Nezapomeňte, že budete potřebovat 3 vodiče.
Programy pro Master a Slave se dají se stejnou nebo podobnou funkčností napsat mnoha jinými způsoby. Můžete nyní klidně experimentovat. Nezapomeňte začít vždy od toho nejjednoduššího a postupně jednotlivé kroky ověřovat, zda-li správně fungují a pak teprve přidávat další.. Napsat větší program hned napoprvé a bez chyb je pro začátečníky téměř nemožné. Pokud máte v programu více chyb, které se vzájemně násobí, pak je oprava vždy problematická.