Jak používat modul ARDUINO

I když jsme se v předchozí kapitole tvářili, že se co nejdříve pustíme do „užitečné“ práce, je třeba si uvědomit, že ne každý bastlíř, který si pořídil sadu Arduino MAXI Starter kit, je ostříleným uživatelem modulu Arduino. Takže pokud již máme s modulem Arduino nějaké zkušenosti, známe například rozložení a funkce jednotlivých pinů na konektorech modulu Arduino, nedělá nám problém chápat rozdíl mezi funkcemi digitálních a analogových vstupů a výstupů, je možné následující kapitolu klidně přeskočit.


Vstupně/výstupní piny modulu Arduino

Modul Arduino nabízí několik digitálních i analogových pinů, které můžeme ve svých projektech použít k libovolnému účelu. Většinu těchto pinů lze použít jak pro vstup, tak i pro výstup. Kromě tohoto univerzálního použití mají některé z nich i další speciální funkce, které lze jednoduše aktivovat ve zdrojovém kódu. Postupně si ukážeme, jak se s jednotlivými piny pracuje a zkusíme si ukázat i jejich další funkce. Následující obrázek ukazuje rozložení pinů na konektorech modulu Arduino UNO, které je s největší pravděpodobností součástí sady Arduino MAXI Starter kit.

Arduino UNO - pinout

Digitální vstupy a výstupy

Jak už bylo naznačeno, téměř všechny piny modulu Arduino lze použít jako digitální vstup nebo výstup. Jejich směr lze přepnout zavoláním potřebné funkce. Jelikož se jedná o digitální piny, napětí na nich je modulem Arduino interpretováno pomocí dvou logických hodnot – HIGH a LOW (vysoká/nízká úroneň), nebo i „Pravda“ a „Nepravda“ (nebo také uváděno jako „logická jedna“ a „logická nula“).

Modul Arduino pracuje s tzv. pozitivní TTL logikou, což znamená, že vysoká úroveň (HIGH) je reprezentována napětím blízkým napájecímu napětí (v případě verze UNO to je 5 V) a nízká úroveň (LOW) je napětí blízké 0 V. Tyto napětí hodnoty lze na výstup nastavit, nebo je naopak na vstupu číst.

Poznámka:
Maximální provozní (vstupní/výstupní) proud digitálních pinů je 40 mA. Doporučuje se však udržovat tento proud pod hranicí 20 mA!

Obecně se u modulu Arduino uvádí, že je možné dokonce jeden pin chvíli používat jako vstup a poté i jako výstup. Upřímně řečeno, to zrovna není standardní a často používaná technika, ale občas by se to třeba mohlo hodit. Na druhou stranu si ale okamžitě musíme říci, že zrovna tuto věc si v prostředí mBlock bohužel musíme odpustit! V případě našeho blokového programování nelze za běhu programu měnit nastavení funkce pinů. Jakmile se na pin dotážeme, bude pro celý program nastaven jako vstup. Pokud na něj zapíšeme, bude nastaven (opět pro celý program!) jako výstup. Pokud bychom se v jednom programu pokusili některý pin použít jako vstup i jako výstup, skončí program chybou. To je bohužel omezení, které nám přináší pohodlí blokového programování modulu Arduino v mBlocku.

Výstupy

Pro digitální výstupy lze běžně používat piny z pravého konektoru modulu Arduino, které jsou na předchozím obrázku rozložení pinů na konektorech modulu Arduino označeny písmenkem D. Pro zápis digitálních výstupů je v prostředí mBlock pochopitelně připraven příkazový blok.

Pokud bychom v mBlock chtěli na digitální pin číslo 9 zapsat výstupní digitální hodnotu HIGH/LOW (vysoká/nízká úroveň), provedli bychom to takto:

digit pin OUT

V případě, že by bylo třeba více digitálních výstupních pinů, než nabízí pravý konektor modulu Arduino, je možné použít i analogové vstupy A0–A5 (levý konektor). Práce s nimi je úplně stejná jako s digitálními vstupy/výstupy, pouze s tím rozdílem, že se adresují čísly 14–19. Druhou možnost, jak nakonfigurovat vstupní analogové piny A0–A5 jako digitální výstupy a zapisovat na ně, nabízí programový blok z našeho rozšíření MAXI Starter kit.

Následující obrázek ukazuje obě možnosti ovládání pinu A0 jako digitálního výstupu. První (tmavomodrý) blok ukazuje standardní blok prostředí mBlock, který nastavuje pin A0 (čili 14) na hodnotu vysoké úrovně (HIGH). Následující blok (světle modrý) je programovým blokem z rozšíření MAXI Starter kit a nastavuje stejný pin na výstupní digitální úroveň LOW (nízká úroveň).

