Pojďme programovat elektroniku | Arduino

Programování elektroniky: Naučte se Arduino teď hned a přímo v prohlížeči

  • Arduino můžete naprogramovat bez jediné součástky
  • Pomůže webový prohlížeč a simulátor Wokwi
  • Nabízí desítky virtuálních součástek včetně motorů a displejů

Téměř každý nedělní večer patří na Živě.cz takovému tomu domácímu programování a prototypování elektroniky, kdy se pokouším co nejsrozumitelněji a na reálných příkladech ze života ukázat, k čemu je to vlastně všechno dobré.

Přes veškerou snahu je mi ale naprosto jasné, že dokážu oslovit jen malou část našich čtenářů. Naprostí začátečníci se totiž možná ani tak nezaleknou poměrně jednoduchého programového kódu, ale toho všeho okolo, co budou muset zvládnout ještě před vyťukáním první instrukce na své klávesnici.

Stmívač LED s potenciometrem v simulátoru:

Musejí nakoupit součástky, musejí nainstalovat a pochopit vývojové prostředí Arduino (o těch pokročilejších raději ani nemluvě), no a to všechno vyžaduje odvahu a čas. Hromadu času! Stručně řečeno, mnoho prvotních nadšenců to spolehlivě odradí.

Simulátor Wokwi

Naštěstí je tu jedno velmi povedené řešení, které se bude hodit i zkušeným domácím kutilům na testy: simulátor Wokwi. Běží přímo ve webovém prohlížeči a v přívětivě a opravdu použitelné formě v něm můžete programovat nejen tu nejzákladnější ze základních desek světa Arduino – Arduino Uno, ale i jejího rozměrného sourozence Arduino Mega.

Klepněte pro větší obrázek
Úvodní stránka slibuje simulaci hned několika základních desek

V nabídce nakonec nechybí ani mnohonásobně výkonnější armové Raspberry Pi Pico, prototypovací destička s oblíbeným Wi-Fi čipem z rodiny ESP32 a hromada hotových příkladů.

Editor kódu, plátno s deskou a plotr

K simulátoru se přihlásíte účtem na Googlu, GitHubu nebo skrze e-mail. Vše je zdarma a po přihlášení získáte přístup ke svým uloženým projektům webového Arduina.

Klepněte pro větší obrázek
Editor kódu s našeptávačem, plátno s deskou a virtuální sériová deska

Každý z nich se skládá ze samotného editoru kódu, ve kterém nechybí našeptávač pro snazší doplňování, okna s vybranou deskou a také simulátoru sériové linky pro snadný textový výstup. K dispozici je dokonce i jednoduchý grafický plotr.

Klepněte pro větší obrázek
Při výpisu numerických dat lze sériovou linku přepnout do grafického plotru 

Podpora desítek elektrických komponent

Do simulační části s deskou můžete vložit několik desítek podporovaných komponent počínaje primitivní LED a nejrůznějšími tlačítky, no a konče servomotory, všemožnými čidly teploty a samozřejmě i displeji.

Klepněte pro větší obrázek
Knihovna komponent nabízí několik desítek základních součástek a modulů

Každý takový rozšiřující modul má svoji nápovědu s popisem I/O pinů a vy jej ručně propojíte na piny základní desky. Dodatečné nastavení součástek a třeba i barvy propojovacích drátků upravíte v souboru diagram.json, který popisuje chování celého grafického plátna.

Příklad: Stmívač LED s potenciometrem

Pojďme si to vyzkoušet na primitivním příkladu s červenou LED a posuvným potenciometrem. LED i potenciometr (Slide Potentiometer) najdeme v roletce komponent pod tlačítkem + a umístíme je do plátna.

Klepněte pro větší obrázek
Propojené schéma simulátoru

Ve skutečném obvodu s LED by neměl chybět ještě rezistor, který sníží elektrický proud na bezpečnou úroveň, abychom maličkou LED nespálili. To sice u té virtuální v simulátoru nehrozí, pro formu jej ale na plátno přeneseme také, rezistor je totiž dobrým příkladem toho, jak se pracuje se zmíněným souborem diagram.json. Právě v něm totiž nastavíme hodnotu jeho elektrického odporu třeba na 220 ohmů.

{
      "type": "wokwi-resistor",
      "id": "rezistor",
      "top": -233.13,
      "left": 76.98,
      "attrs": { "value": "220" }
    }

