Arduino UNO

Arduino UNO je malý, levný vývojový a výukový modul založený na mikroprocesoru ATmega328. Samotný modul obsahuje nastavitelné výstupy, vstupy, analogové vstupy s převodníkem, RX/TX linku atd. Skrz otevřený HW i SW jde modul využít pro vývoj vlastních aplikací. Také je možno dokoupit velké množství zajímavého a hotového příslušenství jako ethernetový modul, čtečku paměťových karet, displej, WIFI modul, GSM modul, senzory, ovladače motorů a mnoho dalších. To umožňuje snadno měnit zapojení a tvořit automaty, loggery, roboty,… a to bez potřeby neustálého kreslení a výroby DPS (PCB). Ideální je ale znát alespoň základy elektrotechniky (základní bezpečnost, práce s multimetrem, Ohmův zákon, základní součástky). Jakmile je prototypový vývoj dokončen, můžeme použít přímo dodávané Arduino nebo jen procesor přenést do vlastní DPS (PCB). Někdy postačí použít hotový modul Arduina i do poloprofesionální aplikace. Pokud malé Arduino nestačí (rozsahem výstupů, portů, pamětí), existují výkonnější moduly např Arduino Mega2560 s procesorem ATmega2560. Existují také alternativní vývojové moduly s větším výpočetním výkonem jako ESP32. Ještě více možností nabízí propojení s minipočítači Raspberry (přímé desktopové nebo serverové prostředí s velkým výpočetním výkonem).


Základní vlastnosti Arduina UNO:

Procesor ATMEGA328
16 MHz
32 kB flash paměť
2 kB SRAM paměť
1 kB EEPROM paměť
Rozhraní USB
Rozhraní RS-232
Napájení 5V z USB
Napájení 7-12V z DC konektoru
I/O (0 – 13) Nastavitelné vstupy / výstupy
I/O (0,1) RX/TX linka
I/O (2,3) externí přerušení
I/O (3,5,6,9,10,11) PWM
I/O (10,11,12,13) SPI
I/O (4,5) I2C
GND
(A0 – A5) šestice analogových vstupů s převodníkem
3,3V
5.0V


Seznámení s Arduinem, ukázkové příklady

Příprava Arduina:

Před připojením Arduina je třeba nainstalovat obslužný program vývojového prostředí Arduino IDE SW  (pokud by chyběly tak i ovladače FTDI). Po spuštění programu je důležité vybrat COM port s připojeným Arduinem a také model Arduina (např UNO, MEGA aj.). Program slouží pro psaní kódu Wiring podobného jazykům C a C++, kompilaci, debug, načtení kódu do připojeného Arduina a pro čtení dat na COM portu (sériové linky). Také zde můžeme najít ukázkové příklady a příklady z knihoven (skvělá výuková metoda). Doporučuji projít celou nabídku horního menu. Popis struktury, funkcí programovacího jazyka je přímo na stránce výrobce italského Arduina.


Příklad 01: Struktura programu, sériová linka

Základní program pro výpis ASCI textu po sériové lince ukazuje strukturu programu a práci s daty.

V praxi se nejdříve importují externí knihovny (mají v sobě další kód využívaný třeba pro funkce, displej, teplotní čidlo, další moduly). Ušetří to psaní celého kódu. Např. by někdo vytvořil knihovnu pro obsahy a obvody těles a nás by pak už nezajímalo jak fungují vzorce. Jen bychom jim poslali třeba O-OBD, strany a,b obdélníku a výsledek by byl o jako obvod obdélníku. Bylo by však nutné znát dokumentaci ke knihovně, projít ukázky použití abychom věděli jak knihovnu používat. V tomto příkladě ale knihovny nepoužíváme – není třeba. Následně se definují konstanty a proměnné pro celý program (kam uložit hodnoty a jejich tvar – číslo, písmeno, řetězec aj.). Další krok je inicializace HW, dalších parametrů do počátečních hodnot (setup). Konečně  už samotný program naší funkce v opakující se smyčce (loop). Do opakující se smyčky napíšeme hlavní program. Ten může být jen tam nebo může odkazovat na další podprogramy (třeba s vlastními proměnnými a dílčími kódy).

Do okna napíšeme nebo zkopírujeme zdrojový kód. Na počátku programu nalezneme počáteční sekvenci „void setup“ která inicializuje HW. V tomto případě se jedná o nastavení sériové linky na 9600bps. Nastavují se i vstupy, výstupy a jiné možnosti jako volání funkcí.

