Abychom si mohli povídat o monitoru sériové komunikace musíme si zároveň říci i pár slov o tom co to vlastně ta sériová komunikace je.
Sériová komunikace je způsob, jakým arduino komunikuje s počítačem. Může to být i způsob, jakým mohou arduina komunikovat mezi sebou (když děláme větší konstrukci a jedno arduino třeba měří teplotu a odesílá hodnoty do druhého arduina, které hodnoty ukládá na server). Nebudu při popisu sériové komunikace zacházet do větších podrobností (ty nás budou asi zajímat možná až později). Pokud si chcete nastudovat trošku podrobněji tak tady je odkaz na wiki a jeden zajímavý web, kde je to v krátkosti vysvětleno. Nám jde v této chvíli hlavně o to tento typ komunikace si ukázat, protože se dá využít například při kontrole vytvořeného programu.
Každé arduino má v sobě zabudovanou možnost vysílat přes různá rozhraní signál sériové komunikace. Arduino UNO pro tento účel může využít buď digitální piny 0 a 1 (proto tyto piny jinak moc nevyužíváme v zapojeních), nebo může komunikovat například přes USB (rozhraní kterým připojujeme datový kabel z arduina k pc). A právě toto připojení budeme ze začátku využívat. Co odesíláme a jak komunikujeme pomocí sériové komunikace je dáno programem, který je do arduina vložen.
Knihovna serial
Knihovna serial() je určena pro programování sériové komunikace v prostředí arduina. Nemusíte ji nikde složitě hledat a přidávat k souboru, protože je tak důležitá, že je přidávána automaticky. Chcete-li používat tuto knihovnu, je třeba ji v úvodu programu v sekci setup inicializovat. To se dělá pomocí příkazu begin.
Příkazem begin z knihovny Serial inicializujeme modul sériové komunikace. Parametr v závorce je rychlost se kterou arduino komunikuje s počítačem. Jiné hodnoty jsou většinou jen pokud chcete komunikovat s jinými moduly. S počítačem obvykle funguje nastavení na 9600 baudů/s.
V knihovně serial můžete používat celou řadu příkazů, ale abychom si mohli zobrazovat proměnné potřebujeme těch příkazů jen několik. Pokud do arduina přeneseme následující kód, můžeme si demonstrovat, jak vlastně prakticky monitor sériové komunikace pracuje.
Popis programu: Na začátku programu si deklarujeme celočíselnou proměnnou stav, kterou budeme později zobrazovat v monitoru sériové komunikace. Ve voidu setup inicializujeme příkazem begin knihovnu sériové komunikace Serial o přenosové rychlosti 9600. V dalším programu ji tedy nyní můžeme používat.
Ve voidu loop začínáme zvláštní formulací stav=stav+1 (můžeme zapsat i stav = stav++). Tato formulace nám zajistí to, že při každém průběhu voidu loop se proměnná „stav“ zvýší o +1. Následující příkaz z knihovny Serial – print nám do zobrazovacího menu odešle aktuální hodnotu proměnné stav. Poté prográmek půl sekundy čeká a následně činnost zopakuje.
Po přenesení tohoto programu nám arduino začne na výstup sériové komunikace pravidelně po půl sekundě posílat hlášení o stavu proměnné stav. Bez displeje jej ale samozřejmě nemůžeme vidět a proto je na čase využít další vymoženost editoru kódu pro arduino a to je menu sériového monitoru. Nalezneme jej v menu „Nástroje“ pod položkou „Sériový monitor“. Pro milovníky klávesových zkratek mám dobrou zprávu, protože se dá otevřít i použitím klávesových zkratek Ctrl+Shit+M. Po zvolení této možnosti se vám rozevře plovoucí menu (viz. obrázek), kde vám začne naskakovat to co vám arduino posílá – tedy obsah proměnné stav. Protože zobrazování hodnoty nijak neupravujeme, řadí se nám hodnoty po půl sekundě prostě za sebou.
Zobrazení hodnoty můžeme různě kultivovat a hodí se to zejména, když chceme zobrazovat pravidelné hlášení, kde je více proměnných. Pokud bychom je zobrazovali v řádku, bylo by vše velmi nepřehledné. Knihovna nám umožňuje zalamovat řádky, nebo doplnit hodnoty proměnné upřesňujícím textovým doprovodem.
Data ovšem můžeme prostřednictvím monitoru sériové komunikace nejenom zobrazovat, ale také aktivně odesílat a číst. K tomu nám pomůže zvládnutí příkazu read() z knihovny Serial.
Odesílání dat z monitoru sériové komunikace
Popisovaný program vložte do arduina. Program serial_read je ke stažení na konci lekce.
Popis programu: Na začátku programu deklarujeme proměnnou „incomingByte“. Proměnná je celočíselna a budeme do ní ukládat hodnotu, kterou budeme do arduina posílat z monitoru sériové komunikace (z editoru arduina). V setupu inicializujeme sériovou komunikaci z knihovny Serial příkazem begin.
Ve voidu loop pak pomocí podmínky testujeme v arduinu, jestli nebyla do desky poslaná nějaká data pomocí sériové komunikace. Příchozí data jsou rozložena na jednotlivé znaky, každý má svou číselnou hodnotu v ASCII. Podmínka napřed zjišťuje, jestli vůbec nějaký znak byl odeslán. Pokud ano, přečte si jej pomocí příkazu read() a vloží ASCII hodnotu tohoto znaku do proměnné incomingByte. ASCII hodnotu přečteného znaku pak vrátí zpátky do monitoru pro kontrolu a zpětnou vazbu.
Do desky arduina pak můžeme přes monitor sériové komunikace posílat data (viz. obrázek).
Ovládání obvodu pomocí monitoru sériové komunikace
Možnost odesílání dat z monitoru sériové komunikace můžeme pochopitelně využít i pro jiné účely, než pro čtení dat, které jsme do desky poslali. Odeslanými daty můžeme z pc ovládat činnost desky. Jak na to si řekneme nyní. Pro test využijeme zapojení z lekce o proměnné. Zapojte si tedy následující obvod.
Do desky arduina přeneste následující kód (na konci článku je ke stažení pod názvem serial_read2.
int incomingByte = 0; // proměnná pro vstup sériových dat void setup() { Serial.begin(9600); // otevření sériového portu o rychlosti 9600 baudů/s pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); } void loop() { // podmínkový příkaz reagující na přenos sériových dat if (Serial.available() >0) { incomingByte = Serial.read(); if (incomingByte == 49) //činnost se provede pokud je odeslaný znak 1 { digitalWrite(2,1); digitalWrite(3,0); digitalWrite(4,0); } else if (incomingByte == 50) //činnost se provede pokud je odeslaný znak 2 { digitalWrite(2,0); digitalWrite(3,1); digitalWrite(4,0); } else if (incomingByte == 51) //činnost se provede pokud je odeslaný znak 3 { digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,1); } else if (incomingByte == 48) //činnost se provede pokud je odeslaný znak 0 { digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); } // čtení příchozích dat Serial.print(„Kód přečteného znaku: „); // odesílání přečtené hodnoty do monitoru Serial.println(incomingByte); } } |
Program serial_read2 je odvozen od programu serial_read. Program je přizpůsoben obvodu se kterým má pracovat (program serial_read jako ovládaného obvodu využívá pouze desky arduina). V sekci setup jsou proto navíc příkazy pro nastavení pinů pro výstup z desky (připojené LED). Rozdíl mezi oběma verzemi tkví v zařazení soustavy podmínkových příkazů, které po odeslání znaků 0 -3 rozsvítí požadovanou kombinaci LED v obvodu. Pro kontrolu je v programu ponechána i sekvence, která vrací na monitor sériové komunikace přijatou kombinaci kláves.
Tímto programem jste si vlastně vytvořili funkční ovládání elektronického obvodu z počítače.
Úkoly:
Zkuste vytvořit program, který vám bude vypisovat na monitor sériové komunikace, které tlačítko jste v obvodu stiskli (vytvořte si obvod s více než třemi tlačítky).
Zkuste upravit program serial_read2 tak, aby jste mohli z monitoru sériové komunikace ovládat jiný obvod, třeba barvy na RGB diodě.
Dobrý den
Váš článek mě velmi zaujal. Řeším podobný problém a jsem úplně bezradný co dál. Pokud byste byl tak ochotný a navedl mě co dál. Nám dvě desky Arduina Nano a Uno. V Unu shromažďuji data a chci je pomocí RS485 poslat do Nana. Problém s kterým si nevím rady je ten že z Una posílám čísla jednou 5mist jindy 3 místa. Těch dat je celkem dost. Dokážu je odeslat a přijmout ale nedokážu je přiřadit. Nevím jak jednotlivé zprávy označit. Jak vlastě zpráva vypadá? Předpokládám že má nějaký identifikátor, vlastní zprávu a ukončení.
Jak to ale zadat?
Pokud mi odpovíte moc dík.
S pozdravem
Ladislav Prchal
tel: 605 774 739
moc krasni clanek