Kapacitní piny modulu ESP32 a MicroPython
Modul ESP32 je kromě běžných vstupů a výstupů vybaven i kapacitními vstupy, které lze použít jako dotykové senzory, například místo běžných tlačítek. Piny, které jsou touto možností vybaveny jsou zpravidla v popisu modulu ESP32 označeny jako „TOUCH“. Většinou se jedná o deset pinů, které jsou označovány TOUCH0–TOUCH9. Problém je, že rozložení těchto pinů je poměrně chaotické a je třeba vždy vycházet z rozložení pinů u použitého vývojového kitu s modulem ESP32. Například u vývojového kitu DOIT ESP32 DEVKIT V1 je dotykových pinů pouze devět (TOUCH1 je vynechán) a po řadě odpovídají následujícím GPIO pinům: 5, 2, 15, 13, 12, 14, 17, 33 a 32 (viz obrázek). Z tohoto důvodu budeme v dalším textu spíše používat nastavení kapacitních vstupů odvíjející se od konkrétních čísel pinů.
Princip kapacitních senzorů?
Kapacitní senzory se často používají k detekci dotyku našich prstů na detekčních ploškách, jako jsou kupříkladu dotykové obrazovky nebo bezkontaktní senzory. Kapacitní dotykové senzory, jak již název napovídá, detekují změny kapacity při dotyku. Kondenzátor má obvykle dvě kovové desky proti sobě, oddělené nevodivým substrátem. (viz následující obrázek – vlevo). Celková kapacita je dána velikostí vodivých ploch, elektrickou jakostí a tloušťkou izolantu mezi deskami. Na kapacitním senzoru to je podobné, jedna destička je pevná vodivá deska, zatímco druhá je náš prst (viz obrázek – uprostřed a vpravo). Přiložením prstu změníme celkovou kapacitu soustavy. To se projeví na změně některé ze sledovaných elektrických veličin. Analogově-digitální převodník (ADC) modulu ESP32 převede tuto změnu na odpovídající hodnotu, na kterou pak dle potřeby řídící program zareaguje.
- POZNÁMKA:
- Kapacitní snímače jsou méně spolehlivé než mechanická tlačítka, jsou totiž náchylnější k rušení okolním signálem. Toto je třeba brát v úvahu při jejich použití a dle toho s nimi pracovat. Dobrých výsledků s dotykovými piny lze dosáhnout při použití sofistikovanějších detekčních ploch.
K dispozici jsou dostupné kapacitní snímací moduly, které se v konkrétní aplikaci vyplatí použít. Je třeba si dát ale pozor, protože některé dotykové moduly již obsahují obvod, který dokáže převést úrovně kapacity na binární výstup. Tyto moduly se pak nepřipojují jako dotykové čidlo, ale rovnou jako digitální vstup. Pro účely zpracování dotykového signálu modulem ESP32 je třeba se zaměřit na moduly, které poskytují „surový“ signál, který ESP32 dokáže převést pomocí svého vnitřního obvodu.
Jelikož je tento článek určen pro první seznámení s dotykovými piny modulu ESP32, nebudeme kvalitu detekční plochy nyní řešit a k detekci dotyku prstu nám jako ukázka postačí jednoduchý měděný drát.
Obsluha kapacitních pinů v MicroPython
Abychom mohli v MicroPython načítat hodnoty z dotykových pinů, musíme z modulu machine importovat třídu TouchPad
. Pro ovládání dotykového pinu si opět vytvoříme řídicí proměnnou, které přiřadíme vstupní pin, na kterém chceme dotykové čtení realizovat. Hodnotu pak budeme načítat podobně jako jsme načítali jakékoliv hodnoty na vstupech, tedy pomocí funkce .read()
.
V následujícím kódu v pravidelných půlsekundových intervalech načítáme dotykovou hodnotu na pinu GPIO4 (odpovídá TOUCH0
).
from machine import TouchPad, Pin
import time
touch_pin = TouchPad(Pin(4, mode=Pin.IN))
while True:
touch_value = touch_pin.read()
print(touch_value)
time.sleep_ms(500)
Vidíme, že kód, je téměř shodný s kódem ADC z minulého články, jedinou výjimkou je změna adc = ADC(Pin(32, mode=Pin.IN))
na TouchPad(Pin(4, mode=Pin.IN))
.
Jak vidíme na výstupu načtených hodnot, analogové hodnoty se poměrně mění. Občas se tam objevují různé krátké zákmity. To nám kupříkladu ukazuje průběh hodnot zachycený v následujícím grafu.
Zaprvé je třeba zvolit určitou prahovou hodnotu, při které vyhodnotíme dotyk. To vidíme na předchozím grafu, kde některé náhodné zákmity nemají takovou „hloubku“ jako signálová odezva na dotyk. Ale zároveň na témže grafu vidíme, že některé zákmity jsou buď stejně hluboké, nebo dokonce hlubší, než je relevantní signál. A to nás vede k druhému ošetření dotykového vstupu, kterým je načtení několika hodnot, aby bylo ověřeno, že pokles signálu způsobený dotykem nějakou chvíli trvá, tedy nejedná se jen o jednorázový náhodný zákmit.
- POZNÁMKA:
- Volba prahové hodnoty závisí na typu použitého dotykového materiálu nebo použitého modelu čidla, takže asi bude třeba jemně doladit nastavení prahové hodnoty podle konkrétní aplikace.
Zde je příklad s prahovou hodnotou 150 a několikanásobným (10×) načtením vstupní hodnoty:
from machine import TouchPad, Pin
import time
touch_pin = TouchPad(Pin(4, mode=Pin.IN))
threshold = 150 # prahova hodnota
while True:
touch_value = touch_pin.read()
for i in range(8):
time.sleep_ms(1)
touch_value = touch_value + touch_pin.read()
touch_value = touch_value // 10
if touch_value < threshold :
print("doslo k dotyku, hodnota je ", touch_value)
time.sleep_ms(500)
V předešlém kódu je hodnota z dotykového senzoru postupně načtena desetkrát s milisekundovým zpožděním mezi jednotlivými měřeními. Tím je zaručeno vynechání náhodných zákmitů. Výsledná hodnota je pak získána jako průměr z naměřených hodnot a pak je porovnána s prahovou hodnotou. Pokud je naměřená hodnota nižší, je situace vyhodnocena jako dotyk.
Podívejme se na výsledek:
- ZAJÍMAVOST ZÁVĚREM:
- Z principu načítání kapacitních snímačů modulu ESP32 nás napadá, že pro jejich vyhodnocení musí modul ESP32 použít zabudovaný ADC převodník. Jak jsme zmínili v minulém článku, použití ADC pinů ze skupiny ADC2 společně se zapnutým WI-FI je problematické. Takže by se při aktivní WI-FI logicky daly předpokládat problémy i při načítání kapacitních pinů ze skupiny ADC2.
- Zajímavé je, že v případě dotykových pinů ze skupiny ADC2 se žádné omezení ohledně zapnuté WI-FI nikde neuvádí. Naše pokusy s těmito dotykovými piny při zapnuté WI-FI také nic zvláštního neukázaly. Jediné upozornění, které se týká (všech) dotykových pinů při zapnuté WI-FI, se zmiňuje jen o možném nárůstu šumu vstupního signálu. To je však důsledkem většího zatížení napájecího zdroje modulu ESP32 (zvýšení odběru při WI-FI cca o 300 mA).
- Co na to říci? Snad jen… Občas nás modul ESP32 nepřestává udivovat! 😲
Dokončili jsme základní články věnované ovládání pinů modulu ESP32 v jazyce MicroPython. V tuto chvíli bychom už měli umět docela dost potřebných věcí. A to nejen ty základní jako načíst stav tlačítka nebo rozsvítit LED na digitálním výstupu. Určitě bychom měli zvládnout i načtení (či naopak dokonce vytvoření) analogové hodnoty napětí. A dnes jsme k tomu přidali reakci na dotyk na „touch“ pinech modulu.
Nabízí se tedy otázka: Kam dál?
Než si trochu rozmyslíme, kam sérii těchto článků směřovat nadále, asi si příště ukážeme, jak v MicroPython načítat vestavěná čidla modulu ESP32 – konkrétně hallovu sondu a teploměr.