Od mikrokontroléra k Arduinu



Arduino

Začali sme mikrokontrolérom v kontaktnom poli. Pridali sme ďalšie súčiastky ako kryštál, kondenzátory, rezistory, LED, ... Následne sme takto zapojený obvod presunuli napevno na dosku plošných spojov. Od roku 2013 však čoraz častejšie používame open source hardvérovú platformu Arduino (opäť odporučíme skôr českú alebo anglickú verziu wikipédie), konkrétne dosky Mega 2560, UNO a Nano. Domovská stránka projektu je http://arduino.cc/.

Arduino (Nano, UNO, Mega 2560)

Okrem ceny (Arduino Nano 3.0 sa dá získať už od necelých troch eur) nás zaujíma najmä použitý mikrokontrolér a z neho vyplývajúci počet digitálnych vstupnovýstupných (I/O) pinov, koľko z nich podporuje PWM a počet analógových vstupov.

Arduino uC digital I/O PWM analog
Mega 2560 ATmega2560 54 15 16
UNO ATmega328 14 6 6
Nano ATmega328 14 6 8
Hore hájom chodník

Napájanie

Arduino dosky môžeme napájať 4 spôsobmi (Nano iba tromi):

  1. USB káblom (5V), ktorý môže slúžiť zároveň na komunikáciu s PC
  2. napájacím konektorom 2.1mm x 5.5mm - sieťový adapteur alebo batérie 7V-20V (neaplikovateľné pre Nano)
  3. pinom Vin - akýmkoľvek elektrickým napätím 7V-12V
  4. pinom 5V - stabilizovaným elektrickým napätím +5V

Elektrické napätie z príslušných pinov (GND, 5V) môžeme zároveň používať pre vlastné zapojenia a obvody (aj +3.3V z pinu 3.3V, okrem prípadu, keď používame Nano a nenapájame ho pomocou USB kábla).

Arduino Mega 2560 - napájanie)

Arduino UNO - napájanie)

Arduino Nano - napájanie)

Hore hájom chodník

Reset

Na resetovanie mikrokontroléra môžeme stlačiť tlačidlo RESET na doske Arduina. Pull up rezistor na doske "ťahá" stav pinu RST na hodnotu HIGH (1, +5V) a po stlačení tlačidla RESET sa stav na pine RST zmení na LOW (0, 0V, GND). Mikrokontrolér môžeme resetnúť aj privedením GND (LOW, 0, 0V) na pin RST (v obrázkoch napájania vyššie je pin RST označený žltým štvorčekom).

Reset

Hore hájom chodník

Digitálne I/O piny

Na digitálnom pine môže byť vo všeobecnosti iba jedna z dvoch hodnôt 0 alebo 1, ide o binárnu hodnotu (neplatí pre PWM výstup).

Hodnota 0 znamená, že na digitálnom pine je elektrické napätie 0V, teda GND (alebo menej ako 2V pre vstup). Túto skutočnosť môžeme vyjadriť stavmi LOW alebo 0.

Hodnota 1 znamená, že na digitálnom pine je elektrické napätie +5V (alebo viac ako 3V pre vstup). Túto skutočnosť môžeme vyjadriť stavmi HIGH alebo 1.

Pri digitálnych výstupných pinoch v móde PWM sa na pin posiela celé číslo z rozsahu 0 až 255. Veľmi zjednosušene si to môžeme predstaviť ako namapovaný rozsah el. napätia 0V až 5V do číselného intervalu 0 až 255 a zariadenie pripojené na takýto výstup sa chová, akoby sme zmenou číselnej hodnoty 0-255 na pine zmenili el. napätie na zariadení. Praktické využitie je napr. pri postupnom rozsvecovaní a zhasínaní LED, pri ovládaní rýchlosti motorov pomocou ovládača H-bridge a pod.

Pri použití digitálneho pinu ako vstupu je možné využiť aj interný pull up rezistor priamo v mikrokontroléri.

Digitálny pin č.13 (LED_BUILTIN) je už priamo spojený s LED na doske. Treba s tým uvažovať najmä v prípade, ak chceme pin č.13 využiť ako vstupný.

Digital OUTPUT

Digital OUTPUT - pin č.13

Digital OUTPUT

Digital INPUT

Digital INPUT

Hore hájom chodník

Analógové vstupné piny

Analógové vstupné piny môžu byť použité aj ako všeobecné digitálne I/O piny (okrem pinov A6 a A7 na doske Arduino Nano, tie sú výhradne analógové), viď vyššie.

Pri použití analógových vstupných pinov tieto pracujú ako A/D prevodník a nadobúdajú hodnoty od 0 do 1023 v závislosti od elektrického napätia na vstupnom analógovom pine. Tento rozsah 0V-5V možno zmeniť buď softvérovo alebo privedením referenčného el. napätia (max. +5V) na pin AREF (táto referenčná hodnota sa stane max. hodnotou pre namapovanie napäťového rozsahu do číselného intervalu 0-1023).

