Vstupně výstupní piny
Arduino nabízí množství digitálních i analogových pinů, které můžeme ve svých projektech použít k libovolnému účelu. Většinu techto pinů lze použít jak pro vstup tak i pro výstup. Kromě toho mají některé z nich i další funkce, které lze jednoduše aktivovat ve zdrojovém kódu. V dalším textu bude podrobněji popsáno jak se s jednotlivými piny pracuje a ukážeme si i jejich další funkce.
Digitální vstup a výstup
Téměř všechny piny Arduina lze použít jako digitální vstup nebo výstup. Jejich
směr lze přepnout zavoláním funkce a to v libovolném okamžiku. To znamená, že
jeden pin může jednu chvíli sloužit jako vstup a poté i jako výstup (možná vás
teď nenapadá k čemu by to bylo dobré, ale občas se to opravdu hodí). Jelikož se
jedná o digitální piny, napětí na nich je Arduinem interpretováno pomocí dvou
logických hodnot – HIGH
a LOW
, neboli pravda a nepravda, často také
logická jedna a nula.
Arduino pracuje s pozitivní TTL logikou. Logická jedna, HIGH
, je
reprezentována napětím blízkým napájecímu (v případě verze Uno je to 5 V, v
případě Nano pak 3,3 V) a logická nula, LOW
, je napětí blízké 0 V.
Následující jednoduchý kód způsobí, že na pinu číslo 13 bude logická jedna a
tedy na pinu lze pomocí voltmetru naměřit 5 V a na pinu č. 12 bude logická
nula, voltmetr naměří 0 V:
Ve funkci setup je na prvních dvou řádcích zavolána funkce pinMode()
, která
nastaví směr digitálního pinu (OUTPUT
neboli výstup a INPUT
neboli vstup) a
která očekává dva parametry – nejdříve číslo pinu který chceme nastavit a pak
samotný směr.
Na dalších dvou řádcích je pak volána funkce digitalWrite()
, kterou se dá u
výstupních pinů nastavit jejich logická hodnota. Funkce opět očekává dva
parametry – nejdříve číslo pinu který chceme měnit a pak logická hodnota.
Poté co tento kód nahrajete do Arduina si můžete vzít do ruky voltmetr a změřit napětí na pinech 12 a 13. Změřené hodnoty by vás již v tomto okamžiku neměli překvapit a měli byste chápat proč tomu tak je. Teď už zbývá si ukázat jak na vstupní piny.
Příklad výše bude opakovaně kontrolovat logickou hodnotu na pinu 12, který jsme nastavili jako vstupní. Pokud je na pinu napájecí napětí (tedy logická jedna) na pinu 13 se okamžitě objeví logická jedna (pokud k tomuto pinu připojíme LED s rezistorem, dioda se rozsvítí). Ihned jak k pinu 12 připojíme 0 V (GND), LED zhasne.
Více digitálních I/O pinů
V případě, že potřebujete více digitálních pinů než obsahuje vaše verze Arduina, je možné použít i analogové vstupy (běžně označené jako Analog in
nebo Analog
). Práce s nimi je úplně stejná jako s digitálními vstupy/výstupy, pouze s tím rozdílem, že ve fukcích pinMode()
, digitalWrite()
a digitalRead()
musíte před číslo pinu vložit písmeno A
.
V následujícím příkladu použijeme analogový vstup A0
jako digitální výstup:
Interní pull-up rezistory
Digitálním pinům nastaveným na vstup lze připojit interní pull-up rezistor. To znamená, že uvnitř mikrokontroléru Arduina se zapojí rezistor mezi napájecí napětí a nožičku pinu tak, jak je znázorněno na schématu níže.
Softwarové zapnutí pull-up rezistoru ilustruje následující příklad:
S pull-up rezistory lze pracovat pouze u digitálních pinů nastavených jako vstupní.
Analogový vstup a výstup
Ne vždy si v elektronice vystačíme jen s digitálním vstupem/výstupem. Relativně často je potřeba pracovat s analogovým (spojitým) signálem. Arduino nám sice práci s nimi maximálně zjednodušuje, ale i tak je potřeba vědět několik důležitých faktů.
Analogový vstup (AD převodník)
Analogový vstup umožňuje 10 bitový, 6 kanálový AD převodník1, který je
součástí mikrokontroléru Arduina. Pro analogový vstup lze tedy využít piny
označené jako A
nebo Analog
, kterých je celkem šest. ADC dokáže převádět
napětí v rozsahu 0 až 5 V na digitální číslo (konkrétně na typ unsigned int
)
se kterým pak můžeme v našem projektu dále pracovat.
Ukažme si to na jednoduchém příkladě – na analogovém vstupu A0
bude
připojena prostřední nožička potenciometru. Zbylé dva
piny potenciometru připojíme k pinům VCC
a GND
. Tím jsme vytvořili dělič
napětí. Otočením hřídele potenciometru se změní napětí na prostřední nožičce a
tím pádem i na analogovém vstupu Arduina.
Následující zdrojový kód bude číst analogovou hodnotu, kterou použijeme ke změně rychlosti blikání LED na digitálním pinu 13.
Poté, co nahrajete tento kód do Arduina, můžete měnit rychlost s jakou LED problikne otočením hřídele potenciometru. Zároveň můžeme pomocí serial monitoru v Arduino IDE sledovat jaké hodnoty jsme načetli v analogového pinu. Budou vždy v rozmezí od 0 do 1023 (tedy celkem 1024 možných hodnot).
Toto číslo reprezentuje hodnotu napětí, které je přítomno na analogovém pinu. Pokud chceme vědět jeho přesnou hodnotu ve voltech, přepočet je následující:
kde je analogová hodnota, kterou jsme načetli pomocí funkce
analogRead()
(v našem případě proměnná rychlost
) a je napájecí
napětí Arduina (v případě verze Uno je to 5 V).
Tento vztah nám také říká, jaké nejmenší napětí jsme schopni s Arduinem
rozlišit – . Tato přesnost je většinou
dostatečná. Pokud budeme chtít snímat napětí na poteciometru nebo jakémkoliv
běžném senzoru, analogový vstup Arduina a funkce analogRead()
nám bude
stačit.
Analogový výstup (PWM)
Hned na úvod je potřeba zmínít následující fakt: Arduino žádný analogový výstup nemá. To, co dokumentace Arduina často nazývá analogovým výstupem je doopravdy signál s pulzně šířkovou modulací (PWM). V této sekci si celou problematiku podrobně vysvětlíme.
Funkce, která v Arduinu ovládá analogový výstup je analogWrite()
. Ukažme
si nejdříve její použití na příkladu:
Funkce analogWrite()
očekává dva parametry – nejdříve číslo pinu a pak
hodnotu v rozsahu 0 až 255. Piny, se kterými tato funkce dokáže pracovat jsou
většinou na desce označeny znakem vlnovky ~
. Pro verzi Arduino Uno to jsou
piny 3, 5, 6, 10 a 11.
Pokud teď k výstupům 10 a 11 připojíme voltmetr (například digitální multimetr přepnutý na měření stejnosměrného napětí), na pinu číslo 10 naměříme napětí přibližně 2,5 V (v případě verze Uno) a na pinu č. 11 pak 0,63 V. Vztah pro výpočet napětí je:
kde je napájecí napětí Arduina (nejčastěji 5 nebo 3,3 V) a je
hodnota se kterou byla zavolána funkce analogWrite()
`.
Nyní se podívejme, jaký je výstup Arduina doopravdy. Pokud vlastníte osciloskop, připojte oba výstupní piny na vstupní kanály osciloskopu. Naměřený signál by měl vypadat podobně jako na obrázku níže. Horní signál, vykreslený žlutou barvou je výstup na pinu č. 10 a spodní signál, modře, je zase výstup č. 11.
To je ale přece úplně jiný výsledek, než jaký jsme naměřili na voltmetru. Ten ukazoval stejnosměrné napětí o hodnotě 2,5 a 0,63 V, zatímco osciloskop nám zobrazil obdelníkový signál s různou délkou pulzu.
Jelikož Arduino nemá opravdový analogový výstup, používá k tomuto účelu
digitální výstup, který velmi rychle spíná tak, že vytvoří obdelníkový signál.
Různou hodnotou funkce analogWrite()
můžeme měnit střídu2 tohoto
signálu, viz obrázek níže.
Dá se pak dále dokázat, že změna střídy obdelníkového signálu mění jeho průměrnou hodnotu, což je vlastně naše stejnosměrné napětí. Nedává to smysl? Nevadí, důležité je zapamatovat si, že:
- Arduino nemá opravdový analogový výstup,
- místo toho používá obdelníkový signál o frekvenci 490 Hz (na pinech 5 a 6 pak 980 Hz),
- funkce
analogWrite()
dokáže měnit střídu tohoto signálu, - střída ovlivňuje jaké napětí na výstupu naměříme.
Tento tzv. analogový výstup Arduina lze použít k ovládání např. ručkového měřicího přístroje (jako na obrázku níže) nebo ke změně intenzity LED, či jiného světelného zdroje, případně k regulaci otáček motorku, ovládání piezoreproduktoru, atd.
A na závěr ještě pár poznámek:
- Arduino Due obsahuje DA převodník, takže na pinech
DAC0
aDAC1
je opravdový analogový výstup, žádné PWM. - Výstup na pinech 5 a 6 má vyšší frekvenci (980 Hz) a také jsou u nízkých hodnot velmi nepřesné.
- Před samotným použitím
analogWrite()
není potřeba volatpinMode()
.
TODO:
- změna referenčního napětí u ADC.