Dalším krokem je „void loop“ tedy neustále se opakující část programu. Je třeba rozlišovat druhy závorek. Obyčejná závorka obsahuje parametr, složená závorka část podprogramu. Dokončení příkazu se uvádí v plastnost středníkem. Dvojice lomítek slouží pro vložení komentáře.

Náš kód vypisuje text a čísla po sériové lince. Pro nahrání tohoto kódu do Arduina můžeme spustit monitor sériové linky (Tools – Serial Monitor). Náhled ukáže rozlišení příkazů print (pošle data) a println (pošle data a ukončí řádek). Dále ukázka práce s čísly (pozor na rozlišení desetinné tečky a čárky).

Zdrojový kód:

 void setup() {                         //inicializace po spuštění
  Serial.begin(9600);                   //spustí sériovou komunikaci na 9600bps
}
void loop() {                           //opakující se program
  Serial.print("AHOJ: ");               //vypíše text ASCI po sériové lince
  Serial.println("Nova zprava.");       //vypíše text ASCI po sériové lince a ukončí řádek
  Serial.println(33);                   //vypíše tuto hodnotu po sériové lince
  Serial.println(33.123456);            //vypíše tuto hodnotu na 2 des. místa po sériové lince 
  Serial.println(33.123456, 4);         //vypíše tuto hodnotu na 4 des. místa po sériové lince
  Serial.println(78, BIN);              //vypíše tuto hodnotu ve dvojkové soustavě po sériové lince
  Serial.println(78, OCT);              //vypíše tuto hodnotu v osmičkové soustavě po sériové lince 
  Serial.println(78, DEC);              //vypíše tuto hodnotu v desítkové soustavě po sériové lince 
  Serial.println(78, HEX);              //vypíše tuto hodnotu v šestnáctkové soustavě po sériové lince
  Serial.println();                     //vypíše prázdný řádek po sériové lince  
  delay(5000);                          //vyčká 5000ms (5s)
}

Příklad 02: Výstup a blikání LED

Arduino UNO má celkem 13 pinů jenž můžou sloužit jako vstupy i jako výstupy. Při inicializaci programu si navolíme PIN2 jako výstup. V dalším kroku spustíme opakující se program „void loop“. Příkazem „digitalWrite“ zapíšeme do závorky PIN který chceme ovládat a novou logickou hodnotu (LOW = LOG 0 = Vypnuto, HIGH – LOG 1 – Zapnuto). Příkaz „delay“ umožňuje zpoždění dalšího kroku v ms.

Náš program aktivuje výstup, vyčká 1000ms, vypne výstup, vyčká 1000ms a tak stále dokola… Na výstup můžeme připojit např. LED. Anodu připojíme na PIN2 a katodu přes rezistor na GND (rezistor je třeba skrz úroveň LOG 1 = 5V). Zatížení výstupu je max. 20mA!

Nevýhodou použití čekání na další krok příkazem delay je to, že v daný okamžik procesor není schopen vykonávat další činnosti (např. sledovat stisknutí tlačítka, něco počítat, ovládat jinou LED). Toto se řeší u složitějších programů třeba porovnáním dvou časových hodnot v podmínce programu.

ARDUINO_004

ARDUINO_005

Zdrojový kód – blikání LED:

void setup() {                
  pinMode(2, OUTPUT);           // nastaví PIN2 jako výstup (např. pro LED)  
}
void loop() {
  digitalWrite(2, HIGH);        // na pinu 2 nastaví logickou 1 
  delay(1000);                  // počká 1000 milisekund = 1 sekunda
  digitalWrite(2, LOW);         // na pinu 2 nastaví logickou 0 
  delay(1000);                  // počká 1000 milisekund = 1 sekunda
}
 

Zdrojový kód – blikání LED, běžící světlo:

void setup() {                
  pinMode(2, OUTPUT);           // nastaví PIN2 jako výstup (např. pro LED)  
  pinMode(3, OUTPUT);           // nastaví PIN3 jako výstup (např. pro LED)  
  pinMode(4, OUTPUT);           // nastaví PIN4 jako výstup (např. pro LED)  
}
void loop() {
  digitalWrite(2, HIGH);        // na pinu 2 nastaví logickou 1
  delay(250);                   // počká 250milisekund
  digitalWrite(3, HIGH);        // na pinu 3 nastaví logickou 1
  delay(250);                   // počká 250milisekund
  digitalWrite(4, HIGH);        // na pinu 4 nastaví logickou 1
  delay(250);                   // počká 250milisekund  
  digitalWrite(2, LOW);         // na pinu 2 nastaví logickou 0
  delay(250);                   // počká 250milisekund
  digitalWrite(3, LOW);         // na pinu 3 nastaví logickou 0
  delay(250);                   // počká 250milisekund
  digitalWrite(4, LOW);         // na pinu 4 nastaví logickou 0
  delay(250);                   // počká 250milisekund  
}