Analog INPUT

Analog INPUT

Hore hájom chodník

Ďalšie funkcie pinov

Niektoré piny mikrokontroléra majú okrem svojej I/O (vstupnovýstupnej) funkcie ešte jednu alebo viac ďalších funkcií, napr. RX, TX (serial) pre komunikáciu so SW Arduino (upload, serial monitor), SDA, SCL pre komunikáciu po zbernici i2c (ovládanie displeja LCD 1602), INT0, INT1, ... pre ošetrenie externých prerušení.

Je dobré na toto pamätať už pri návrhu na ktorý pin čo bude pripojené. Napríklad nevhodným zabraním pinov RX a TX sa môže znefunkčtiť upload a komunikácia s PC, prípadne sa motory robota rozbehnú vždy pri uploade (vlastná skúsenosť, robota bolo treba pri uploade držať nad stolom).

Arduino Mega 2560 - piny)

Arduino UNO - piny)

Arduino Nano - piny)

Hore hájom chodník

Softvér Arduino IDE

Inštalácia

Vývojové prostredie Arduino IDE je dostupné na stránke projektu Arduino v sekcii Download. V novembri 2014 je Arduino IDE vo verzii 1.0.6. Bližšie informácie k inštalácii a následné prvé kroky sú uvedené taktiež v sekcii Learning - Getting Started.

Nastavenie

Po inštalácii Prostredia Adruino IDE je potrebné pripojiť Arduino dosku k PC pomocou USB kábla. V prípade, že operačný systém potrebuje nainštalovať ovládače pre pripojenú Arduino dosku, tak tieto sú uložené v adresári drivers inštalácie (napríklad C:\\Program Files\Arduino\drivers\). Po ich inštalácii vznikne nový sériový port (napríklad COM42).

Príslušný sériový port, rovnako ako aj typ dosky Arduina je potrebné nastaviť, prípadne skontrolovať hneď po spustení prostredia Arduino IDE z hlavného menu:

V prípade, že sa naša doska Arduino nezobrazí v menu Tools - Serial Port, tak ju odpojíme a opätovne pripojíme k PC, prípadne využijeme iný USB port PC.

Povinné funkcie

Tak ako v jazyku C sme mali povinnú funkciu int main(), tak aj v Arduino programe existuje podobná povinná funkcia, dokonca až dve.