Analog pin jako Digit

Vstupy

Obdobně předchozímu můžeme digitální informaci též načítat. Příkladem nám může být test stisknutého tlačítka, přerušení světelné závory apod. Pro čtení digitálních výstupů je opět v prostředí mBlock příkazový blok.

Například digitální pin číslo 9 načteme v prostředí mBlock následujícím blokem:

read Digit pin

Je však třeba upozornit, že u modulu Arduino mohou být k dispozici při nastavení digitálního vstupu dva základní režimy:

  • INPUT – vstup detekuje takovou hodnotu, která je na příslušný pin připojena. Jinými slovy, logická úroveň na nezapojeném vstupu není definována. Pokud chceme pomocí tohoto režimu načítat stav tlačítka, musíme při jeho daných stavech (stisknuto/nestisknuto) nějak elektricky vyřešit správnou hodnotu napětí na kontrolním vstupu.
  • INPUT_PULLUP – vstup je „držen“ interním pull-up rezistorem na hodnotě 5 V. Toto nastavení způsobí, že uvnitř modulu Arduino se zapojí rezistor mezi napájecí napětí a zadaný pin. Není-li tedy na vstupu nic připojeno, je vstup nastaven na vysoké úrovni (HIGH). Při přivedení nízká úrovně (0 V) na vstup, je vstup „stažen“ na úroveň 0 V a vstupní hodnota je detekována jako nízká úroveň, čili hodnota LOW. Zároveň vnitřní pull-up rezistor zabraňuje zkratu, ke kterému by jinak při přímém setkání úrovní HIGH (5 V) a LOW (0 V) došlo.

V případě standardního příkazového bloku pro načítání digitálního pinu v prostředí mBlock pracuje jen v režimu INPUT, ale opět naše rozšíření MAXI Starter kit přináší programové bloky pro nastavení digitálních (a i analogových pinů A0–A5) do režimu INPUT_PULLUP a jejich načítání. Rozdíl mezi těmito dvěma nastaveními a možnost zjednodušení elektronického zapojení díky konfiguraci INPUT_PULLUP si ukážeme hned v první lekci: Řízení LED tlačítkem.


Analogové vstupy

Ne vždy si v elektronice vystačíme jen s digitálními signály. Relativně často je potřeba pracovat s analogovým (spojitým) signálem. Pro analogový vstup lze využít piny označené jako A, kterých je celkem šest (A0–A5). Na těchto vstupech je 10bitový analogově digitální převodník, který dokáže převádět napětí v rozsahu 0 až 5 V na digitální číslo (0–1023) se kterým pak můžeme v našem projektu dále pracovat.

Analog pins

Čtení analogových vstupů pomocí prostředí mBlock je obdobné jako načítání vstupů digitálních. Jediným rozdílem je to, že získaná hodnota nebude mít jen dvojici možných stavů LOW a HIGH, ale celou množinu možných čísel z daného rozsahu. Takže načtením analogové hodnoty lze měřit různé úrovně napětí mezi 0 V a 5 V. Pomocí standardního příkazového bloku prostředí mBlock to provedeme takto:

read Analog pin

Načítání analogového vstupu si ukážeme v lekcích: Fotorezistor, Ovládání zvuku pomocí světla, Voltmetr, ale i v dalších.


Výstupy PWM

PWM (tedy „pulzně šířková modulace“) výstup je jakýmsi přechodem mezi digitálním a analogovým výstupem. Modul Arduino bohužel žádným čistě analogovým výstupem nedisponuje, ale PWM jej občas může nahradit. V případě PWM jde o cyklické přepínání digitálního výstupu mezi stavy LOW a HIGH. Podle toho, jaká je „šířka“ stavu vysoké úrovně (HIGH) ku šířce nízké úrovně (LOW), dochází k výslednému stavu na daném výstupu. I když se tedy jedná o digitální výstup, kdy na výstupu jsou jen stavy LOW (0 V) a HIGH (5 V), ve svém důsledku se výstup chová, jakoby se na něm měnilo napětí analogově. U modulu Arduino UNO může fungovat jako PWM výstup šest digitálních výstupů, jsou to piny D3, D5, D6, D9, D10 a D11. Na obrázku zachycujícím jednotlivé piny modulu (nebo na jeho potisku) tyto piny poznáme podle toho, že je před jejich označením uvedena značka vlnovky (∼).

PWM pins

K PWM výstupu je třeba ještě říci, že jeho rozlišení (tedy rozsah výstupních hodnot) je 0–255. Následující obrázek ukazuje průběh výstupních HIGH/LOW stavů na některém z PWM výstupů pro různé výstupní hodnoty.