V reálném světě by LED svítila velmi jasně, přičemž adekvátním zvýšením odporu rezistoru by jas poklesl. Simulátor Wokwi až tak daleko nejde. Je to opravdu v prvé řadě simulace samotného digitálního Arduina a určitě ne věrná kopie fyzikálního světa. O tu tentokrát ale opravdu nejde.

O jas LED se postará PWM

LED má dva výstupy, delší anodu (A/+) a kratší katodu (C/-). Katodu klepnutím propojíme se systémovou zemí (0 V/-) na desce Arduino Uno označenou GND a anodu v sérii se zmíněným rezistorem do GPIO pinu číslo 3. GPIO, tedy General Purpose Input Output, už podle svého názvu slouží pro libovolné I/O operace, přičemž pin číslo 3 jsme nezvolili náhodou.

Klepněte pro větší obrázek
Obvod s LED a rezistorem

Na desce je označený drobnou vlnkou, což znamená, že na něm můžeme generovat pulzně-šířkový modulovaný signál PWM. Tedy obdélníkový signál, který bude v případě desky Arduino Uno kmitat s frekvencí 490 Hz, a my budeme nastavovat různou šířku obdélníku v jednotlivých periodách.

Říkáme tomu střída signálu a už jsme se ji podrobně věnovali v jednom z předchozích dílů, když jsme pomocí laserového paprsku přenášeli zvukové vlny.

Klepněte pro větší obrázekKlepněte pro větší obrázek
Na obrázku vlevo má pulz malou šířku, LED proto v každé periodě jen krátce blikne. Na obrázku vpravo jsme šířku zvýšili, prodlouží se tedy i bliknutí a LED se nám zdá jasnější 

LED bude díky PWM velmi rychle blikat (490 Hz už lidským okem nepostřehneme) a my pomocí posuvného potenciometru nastavíme šířku každého bliknutí.

PWM nastavíme pomocí potenciometru

Posuvný potenciometr má tři piny, jejichž identifikaci se dozvíte, když na každý z nich najdete myší. VCC (Voltage Common Collector) slouží jako systémový zdroj napájení, a my jej proto spojíme s pinem 5 V na desce. Druhý pin SIG připojíme do některého ze vstupních analogových pinů – třeba A0. Na opačné straně opět nechybí GND pro připojení k systémové zemi (0 V/-).

Klepněte pro větší obrázek
Posuvný potenciometr naší simulace. Hlavou nastavíme napětí na pinu A0 v rozmezí 0-5 V a toto napětí pomocí 10bit A/D převodníku na řídícím čipu převedeme na celé číslo 0-1023

Potenciometr postupným otáčením nebo posouváním (dle konstrukce) mění napětí v obvodu, které pomocí A/D převodníku transformujeme na digitální celé číslo. Na desce Arduino Uno jsou k subsystému ADC připojené právě piny A0 až A5.

Řídící čip ATmega328P disponuje 10bitovým A/D převodníkem, takže nám převede spojité napětí 0 V až 5 V na diskrétní celé číslo v rozsahu 0 až 1 023. Osmibitový generátor PWM pak umožňuje nastavit šířku pulzu (střídu) v rozsahu 0 až 255, a tak oba rozsahy přepočítáme a konečně vytvoříme 490Hz blikot, který podle šířky pulzu v periodě rozsvítí LED nízkým, nebo naopak vysokým jasem.

Klepněte pro větší obrázek
Zelená křivka v plotru patří přepočítané A/D hodnotě z potenciometru a oranžová už patří přepočítané hodnotě pro střídu signálu PWM. Nejdříve jsme tedy nastavili jas na 50 %, pak na 100 % a na závěr jsme se vrátili zpět zhruba k 50 %

Abychom si ukázali možnosti celého simulátoru, hodnotu z potenciometru (respektive A/D převodníku) a šířku pulzu pro signál PWM budeme pro kontrolu vypisovat ve virtuálním sériovém terminálu. Pak už jen stačí celou simulaci spustit a pomocí posuvného potenciometru nastavovat jas.

Skvělý nástroj pro učení stylem pokus-omyl

Simulátor funguje poměrně dobře a hlavně věrně, naprostí začátečníci se na něm proto mohou učit stylem pokus-omyl, aniž by hrozilo, že si poničí skutečné elektrické komponenty. Simulátor ale ocení i zkušení kodéři ze světa Arduino, lze si na něm totiž rychle otestovat nápad, který máte v hlavě, aniž byste museli ze skříně vytahovat hromadu drátků a součástek.

