Analogový výstup z Arduina

Toto jednoduché zapojení je inspirováno videem Internet Meter od Matta Richardsona:

Zaujal mně nápad použít analogový měřící přístroj, jako ukazatel digitální hodnoty získané z Internetu. Jelikož ale nemám k dispozici Ethernet Shield, upravil jsem zapojení tak, aby se data do Arduina odesílaly přes sériové rozhraní (s využitím knihovny Serial).

Teorie

Vzhledem k tomu, že Arduino nemá analogový výstup, použijeme digitální výstup, který je označen vlnovkou (~). Tyto výstupy, kterých je na Arduino Uno celkem 5, je možné použít na pulzně šířkovou modulaci (zkratka PWM — Pulse Width Modulation) a ovládají se pomocí funkce analogWrite(pin, hodnota), kde pin je číslo výstupního pinu a hodnota je číslo v rozsahu jednoho neznaménkového bajtu, tedy 0 až 255. Frekvence výstupního signálu je přibližně 490 Hz.

Pulzně šířková modulace se často používá pro řízení výkonu motorů, v pulzních zdrojích a někdy také v audio technice pro různé zvukové efekty. Na obrázku níže je animace, která ukazuje jak vypadá výstup PWM.

Perioda T a šířka signálu τ u PWM
Perioda T a šířka signálu τ u PWM (zdroj Wikipedia).

Výstupní signál má obdelníkový průběh se střídou D (anglicky označována jako duty cycle) — to je podíl délky kladného pulzu τ a délky jedné periody T. Zapsáno matematicky:

\(
D = \frac{\tau}{T}
\)

Pokud budeme měnit střídu, bude se měnit i průměrná hodnota sigálu a tedy i výkon.

Různá střída (D) obdelníkového signálu.
Různá střída (D) obdelníkového signálu (zdroj Wikipedia).

Průměrnou hodnotu y signálu f(t) s periodou T můžeme spočítat jako

\(
\bar y = \frac{1}{T}\int^T_0f(t)\,\mathrm{d}t.
\)

Pokud výše zapsaný integral spočítáme (výpočet viz PWM na Wikipedii), zjistíme, že průměrná hodnota je rovna

\(
\bar y = D \cdot y_{H} + (1 – D) y_{L},
\)

kde yH a yL jsou maximální a minimální hodnoty signálu. Výstup Arduina má maximální hodnotu 5V a minimální 0 V. Tím se nám celý výraz ještě zjednodušší

\(
\bar y = D \cdot y_{H}.
\)

Průměrná hodnota je tedy závislá na střídě D.

Na závěr si ještě ukažme spektrum šířkově modulovaného signálu pro různé hodnoty střídy.

Spektrum PWM signálu s různou střídou.
Spektrum PWM signálu s různou střídou (zdroj Wikipedia).

Zapojení

Samotné zapojení je velmi jednoduché. Propojte digitální pin číslo 3 a GND na Arduinu se svorkami analogového voltmetru a nastavte na něm rozsah nejbližší vyšší k hodnotě 5 V.

Já jsem k tomuto účelu použil stařičký Avomet II s rozsahem 6 V.

Starý Avomet II připojený na digitální pin 3 Arduina.
Starý Avomet II připojený na digitální pin 3 Arduina.

Program

Arduino

Program, který bude ovládat Arduino je také velmi jednoduchý — ve smyčce budeme číst data ze sériového rozhraní a zapisovat je na pin číslo 3. Vzhledem k tomu, že tento pin může být použit k PWM, budou číselné hodnoty převedeny na obdelníkový signál s odpovídající střídou. Jak již bylo řečeno v teoretické části, PWM signál bude mít průměrnou hodnotu odpovídající střídě, kterou pak naměří analogový voltmetr.

Vzhledem k tomu, že funkce analogWrite() očekává jako svůj parametr číslo v rozsahu 0 až 255, lze jednoduše vypočítat napětí odpovídající jednomu dílku:

\(
u_{\frac{1}{255}} = \frac{y_H}{255} = \frac{5}{255} \doteq 0{,}02\,V
\)

Pokud na výstup pošleme například hodnotu 128:

analogWrite(3, 128);

měřící přístroj zobrazí hodnotu odpovídající:

\(
U = 128 \cdot 0{.}02 = 2{,}56\,V
\)

PC

Data budeme do Arduina odesílat z počítače přes sériovou linku. Nejjednodušší způsob je využít sériového rozhraní přímo v programátoru Arduina. Zde je ale nutné si uvědomit, že se data odesílají jako řetězce po bajtech, takže musíme odesílat znaky ASCII tabulky. Pokud chceme do arduina odeslat hodnotu například 107, musíme pomocí Serial Monitor odeslat znak k.

"Serial Monitor" v Arduino programovacím prostředí.
"Serial Monitor" v Arduino programovacím prostředí.

Pokud používáte Unixový systém (například GNU/Linux nebo Mac OS) a jste trochu zdatní v používání terminálu, můžete pro odesílání dat do Arduina použít tento jednoduchý skript v Pythonu:

>>> import serial
>>> s = serial.Serial(port='/dev/tty.usbmodem641', baudrate=9600)
>>> s.write(chr(128))
1
>>>

Cestu /dev/tty.usbmodem641 je nutné upravit podle cesty k vašemu Arduinu. To zjistíte například z programátoru v Tools -> Serial Port.

Otázky?
Máte k teorii okoli PWM otázku? Nedaří se vám zprovoznit analogWrite()? Nedaří se vám zprovoznit sériová komunikace na PC? V našem Q&A fóru vám poradíme.

Závěr

Tento jednoduchý příklad ukázal použití pulzně šířkové modulace jako analogového výstupu z Arduina. Výstup jsme připojili na analogový voltmetr, ale obecně lze použít i cokoliv jiného. Pokud místo voltmetru použijeme reproduktor, můžeme generovat jednoduché melodie, které se budou posílat přímo z počítače. Pokud připojíme stejnosměrný motorek, můžeme tak ovládat rychlost otáčení.

Možností je mnohem více a fantasii se meze nekladou. Co s tímto dokážete udělat vy? Napište nám na náš Twitter nebo Facebook vaše nápady.

Články v sérii<< Čtení a zápis do EEPROM pomocí I²CArduino a knihovny >>