PWM modulace

Standardní frekvence generovaného PWM signálu modulu Arduino UNO je 490 Hz (na pinech 5 a 6 je frekvence 980 Hz). Pro nastavení PWM výstupu je v prostředí mBlock následující příkazový blok:

PWM vystup

Ukázku PWM výstupu si ukážeme například v lekci nazvané: Řízení LED pomocí PWM.

Je třeba zmínit, že PWM signálu se také využívá při řízení serva (uvidíme v lekci Servo). I když tam si tohoto jako programátoři ani moc nevšimneme, protože PWM signál pro nás zůstane skryt za příkazovým blokem rozšíření MAXI Starter kit. I tak je ale asi dobré aspoň trochu tušit, jak se PWM dá využít.

ovladani serva

A nakonec tu máme ještě jedno využití PWM, a to v případě generování tónů. Prostředí mBlock, které je primárně určeno pro ovládání robotů mBot, potřebuje ovládat i zvukové výstupy těchto robotů. Je zde tedy i programový blok pro generování potřebného tónu po zadanou dobu:

generovani tonu

V několika následujících lekcích se zabýváme bzučáky, které jsou v sadě Arduino MAXI Starter kit obsaženy. Zpravidla budeme používat aktivní bzučák, který generuje svůj tón sám, ale jakmile budeme potřebovat změnit tón generovaného tónu, pomůže nám PWM a bzučák pasivní. To kupříkladu uvidíme v naší bonusové lekci.


Speciální funkce některých pinů

Kromě výše popsaných nastavení a funkcí vstupně/výstupních pinů mají některé piny modulu Arduino své speciální funkce. Některé budeme využívat, například pro připojení displeje, další zatím nevyužijeme, ale je dobré o nich vědět, abychom občas předešli problémům.

Sériová komunikace

Přestože v našich lekcích budeme vždy využívat komunikaci mezi modulem Arduino a připojený počítačem jedině prostřednictvím kabelu USB, je dobré vědět, že modul Arduino může sériově komunikovat i prostřednictvím svých digitálních pinů. V případě modulu Arduino UNO to jsou digitální piny 0 (RX) a 1 (TX). Piny 0 a 1 můžeme používat pro sériovou komunikaci s dalším sériovým zařízením.

ALE POZOR:
Připojení čehokoli k těmto pinům (pin 0 a 1) může narušit sériovou komunikaci, včetně způsobení neúspěšného nahrávání programu do desky. To je dobré vědět, takže pokud to půjde, využijeme pro zapojení k Arduino jiné piny!

I když se v našem tutoriálu sériovou komunikací zabývat nebudeme, třeba na ni někdy narazíme později v jiných projektech. Tak zde jen pro zajímavost uvedeme následující: Chcete-li použít sériový port modulu Arduino pro komunikaci s externím sériovým zařízením TTL, připojuje se pin TX (pin 1 modulu Arduino) k pinu RX připojeného zařízení, pin RX (pin 0 modulu Arduino) ke kolíku TX připojeného zařízení. Pochopitelně je třeba ještě propojit kolíky GND (zem) obou zařízení.


SPI komunikace

SPI (Serial Peripheral Interface) je synchronní sériový datový protokol používaný mikrokontroléry pro rychlou komunikaci s jedním nebo více periferními zařízeními na krátké vzdálenosti. I modul Arduino má možnost této komunikace. Značnou nevýhodou SPI komunikace je to, že její standard je značně volný, takže každé zařízení jej může implementovat trochu jinak. To znamená, že při psaní kódu rozhraní musíte věnovat zvláštní pozornost datovému listu připojeného zařízení. Obecně řečeno, existují tři režimy přenosu. Tyto režimy určují, zda se data posouvají dovnitř/ven při vzestupné nebo sestupné hraně hodinového signálu, nebo zda jsou hodiny nečinné, když jsou na vysoké nebo nízké úrovni.

Výhodou je, že pro většinu standardních periférií jsou již připravené knihovny, které jsou implementovány do programových bloků prostředí mBlock nebo nějakého jeho rozšíření. Kromě řídicích příkazových bloků by při této komunikaci měl být k dispozici i blok konfigurační, který nastavuje piny pro jednotlivé role komunikačních linek – například jako vidíme na následujícím obrázku, kde je konfigurační blok pro komunikaci s posuvným registrem.

SPI block

Pokud pro danou komunikaci takové nastavení není, zpravidla se počítá s určitým standardním nastavení pinů modulu Arduino, což bývá:

pin Arduino UNO Označení Popis
13 SCK
(Serial Clock)
Hodinový signál
12 CIPO
(Controller In Peripheral Out)
Vstup řadiče, výstup periférie
11 COPI
(Controller Out Peripheral In)
Výstup řadiče, vstup periférie
10 CS
(Chip Select)
Výběr (zapnutí) periférie

A aby toho nebylo málo, je tu ještě jedna komplikace. Dříve se tyto vodiče označovaly jinými názvy, takže u některých periférií se ještě můžeme setkat s jinými zkratkami. Tak, abychom v tom měli jasno, v následující tabulce je srovnání staršího a dnešního označení.

dříve nyní
MISO
(Master In Slave Out)
CIPO
(Controller In Peripheral Out)
MOSI
(Master Out Slave In)
COPI
(Controller Out Peripheral In)
SS
(Slave Select pin)
CS
(Chip Select)

I²C komunikace

Nejdříve se podíváme, co to ta komunikace I²C vlastně je. Označení pochází z názvu „Inter-Integrated Circuit“ a tajemnou značku I²C čteme: „I-squared-C“. Mimochodem, prakticky identická sběrnice se skrývá i pod zkratkou TWI (Two Wire Interface – dvoudrátové rozhraní), kterou používá firma Atmel a další výrobci namísto chráněné značky I²C, kterou vyvinula firma Philips. Sběrnice je sériová a umožňuje propojení až 128 různých zařízení jen pomocí dvou obousměrných vodičů. Jeden tvoří hodinový signál SCL (Synchronous Clock) a druhý datový kanál SDA (Synchronous Data). Zařízení připojené na sběrnici se rozdělují na řídicí (tzv. Master – zahajuje a ukončuje komunikaci; generuje hodinový signál SCL) a řízené (tzv. Slave – zařízení adresované masterem). Sběrnice I²C neumožňuje duplexní přenos, v jednom okamžiku vysílá jen jedno zařízení. Všechna zařízení připojená na sběrnici musí mít individuální adresu o délce 7 nebo 10 bitů a implementovaný mechanizmus komunikace pomocí I²C sběrnice.

Z elektrického hlediska jsou kanály SCL a SDA zapojeny jako otevřený kolektor. Každý tento vodič musí být připojen jedním pull-up rezistorem ke kladnému napětí, což zajistí vysokou úroveň (HIGH) v klidovém stavu sběrnice. Během vysílání musí periférie neustále porovnávat vysílané bity se skutečným stavem SDA. Vzhledem k charakteru sběrnice může dojít k situaci, že určitá stanice vysílá úroveň HIGH, zatímco jiná stanice vysílá úroveň LOW. Stanice, která na lince zjistí úroveň LOW, zatímco sama vysílá HIGH, musí vysílání okamžitě ukončit. Tím je zabráněno kolizím na této sériové lince.

POZNÁMKA:
Opět je tu trochu zmatek se značením! Na některých zařízeních s rozhraním I²C se můžeme též setkat s označením vodičů: SDI místo SDA a SCK místo SCL. Nic se však neděje, jedná se o totéž!

Modul Arduino UNO má pro I²C komunikaci speciálně vyhrazené dva piny, na které musíme všechny I²C periférie připojovat. Jedná se o analogové piny A4 (role vodiče SDA) a A5 (role vodiče SCL), které se při této komunikaci přepínají do digitálního režimu. Z obrázku znázorňující rozložení pinů modulu Arduino by se mohlo zdát, že tento modul disponuje ještě jednou dvojicí těchto vodičů, a to piny 18 (jako SDA) a 19 (SCL).

I2C piny - Arduino UNO

Zdání však klame, pokud si vzpomeneme, že analogové piny A0–A6 lze digitálně adresovat od čísla 14, tak vidíme, že pinům A4 odpovídá význam digitálního pinu 18 a pinu A5 obdobně pin 19. V případě I²C komunikace se tedy jedná o shodné piny. Občas se to může využít pro lepší připojení dvou I²C periférií, ale stále (jak bylo řečeno) to je stejná komunikační linka.

Ke komunikaci I²C je ještě třeba připomenout to, co sice již bylo řečeno, ale občas to může pozlobit. A to, že každé zařízení má svou vlastní adresu, které musí být na jedné komunikační lince unikátní. U některých čidel se tato adresa dá v určitém rozsahu nastavit (například pomocí propojení pinů jumperem nebo propájením pájecích bodů), jinde je však nastavena napevno přímo v čidle. Takže pokud budeme chtít nějaké I²C zařízení s modulem Arduino použít, je nutné si tuto adresu zjistit – více si ukážeme lekci: Používaní skeneru sběrnice I²C.


To by k modulu Arduino mohlo být pro začátek všechno.