Klepněte pro větší obrázekKlepněte pro větší obrázek
Simulace RGB LED proužku a maticového displeje s teploměrem DHT22 a čipem reálného času DS1307. Vše si můžete zkusit naprogramovati bez skutečného Arduina a čidel

Z tohoto důvodu nechybí ani možnost importu už hotových zdrojový kódů z počítače a samozřejmě ani správce knihoven s vyhledávačem, který do projektu stáhne kód pro ovládnutí konkrétního čidla či aktuátoru podobným způsobem, jak to umí klasické desktopové Arduino IDE.

Na závěr kód celého projektu

Takže vzhůru do experimentování a programování jednoduchých čipů, čidel i motorů, aniž byste před sebou měli jediný z nich.

Na závěr jako vždy nesmí chybět komentovaný zdrojový kód, byť ten z dnešního pokračování je opravdu velmi jednoduchý a slouží především pro naprosté začátečníky.

Soubor diagram.json, který popisuje prvky simulace:

{
  "version": 1,
  "author": "Jakub Čížek",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-arduino-uno",
      "id": "zakladni-deska",
      "top": -103.25,
      "left": -71.31,
      "attrs": {}
    },
    {
      "type": "wokwi-slide-potentiometer",
      "id": "potenciometr",
      "top": 94.81,
      "left": 93.28,
      "attrs": { "travelLength": "60" }
    },
    {
      "type": "wokwi-led",
      "id": "led",
      "top": -179.16,
      "left": 29.28,
      "attrs": { "color": "red" }
    },
    {
      "type": "wokwi-resistor",
      "id": "rezistor",
      "top": -146.35,
      "left": 85.45,
      "attrs": { "value": "220" }
    }
  ],
  "connections": [
    [ "led:C", "zakladni-deska:GND.1", "black", [ "v0" ] ],
    [ "zakladni-deska:3", "rezistor:2", "red", [ "v0" ] ],
    [ "rezistor:1", "led:A", "red", [ "v0" ] ],
    [ "potenciometr:GND", "zakladni-deska:GND.3", "black", [ "v-34.41", "h-305.12" ] ],
    [ "potenciometr:SIG", "zakladni-deska:A0", "green", [ "h-23.28", "v-52.66", "h68.26" ] ],
    [ "potenciometr:VCC", "zakladni-deska:5V", "red", [ "h0" ] ]
  ]
}

Soubor svetylko.uno, který obsahuje kód programu v C/C++:

// Hlavni funkce setup, ktera se zpracuje hned po startu
void setup() {
  Serial.begin(9600); // Nastartovani seriove linky rychlosti 9 600 b/s
  pinMode(3, OUTPUT); // Nastaveni GPIO pinu 3 na vystup
}

// Druha povinna smycka, jejiz obsah se opakuje stale dokola
void loop() {
  // Do 16bitove celociselne promenne bez znamenka 'posuvnik' uloz
  // hodnotu z A/D prevodniku a pinu A0
  uint16_t posuvnik = analogRead(A0);

  // Do 8bitove celociselne promenne 'jas' uloz prepocet promenne posuvnik
  // z rozsahu 0-1023 na rozsah 0-255
  uint8_t jas = map(posuvnik, 0, 1023, 0, 255);

  // Na GPIO pinu 3 vytvor PWM signal,
  // jehoz strida/sirka pulzu bude rovna promenne 'jas'
  analogWrite(3, jas);

  // Pro kontrolu vypis do seriove linky radek ve formatu
  // posuvnik TABULATOR jas ZAKONCENIRADKU
  Serial.print(posuvnik);
  Serial.print('\t');
  Serial.println(jas);
}
Diskuze (14) Další článek: Autonomní traktor John Deere pracuje, i když farmář spí. Vývoj řeší úplně jiné výzvy než u aut bez řidiče

Témata článku: Google, Programování, Pojďme programovat elektroniku, Wi-Fi, Arduino, Kód, GitHub, C++, Simulátor, LED, Output, Arduino ID, Arduino Mega, GPIO, Pro, Arduino Uno, Součástka, PWM, Jas, VCC, OMM, Nastartování, GND, Raspberry Pi Pica, Elektronika