Analogový výstup ESP32 pomocí MicroPython
Vývojová deska ESP32 má dva integrované 8-bitové digitálně analogové převodníky DAC, které se používají k převodu digitálních signálů na analogové. Tyto analogové výstupy jsou připojené k GPIO pinu 25 (kanál 1) a pinu 26 (kanál 2). Zápisem hodnoty v rozsahu 0–255 tak můžeme na těchto pinech vytvářet výstupní napětí v rozmezí 0–3,3 V. To může mít různá využití v řadě aplikací, zejména tam, kde něco potřebujeme řídit pomocí proměnného napětí. Je ale potřeba si uvědomit, že výstupy modulu ESP32 mají své proudové limity, takže pro jakékoliv proudově náročnější (silové) výstupy je třeba výstupy DAC doplnit potřebnými obvody, například zesilovačem.
- POZNÁMKA:
- I když oficiální dokumentace modulu ESP32 slibuje na DAC výstupu při výstupní hodnotě 255 napětí rovno napájecímu (3,3 V), měření na reálných obvodech to moc nepotvrzují. Podobně je to i s minimální hodnotou 0 V. Spíše počítejme s napěťovým rozsahem 0,05–3,16 V (měřeno při Ucc = 3,28 V).
Pro ovládání DAC výstupů je má MicroPython v základním modulu machine
určen objekt DAC
. Práce s tímto objektem nám bude poměrně dost připomínat práci s předešlým
objektem PWM. Také je třeba nejdříve vytvořit objekt Pin pro požadovaný pin a ten pak použít při vytvoření proměnné pro přístup k DAC výstupu.
Ukážeme si to v následující ukázce kódu:
from machine import Pin, DAC
dacPin1 = Pin(25) # nastavení přístupu k pinu (lze pouzit jen 25 a 26)
dac1 = DAC(dacPin1) # promenna pro praci s DAC vystupem
Příkaz pro export digitálních hodnot do analogových hodnot se jmenuje write a má následující formát: (kde vystupni_hodnota
je celé číslo v rozsahu 0 až 255).
dac1.write(vystupni_hodnota)
A to je vlastně vše. Jak vidno, pokud pochopíme základní styl práce s objekty v Pythonu, jde to najednou jako po másle. 😊
Ukázka – analogový výstup DAC (generátor funkce sinus):
Jako ukázku si zde uvedeme program, který bude sloužit jako generátor napěťového harmonického průběhu na GPIO pinu 25.
Než se však pustíme do tohoto programu, musíme si uvědomit, že budeme používat kromě funkcí, které již známe a běžných aritmetických operátorů, i složitější funkce matematické, jako je funkce sinus a i konstanta π. Pro metody obecnější matematiky musíme ke svému programu připojit matematický modul nazvaný math
. Připojíme ho pomocí společného příkazu import společně s modulem time, který využijeme pro časování generovaného signálu.
from machine import Pin, DAC
import time, math
dacPin1 = Pin(25) # nastavení přístupu k pinu (lze pouzit jen 25 a 26)
dac1 = DAC(dacPin1) # promenna pro praci s DAC vystupem
while True:
for deg in range(0, 360):
pro_vystup = 128+80*math.sin(deg*math.pi/180);
vystup = int(pro_vystup)
dac1.write(vystup)
time.sleep_us(50)
Opět si neodpustíme pythonovské okénko, ve kterém si něco málo řekneme k jazyku Python. Nejdříve se zaměřme na použití funkce sinus. Jak vidíme v kódu je funkce sinus použita jako metoda objektu math. Někomu to asi připomíná práci s funkcí sinus v JavaScriptu, kde je taktéž součástí nějakého matematického objektu.
Protože funkce sinus pracuje s argumentem v radiánech, je třeba naši proměnnou deg, která postupně nabývá celých hodnot v rozmezí 0 až 359 (viz příkaz range()
v cyklu for
), na radiány převést. K tomu využijeme poznatku, že π radiánů odpovídá 180°. Hodnotu konstanty π nám poskytne atribut .pi
objektu math
.
Jelikož výstupní hodnotou funkce DAC.write
je celé číslo, zatímco hodnota vypočtená pomocí funkce sinus je určitě hodnotou reálnou, uložíme si tuto hodnotu nejdříve do proměnné pro_vystup
. Protože Python automaticky typuje proměnné, nebylo by možné tuto proměnnou vypsat výstupní funkci write
. Převede tedy hodnotu proměnné pro_vystup
do proměnné celočíselné vystup pomocí funkce ini()
.
Jak jsme si řekli, jazyk Python je interpretr, tedy musí všechny příkazy neustále překládat. Výše uvedený kód je napsán tak, aby byl názorný z hlediska toho, co se v něm děje. Při bližším pohledu nás jistě napadne, že by jej bylo možné zoptimalizovat. Například konstanta π/180 se neustále vypočítává, přitom musí stále vracet jedu a tutéž hodnotu.
Pokud Vás to při prohlížení kódu napadlo, gratulujeme! Začínáte myslet pythonovsky! 😉
Pro ověření funkčnosti DAC výstupu právě vytvořeného generátoru, použijeme osciloskop. GPIO pin 25 připojíme na vertikální vstup (napěťový rozsah DAC výstupu modulu ESP32 bude 0–3,3 V), pro vykreslení vygenerovaného průběhu zvolíme vhodnou časovou základnu (frekvence generovaného signálu je přibližně 50 Hz).
Abychom nemuseli přenášet osciloskop k počítači s prostředím Thonny, uložili jsme kód generátoru do modulu ESP32 pod názvem main.py
. Jak už z některého z předešlých článků víme, kód programu (zde kód generátoru) se tím pádem v modulu ESP32 automaticky spustí ihned po připojení napájení.
- POZNÁMKA:
- Bohužel DAC výstup modulu ESP32 není zcela lineární, proto v krajních hodnotách – okolo 0 a okolo 255 – dochází k jistému zkreslení. Z tohoto důvodu generované hodnoty pro výstup (proměnná
vystup
) nejsou v plném rozsahu 0–255, ale funkce je vypočítávána okolo prostřední hodnoty 128 s amplitudou jen 80.
Z hlediska modulu ESP32 a jeho základních výstupů jsme prošli základní možnosti. Trochu jsme poznali i vstupy, i když zatím jen digitální pomocí kterých jsme například testovali stisknutí tlačítka. Příště nám tedy zbývá se podívat na další možnosti načítání vstupů modulu ESP32 v jazyce Python. Můžeme napovědět, že bychom se ještě rádi zaměřili na načítání analogových hodnot a později i na načítání kapacitních pinů, kterými modul ESP32 rovněž disponuje.