Kým príkazy prvej funkcie setup() sa po spustení programi vykonajú iba jaden krát, tak príkazy druhej funkcie loop() sa po spustení programu vykonávajú opakovane. Blok príkazov danej funkcie je ohraničený zloženými (motýlikovými) zátvorkami. Každý príkaz je ukončený bodkočiarkou. Činnosti jednotlivých blokov príkazov je dobré pri písaní programu stručne opísať v komentári (// do konca riadka, /* na viac riadkov */).

Výbornou pomocou pri písaní programov je referenčná príručka jazyka Arduino, ktorá sa nachádza na stránke projektu Arduino v sekcii Learning - Reference alebo je možné sa k tejto príručke dostať priamo z prostredia Arduino IDE z hlavného menu Help - Reference.

Čo z jazyka Arduino sme doteraz predstavili?

A takto nejako by mohol vyzerať náš úplne prvý program:

/*
  Viacriadkovy komentar na zaciatku programu,
  kde mozeme napisat podrobnosti o programe,
  co robi, kde je co pripojene a tak podobne
*/

void setup() {
  // tu budu prikazy, ktore sa vykonaju iba raz
}

void loop() {
  // tu budu prikazy, ktore sa vykonavaju opakovane
}

Syntaktickú kontrolu programu vykonáme z prostredia Arduino IDE z hlavného menu Sketch - Verify/Compile (alebo klepnutím na piktogram Verify). V konzole prostredia Arduino IDE dole vidíme výsledok kontroly (a prípadné chyby). Program môžeme nahrať do mikrokontroléra na doske Arduino z prostredia Arduino IDE z hlavného menu File - Upload (alebo klepnutím na piktogram Upload).

Serial Monitor - komunikácia s PC

/*
  Program inicializuje komunikaciu s PC Serial Monitor
  a opakovane kazdu sekundu vypisuje cele cisla (integer)
  s pouzitim celociselnej premennej i 
*/

int i=0;                        // i je celociselna premenna (int) a na zaciatku ma priradenu hodnotu 0

void setup() {
  Serial.begin(9600);           // inicializacia seriovej komunikacie
}

void loop() {
  Serial.print("Pisem cislo "); // vypis retazca (text medzi uvodzovkami)
  Serial.println(i);            // vypis (s ukoncenim riadka) hodnoty premennej i
  delay(1000);                  // cakanie 1s (1000ms)
  i++;                          // hodnota premennej i sa zvacsi o 1 (i=i+1)
}

Po spustení programu (alebo po resete mikrokontroléra) treba otvoriť okno Serial Monitor z prostredia Arduino IDE z hlavného menu Tools - Serial Monitor (alebo klepnutím na piktogram Serial Monitor).

Čo z jazyka Arduino sme predstavili teraz?

Sériová komunikácia dosky Arduina s PC je užitočná najmä pri ladení programov, lebo si môžeme dať vypisovať hodnoty premenných a kontrolovať tak správnosť algoritmu programu. Serial Monitor môžeme tiež používať napríklad na výpis fyzikálnych veličín meraných pomocou snímačov (neskôr si ukážeme aj výpis na LCD panel pripojený k doske Arduina).

Nevýhodou používania sériovej komunikácie je značné časové zaťaženie behu programu. Ak potrebujeme aby program reagoval rýchlo, je treba príkazy pre sériovú komunikáciu zakomentovať, prípadne ich spúšťať podmienečne na základe hodnoty konštanty, v ktorej na úvod definujeme, či má alebo nemá prebiehať výpis.

(Optional) V nasledujúcom príklade použijeme dátové typy unsigned long a boolean a matematickú operáciu zvyšku po celočíselnom delení modulo %.

/*
  Program inicializuje komunikaciu s PC Serial Monitor
  a vypisuje prvocisla v poradi od najmensieho
  Maximalne testovane cislo je 4294967295 unsigned long
  (pre int by bolo maximalne testovane cislo iba 32768)
*/

unsigned long i,                       // premenna cyklu
              cislo=2,                 // cislo, ktore testujeme, ci je prvocislo
              n=1;                     // poradie vypisovaneho prvocisla

boolean prime=1;                       // 0-false, 1-true


void setup() {
  Serial.begin(9600);                  // inicializacia seriovej komunikacie
}


void loop() {
  
  for (i=2; i<cislo; i++) {
    prime=1;                           // predpokladajme ze je prvocislo
    if (!(cislo % i)) {                // zvysok po deleni je nula, nie je to prvocislo
        prime=0;
	i=cislo;                       // nech vyskoci z cyklu a zbytocne uz nerata
    }
  }
  
  if (prime) {                         // vypis prvocisla
    Serial.print(n); 
    Serial.print(". prvocislo je ");
    Serial.println(cislo);
    delay(500);                        // pre spomalenie vypisu na Serial Monitor
    n++;
  }

  cislo++;
}

Nastavenie vstupno-výstupných I/O pinov

V texte a obrázkoch vyššie sme uviedli počty, typy a umiestnenie I/O pinov jednotlivých Arduino dosiek. Ešte pred písaním programu je nutné rozdeliť ktoré zariadnie budú pripojené na ktoré piny. Čo sa elektrického napätia týka, tak na I/O pinoch môže byť elektrické napätie v rozsahu od 0V, GND do +5V.

Ako vstupné (INPUT) piny budú definované piny pripojené na rôzne snímače (tlačidlá, potenciometre, infračervené a ultrazvukové snímače). Informácie z reálneho sveta sa prostredníctvom vstupných pinov dostávajú na spracovanie do mikrokontroléra.

Ako výstupné (OUTPUT) piny budú definované piny pripojené na akustické, vizuálne a akčné prvky (LED, buzzer, motory). Informácie z mikrokontroléra sa prostredníctvom výstupných pinov reprezentujú v reálnom svete.

Daný I/O pin je potrebné pred jeho použitím nastaviť buď ako vstupný, alebo ako výstupný pin. Toto nastavenie sa vykoná príkazom pinMode() pre každý použitý pin väčšinou už vo funkcii setup(). Príkaz pinMode() má dva parametre, číslo pinu a hodnotu z možností INPUT, INPUT_PULLUP alebo OUTPUT.

V prípade, že pin bude použitý ako výstup (pinMode(n, OUTPUT)) môžeme na pin priviesť el. napätie digitálne 0V, GND (0, LOW) alebo +5V (1, HIGH) príkazom digitalWrite() alebo pre PWM pin aj PWM hodnotu z rozsahu od 0 do 255 príkazom analogWrite() kde rozsah 5V je rodelený do intervalu 0-255.

V prípade, že pin bude použitý ako vstup (pinMode(n, INPUT) alebo pinMode(n, INPUT_PULLUP)) môžeme z pinu zistiť el. napätie digitálne 0V-2V (0, LOW) alebo 3V-5V (1, HIGH) príkazom digitalRead() alebo pre analógový vstupný pin aj analógovú hodnotu z rozsahu od 0 do 1023 príkazom analogRead() kde rozsah 5V (prípadne iný použitím príkazu analogReference()) je rozdelený do intervalu 0-1023.

Na obrázku nižšie sú schematicky znázornené hodnoty elektrického napätia na I/O pine a príslušné digitálne a analógové hodnoty. Obrázok tiež poskytuje prehľad použitých príkazov pre prácu s I/O pinmi (zelená farba textu).

I/O piny

Čo z jazyka Arduino sme predstavili teraz?

PaedDr. Karol Pauchly, ZŠ s MŠ Chlebnice, november 2014