View on GitHub

Arduino Dokumentace

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:

void setup() {
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);

  digitalWrite(12, LOW);
  digitalWrite(13, HIGH);
}

void loop() {
}

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.

void setup() {
  pinMode(12, INPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  int tlacitko = digitalRead(12);
  if(tlacitko) {
    digitalWrite(13, HIGH);
  } else {
    digitalWrite(13, LOW);
  }

  delay(100);
}

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.

Dioda LED připojená k digitálním pinu 13 na desce Uno

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:

void setup() {
  // Nastavíme směr pinu A0 na výstup.
  pinMode(A0, OUTPUT);

  // Nastavíme A0 na log. jedničku.
  digitalWrite(A0, HIGH);

  // Pokud chceme později s A0 pracovat jako
  // s analogovým vstupem, stačí změnit směr
  // na vstup před použitím analogRead()
  pinMode(A0, INPUT);
  int hodnota = analogRead(A0);
}

void loop() {
}

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.

Blokové schéma MCU Arduina zobrazující interní pull-up rezistor

Softwarové zapnutí pull-up rezistoru ilustruje následující příklad:

void setup() {
  // Nastavíme směr pinu 3 na vstup
  pinMode(3, INPUT);
  // Aktivujeme pull-up
  digitalWrite(3, HIGH);

  // Nyní můžeme s pinem normálne pracovat.
  // Jakmile budeme chtít pull-up vypnout,
  // stačí zavolat funkci:
  digitalWrite(3, LOW);
}

void loop() {
}

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.

Analogový vstup na desce Arduino Uno R3

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.

void setup() {
  // Nastavíme pin 13 jako výstupní.
  // Na tomto pinu je připojena LED.
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);

  // Aktivuj sériové rozhraní,
  // rychlost 9600 baudů.
  Serial.begin(9600);
}

void loop() {
	// Přečti analogovou hodnotu z pinu č. A0.
	int rychlost = analogRead(0);
	Serial.println(rychlost);

	// Zapni LED.
	digitalWrite(13, HIGH);
	// Počkej 0 až 1023 ms.
	delay(rychlost);
	// Vypni LED.
	digitalWrite(13, LOW);


	delay(1000);

}

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:

void setup() {
  analogWrite(10, 128);
  analogWrite(11, 32);
}

void loop() {}

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.

Piny, které lze použít pro tzv. analogový výstup.

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.

PWM neboli analogový výstup z Arduina

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.

Střída obdelníkového signálu je podíl času kladného pulzu a času celé periody

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:

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.

Ukázka použití nalogového výstupu

A na závěr ještě pár poznámek:

TODO:

  1. Používaná zkratka je ADC neboli analog-to-digital converter. Ve starší české literatuře se můžete setkat ještě s neboli analogově číslicový převodník. 

  2. Střída je podíl času kdy je signál kladný a času celé periody.