Řízení DC motorů modulem ESP32
- UPOZORNĚNÍ
- Následující článek byl již upraven pro jádro Arduino ESP32 verze 3.x.
V tomto článku se naučíme, jak ovládat stejnosměrné (DC) motory pomocí modulu ESP32. Nejdříve se podíváme na některé základní techniky pro ovládání stejnosměrných motorů, pak si ukážeme, jak ovládat stejnosměrné motory pomocí ovladače motoru L298N připojeného k modulu ESP32.
Rychlost stejnosměrného motoru můžeme ovládat jednoduchým ovládáním vstupního napětí do motoru. Regulace vstupního napětí však vyžaduje nějaký regulační prvek, který se většinou dost zahřívá. Mnohem efektivnější metoda, jak dosáhnout regulace otáček motoru je pomocí tzv. PWM signálu.
Řízení stejnosměrného motoru PWM
PWM neboli pulzně šířková modulace je technika, se kterou jsme se již setkali – například při regulaci jasu LED (viz článek ESP32 – Jak používat GPIO piny?) nebo při ovládání servomotoru (viz článek Ovládáme servo modulem ESP32). PWM modulace nám umožňuje nastavit průměrnou hodnotu napětí, které jde do elektronického zařízení a to díky rychlému a zapínání/vypínání napájení. Výsledné průměrné napětí pak závisí na době, po kterou je signál zapnutý a po kterou je vypnutý během jedné časové periody. Výhodou PWM regulace DC motoru je to, že motor je vždy buď zapnut nebo vypnut, takže regulační prvek se tolik nezahřívá, jako kdyby napětí reguloval postupným omezování elektrických veličin. Princip napěťové regulace vycházející z pulzní modulace znázorňuje obrázek č. 1.
Jak víme, modul ESP32 umožňuje nastavit své GPIO piny do režimu PWM, dokonce umožňuje nastavit pracovní frekvenci PWM signálu. Takže v závislosti na velikosti motoru bychom mohli jednoduše připojit výstup modulu ESP32 k bázi tranzistoru nebo hradla MOSFET a ovládat pomocí PWM signálu rychlost motoru. Než se však pouštět do stavby nějakého domácího řadiče DC motoru, raději se podíváme, zda již někde není něco hotového.
Ovladač L298N
Modul L298N je dvojitý motorový ovladač (H-Bridge), který umožňuje současné řízení rychlosti a směru dvou stejnosměrných motorů. Modul může řídit stejnosměrné motory, které mají napětí mezi 5 až 35 V, se špičkovým proudem až 2 A. Modul L298N je poměrně malý a kompaktní, jak vidíme na obrázku č. 2.
Pojďme se blíže podívat na pinout modulu L298N a vysvětlit, jak funguje. Jak vidíme na obrázku č. 2, modul má po stranách dvě svorkovnice pro motory A a B a další svorkovnici, na které je zemnicí kolík, napájecí napětí pro motor VCC a kolík pro 5 V, který může být buď vstupem, nebo výstupem. To závisí na napětí použitém pro motory (pin VCC). Modul má totiž vestavěný 5 V regulátor, který je možné aktivovat nebo deaktivovat pomocí propojky. Pokud je napájecí napětí motorů do 12 V, můžeme povolit 5 V regulátor a pin 5V
lze použít jako výstup, například pro napájení ovládací desky řídicího mikrokontroléru (ESP32, Arduino apod.) Pokud je však napětí motoru větší než 12 V, musíme propojku rozpojit, protože vyšší napětí již poškodí integrovaný 5 V regulátor. V tomto případě budeme muset pin 5V
použit jako vstup, protože, aby modul L298N správně fungoval, potřebujeme jej připojit k 5 V napájecímu zdroji. Umístění 5 V regulátoru, zkratovací propojku (JUMPER) a popis jednotlivých kolíků napájecí svorkovnice můžeme vidět na obrázku č. 3.
Musíme poznamenat, že řídicí integrovaný obvod modulu způsobuje pokles napětí asi 2 V. Pokud tedy například použijeme 12 V zdroj, napětí na svorkách motoru bude asi 10 V, což znamená, že z našeho 12 V stejnosměrného motoru nebudeme schopni dostat maximální výkon.
Další řídicí piny modulu najdeme vedle třípinové napájecí svorkovnice, jsou to vstupy logického řízení. Piny Enable A
a Enable B
se používají pro aktivaci motorů a řízení jejich otáček. Pokud je na tomto kolíku přítomna propojka, motor se povolí a bude pracovat na maximální otáčky, a pokud propojku odstraníme, můžeme k tomuto pinu připojit vstup PWM a tím řídit otáčky motoru. Pokud tento pin připojíme k uzemnění, motor bude deaktivován. Princip modulu LM298N můžeme pochopit z blokového elektronického schématu na obrázku č. 4.
Další piny, které najdeme na konektoru řídicích signálů, jsou piny Input 1
(IN1
) a Input 2
(IN2
), které slouží pro ovládání směru otáčení motoru A a piny Input 3
(IN3
) a Input 4
(IN4
) pro motor B. Pomocí těchto pinů vlastně ovládáme spínače H-Bridge uvnitř IC L298N. Pokud je Input 1
na úrovni LOW a vstup Input 2 je HIGH, motor se bude otáčet vpřed a naopak, pokud je Input 1 na úrovni HIGH a Input 2
na úrovni LOW, motor se otáčí vzad. V případě, že jsou oba vstupy stejné, LOW nebo HIGH, motor se zastaví. Totéž platí pro vstupy 3 a 4 a motor B.
Elektrická kompatibilita obvodu L298N s modulem ESP32
A už je tu zase… Stará známá písnička o pěti a třech voltech! A opravdu je tomu tak! Je pravda, že pětivoltová logika má delší tradici a nelze se tedy divit, že řada obvodů (starých dobrých a osvědčených obvodů) je prostě konstruována na pěti voltech. To však ještě neznamená, že bychom je nemohli použít i v případě třívoltové logiky. Je třeba se jen podívat na elektronickou charakteristiku daného zapojení, nejlépe zkontrolovat elektronické schéma (viz obrázek č. 5).
Ze schématu na obrázku 5 vidíme, že řídicí vstupy, které určují směr a výběr motorů, jsou připojeny přímo na obvod L298N. O napěťové kompatibilitě tedy bude rozhodovat přímo integrovaný obvod L298N. Když se v datovém listu podíváme na charakteristiku obvodu L298N, je v technické specifikaci jasně dáno, že minimální povolené napětí je 4,5 V. A to je pro řídicí modul ESP32 stále moc. Na druhou stranu nyní nejde o napětí napájecí, ale o napětí řídicích signálů. Jelikož se jedná o vstupy, které reagují na napěťovou úroveň, na které nejsou trvale drženy např. pomocí pull-up rezistorů, je rozhodující především napěťová úroveň logické nuly (úroveň LOW) a úrovně logické jedna (úroveň HIGH). Standardní pětivoltová TTL logika rozlišuje na vstupu úroveň HIGH od 2 V (stejně jako 3,3 V logika). Dokonce dle datového listu obvod L298N je tento obvod řešen tak, že na vstupech vnímá úroveň HIGH již od 1,5 V. Takže jej lze řídit i třívoltovou logikou – tedy modulem ESP32.
Kdo tomu nevěří, ať klidně použije převodník napěťové úrovně 3,3 V–5 V (ten rozhodně neuškodí) nebo aspoň před připojením modulu ESP32 proměří napětí na řídicích vstupech řadiče motorů L298N.
Závěr tedy je – i když jsme u některých obvodů před přímým propojením s modulem ESP32 varovali, zde je přímé propojení ESP32 a L298N možné!
Ovládání DC motoru modulem ESP32 s pomocí L298N
Nyní bychom se již rádi pustili do nějakého praktického příkladu – například zkusíme řídit otáčky jednoho DC motoru pomocí potenciometru a měnit směr otáčení pomocí tlačítka. Schéma zapojení máme na následujícím obrázku č. 6.
Propojení jednotlivých pinů modulu ESP32 a dalších součástek zachycuje následující tabulka č 1.
ESP32 | L298N | ESP32 | Potenciometr | ESP32 | Tlačítko |
---|---|---|---|---|---|
GPIO 13 | ENA | 3,3 V | pin 1 | GPIO 23 | pin 1 |
GPIO 16 | IN1 | GND | Pin 2 | GND | Pin 2 |
GPIO 17 | IN2 | GPIO 33 | jezdec | ||
Vin | +5 V | ||||
GND | GND |
Pro napájení motoru použijeme externí zdroj (na obrázku č. 6 je symbolicky znázorněn baterií), který stabilizátorem na modulu L298N vyrobí 5 V napětí pro obvod ESP32. V tom případě pochopitelně nezapomeňme na propojení zkratovací propojky (jumper) na desce, aby bylo externí napětí přivedeno na stabilizátor. Pochopitelně pokud bychom u modulu ESP32 předpokládali vyšší spotřebu (kupříkladu díky zapnuté Wi-Fi apod.) nebo napětí pro napájení motorů překročilo 12 V, je třeba napájet modul ESP32 vlastním zdrojem (buď 5 V, nebo 3,3 V), nejlépe však prostřednictvím jeho USB portu. Je třeba jen ještě připomenou, že všechny tyto napájecí zdroje musí mít propojené země GND.
Kód
/* DC Motor Control – L298N | PWM | tlacitko | potenciometr */
#define enA 13
#define in1 16
#define in2 17
#define button 23
#define pot 33
int SkutecnySmerOtaceni = 0;
bool OtaceniDleTlacitka = false;
// funkce SETUP se spusti jednou pri stisknuti tlacitka reset nebo pri zapnuti desky.
void setup() {
ledcAttach(enA, 1000, 12); // pin enA, frekvence 1kHz, rozl. 12 bitu
ledcWrite(enA, 0); // vychozi hodnota PWm je 0
pinMode(in1, OUTPUT); // pin in1 pro motor 1
pinMode(in2, OUTPUT); // pin in2 pro motor 1
pinMode(button, INPUT_PULLUP); // pin pro tlacitko
// nastevni výchozího smeru motoru
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
// funkce LOOP bezi stale dokola.
void loop() {
int pwmOutput = analogRead(pot); // nacti potenciometr
ledcWrite(enA, pwmOutput); // posli hodnotu pot jako PWM na L298N Enable pin
if (digitalRead(button) == LOW) { // stisknuti tlacitka
OtaceniDleTlacitka = ! OtaceniDleTlacitka; // zmen pozadovany smer
}
while (digitalRead(button) == HIGH); // cekacka na uvolneni tlacitka
delay(20);
// jestli je pozadovany směr jiny nez skutecny, zmen směr (TAM)
if (OtaceniDleTlacitka == true & SkutecnySmerOtaceni == 0) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
SkutecnySmerOtaceni = 1;
delay(20);
}
// jestli je pozadovany směr jiny nez skutecny, zmen směr (ZPET)
if (OtaceniDleTlacitka == false & SkutecnySmerOtaceni == 1) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
SkutecnySmerOtaceni = 0;
delay(20);
}
}
Popis kódu:
Nejprve musíme definovat piny a některé proměnné potřebné pro program. V sekci setup()
musíme nastavit režimy pinů a počáteční směr otáčení motoru. V sekci hlavní smyčky loop()
načítáme hodnoty z potenciometru. Jelikož je standardní rozlišení analogového vstupu 10bitové (hodnoty 0–4095) nastavili jsme v sekci setup()
rozlišení výstupní hodnoty PWM také na 10bitů. Kdybychom, kupříkladu pro PWM výstup zvolili 8bitové rozlišení, bylo by nutné vstupní hodnoty (0–4095) přemapovat na výstupní rozsah (0–255).
- Poznámka:
- Přemapování z 10bitového vstupu na 8bitový PWM výstup často můžeme vidět v kódech pro moduly Arduino, kde analogový vstup má standardní rozlišení 10bitové a PWM je jen 8bitový. A pokud jsou naše informace správné, tak rozlišení PWM výstupu u modulu Arduino nelze změnit.
- Druhou možností, jak rozlišení analogového vstupu a PWM výstupu přizpůsobit, spočívá ve snížení rozlišení analogového vstupu na 8bitů (pomocí příkazu
analog
). To je možné jak u modulu ESP32, tak asi i u modul Arduino (?). V případě modulu ESP32 bychom tím snížili rozlišení nastavení PWM signálu a v případě modulu Arduino se to (bůhví proč) raději stejně řeší zmíněným přemapováním.Read Resolution (8)
Získanou výstupní hodnotu pro signál PWM, neboli hodnotu odpovídající 0 až 100% pracovní cyklu PWM signálu, odešleme na pin GPIO 13, který je spojen se signálem Enable A
desky L298N, který spíná motor a tím regulujeme rychlost otáčení.
Další část programu je kontrola stisku tlačítka. Tlačítko funguje jako přepínací tlačítko a pokaždé, když jej stiskneme, změní se směr otáčení motoru. Pokud je stisknuto na pinu GPIO 23 je úroveň LOW. Při tomto stavu změníme hodnotu proměnné směr Otaceni
, která určuje požadovaný směr otáčení motoru. Po uvolnění tlačítka pokračuje program dvojicí podmínek, které testují, zda tento směr odpovídá skutečnému směru otáčení (uloženo v proměnné Skutecny
). Pokud se skutečný směr otáčení liší od směru požadovaného, dojde ke změně směru otáčení změnou stavů pinů GPIO 16
(Input 1
) a GPIO 17
(Input 2
).
Závěr:
Jednou ze zajímavých aplikací, na které lze obvod ESP32 použít, může být stavba jenoduchého robotického vozítka. Například vozítka sledujícího čáru nebo v součinnosti s Wi-Fi nebo Bluetooth se nám otevírá možnost stavby vzdáleně řiditelného vozítka. K tomuto úkolu je třeba zvládnout řízení DC motorů, které našemu projektu dodají požadovaný pohyb. V dnešním článku jsme si představili modul L298N jako vcelku zajímavý ovladač DC motorů, který lze pro takové účely použít. Pochopitelně modul L298N není jediným ovladačem. Ale v případě použití jiného modulu doporučujeme se opět zaměřit na jeho elektrickou „snášenlivost“ s modulem ESP32 – nejlépe si prostudovat elektrické schéma, popřípadě změřit napětí na signálových pinech. I když stavba elektroniky je dnes spíše o propojování jednotlivých již hotových funkčních celků ze široké palety různých výrobků (a výrobců), nemusí být vždy vše vzájemně kompatibilní, jak bychom si občas přáli.
- Zdroj:
- 1) https://
howtomechatronics. com/ tutorials/ arduino/ arduino-dc- motor-control- tutorial-l298n- pwm-h-bridge/