Příklad 03: Ovládání výstupu z PC

Ovládání výstupu z PC pomocí sériové linky je důležitou ukázkou demonstrující zasílání dat do Arduina. Pro zpracování je ale třeba použít několik nových vlastností programování.

const int LEDKA = 2; nám nastaví konstantu (const) pojmenovanou „LEDKA“ s pevně danou hodnotou „2“. Konstanta je pevně daná hodnota, která se při běhu programu nemění. Později nemusíme všude volat výstup 2, ale budeme si pamatovat výstup LEDKA. Toto je užitečné při práci s vícero výstupy. Můžeme je pojmenovat např. Svetlo, Motor, Sirena a pak s nimi pracovat přirozeněji. Samozřejmě se konstanty hodí i pro jiné účely. Např. si lze uložit pí, rychlost světla, rychlost zvuku apod. pro další výpočty abychom nemusely celá čísla vždy znovu vypisovat. Konstantu máme zvolenu jako celé číslo (int – integer).

int INPRIKAZ; je proměnná, do které si uložíme nějaké často měnící se data. Je to malá lokální paměť při běhu programu. Po odpojení napájení se však vymaže. Pro uložení dat odeslaných po sériové lince je toto ideální pomůcka pro další zpracování.

if je začátek podmínky. Pokud je podmínka splněna pak se vykoná další sekvence programu uložená ve složené závorce. Pokud (if)) tedy přichází data po sériové lince, uloží se data do proměnné (INPRIKAZ). Pokud (if) je obsah proměnné (INPRIKAZ) shodný (==) se znakem H (v ASCI číslo 72), aktivuje se výstup přiřazený konstantě LEDKA. Pokud (if) je obsah proměnné (INPRIKAZ) shodný (==) se znakem L (v ASCI číslo 76), deaktivuje se výstup přiřazený konstantě LEDKA.

Výsledný program tedy umožní ovládat výstup (připojenou LED) z počítače – z monitoru sériové linky. Do horního pole zadáme písmeno H nebo L a odešleme do Arduina jenž vykoná požadovaný příkaz.

Zdrojový kód – ovládání LED z PC:

const int LEDKA = 2;              // Přiřadí konstantu LEDKA číslu 2
int INPRIKAZ;                     // Proměnná pro uložení sériové komunikace
void setup() {
  Serial.begin(9600);             // Inicializace sériové linky na 9600bps
  pinMode(LEDKA, OUTPUT);         // Inicializace výstupu LEDKA (tedy druhého výstupu)
}
void loop() {
  // Sleduje, zda-li přicházejí na sérivoé lince nějaká data:
  if (Serial.available() > 0) {
    // Pokud přicházení na sériové lince data, uloží je do proměnné INPRIKAZ:
    INPRIKAZ = Serial.read();
    // pokud byl přijat do proměnné INPRIKAZ znak H (ASCII 72), zapne LED / výstup 2:
    if (INPRIKAZ == 'H') {
      digitalWrite(LEDKA, HIGH);
    } 
    // pokud byl přijat do proměnné INPRIKAZ znak L (ASCII 76) vypne LED / výstup 2:
    if (INPRIKAZ == 'L') {
      digitalWrite(LEDKA, LOW);
    }
  }
}

Zdrojový kód – ovládání 3 LED z PC (příkaz 0 – 1 – 2 – 3 zapne požadovaný počet LED):

const int LED1 = 2;              // Přiřadí konstantu LED1 číslu 2
const int LED2 = 3;              // Přiřadí konstantu LED2 číslu 3
const int LED3 = 4;              // Přiřadí konstantu LED3 číslu 4
int INPRIKAZ;                    // Proměnná pro uložení sériové komunikace
void setup() {
  Serial.begin(9600);            // Inicializace sériové linky na 9600bps
  pinMode(LED1, OUTPUT);         // Inicializace výstupu LED1 (tedy 2 výstupu)
  pinMode(LED2, OUTPUT);         // Inicializace výstupu LED2 (tedy 3 výstupu)
  pinMode(LED3, OUTPUT);         // Inicializace výstupu LED3 (tedy 4 výstupu)
}
void loop() {
  if (Serial.available() > 0) {
    INPRIKAZ = Serial.read();
    if (INPRIKAZ == '0') {
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
    } 
    if (INPRIKAZ == '1') {
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
    }
    if (INPRIKAZ == '2') {
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, LOW);
    }
    if (INPRIKAZ == '3') {
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
    }
  }
}