ESP32 a řízení krokového motoru
V dnešním článku se dozvíte, jak pomocí ESP32 ovládat krokový motor. Již jsme si ukázali, jak ovládat servo (Ovládáme servo modulem ESP32) nebo jak řídit DC motor (Řízení DC motorů modulem ESP32), popis ovládání krokového motoru je tedy jasným pokračováním.
Pro naši ukázku použijeme unipolární krokový motor 28BYJ-48 s motorovým driverem ULN2003. Oba tyto prvky jsou běžnou součástí různých výukových sad pro modul Arduino, tak proč to nepoužít i pro modul ESP32. Pochopitelně lze použít silnější krokový motor např. z vyřazené disketové jednotky. Princip ovládání však bude obdobný. Vývojovou desku s modulem ESP32 bude opět programovat prostředím Arduino IDE.
Krokový motor
Krokový motor je bezkomutátorový stejnosměrný elektromotor, který rozděluje plnou rotaci do několika kroků. Pohybuje se vždy o jeden krok a každý krok má stejnou velikost. To nám umožňuje otočit motor o přesný úhel do přesné polohy. Krokový motor se může otáčet ve směru nebo proti směru hodinových ručiček. V tomto článku nebudeme podrobně popisovat, jak jsou krokové motory vyrobeny a jak interně fungují. Přesto si řekneme, že existuje mnoho krokových motorů s různými specifikacemi, v principu ale existují dva typy krokových motorů: unipolární (proud může téci cívkou pouze jedním směrem) a bipolární (proud může téci cívkou oběma směry).
Tento návod se zaměří na široce používaný unipolární krokový motor 28BYJ-48 s jeho driverem ULN2003 – viz obrázek č. 1.
Vlastnosti krokového motoru 28BYJ-48
Základní vlastnosti krokového motoru 28BYJ-48, kterým se budeme nadá zabývat:
- Jmenovité napájecí napětí: 5 V DC
- Počet cívek (fází): 4
- Úhel jednoho kroku (rotoru): 5,625°
- Maximální pracovní frekvence: 100 Hz
Jak bylo uvedeno, krokový motor 28BYJ-48 má celkem čtyři cívky. Jeden konec cívky je vždy připojen na 5 V. Druhý konec cívek odpovídá zbylým vodičům, které jsou postupně připojované k zemi. Postupné napájení cívek v určité logické sekvenci způsobí, že se motor pohybuje vždy po jednom kroku jedním nebo druhým směrem.
a https://
Krokový motor 28BYJ-48 má nejmenší možný úhel kroku 5,625°. Nejmenšího kroku lze dosáhnout v tzv. režimu polovičního kroku, což namená, že nejsou zapínány cívky v režimu první, druhá, třetí apod., ale jsou zapínány v režimu první, první společně s druhou (půl krok) a pak teprve druhá cívka. V režimu polovičního kroku potřebuje rotor krokového motoru 64 kroků (=360°/5,625°) na jednu otáčku. V tzv. režimu plného kroku (zapínání cívek: první, druhá, třetí…) je krok dvojnásobný, tedy počet kroků na jednu otáčku je 32. Rozdíl mezi řízením krokového motoru v režimu celého a polovičního kroku znázorňuje obrácek č. 3.
Režim celého kroku (též tzv. čtyřtaktní režim)
↑ | → | ↓ | ← | |
cívka A | 1 | 0 | 0 | 0 |
---|---|---|---|---|
cívka B | 0 | 1 | 0 | 0 |
cívka C | 0 | 0 | 1 | 0 |
cívka D | 0 | 0 | 0 | 1 |
Režim polovičního kroku (též tzv. osmitaktní režim)
↑ | ↗ | → | ↘ | ↓ | ↙ | ← | ↖ | |
cívka A | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
cívka B | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
cívka C | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
cívka D | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
Obrázek č. 3 – řídicí sekvence cívek při režimu celého a polovičního kroku
Výstupní hřídel krokového je však ještě osazena převodovkou s převodovým poměrem 64:1. To znamená, že hřídel vystupující vně motoru dokončí jednu otáčku, až pokud se rotor uvnitř otočí 64krát. Rotor se tedy bude muset otočit o 32×64 = 2048 kroků, aby hřídel dokončila jednu plnou otáčku. Tím získáme výslednou přesnost 2048 kroků na jednu otáčku, dosáhneme tedy výsledného úhlu 0,18° na jeden krok.
Takže shrnuto:
- Celkový počet kroků na otáčku = 2048 kroků
- Úhel jednoho kroku (hřídele) = 0,18°/krok
Pokud používáme jiný krokový motor, musíme si prostudovat technický list daného motoru, neboť se tyto údaje budou lišit.
Ovladač motoru ULN2003
K propojení krokového motoru s ESP32 použijeme ovladač motoru ULN2003, který je vyfotografován níže na obrázku č. 4. Krokový motor 28BYJ-48 se často rovnou prodává spolu s tímto ovladačem ULN2003.
Obrázek č. 4 – Ovladač krokového motoru ULN2003
Modul je dodáván s konektorem, který usnadňuje připojení motoru k modulu. Modul ULN2003 má čtyři vstupní kolíky pro řízení cívek, které uvádějí do pohybu krokový motor. Čtyři LED diody poskytují vizuální kontrolu stavu zapnutí cívek. Na desce ovladače ULN2003 vidíme kolíky pro připojení napájecího napětí VCC
a GND
, vedle těchto pinů je zkratovací propojka (jumper), který funguje jako vypínač pro napájení krokového motoru – pokud propojku odstraníte, motor bude odpojen od napájení. Následující tabulka zobrazuje popis pinů ovladače modulu:
IN1 | Ovládání cívky 1: připojit k řídicímu digitálnímu pinu mikrokontroléru |
IN2 | Ovládání cívky 2: připojit k řídicímu digitálnímu pinu mikrokontroléru |
IN3 | Ovládání cívky 3: připojit k řídicímu digitálnímu pinu mikrokontroléru |
IN4 | Ovládání cívky 4: připojit k řídicímu digitálnímu pinu mikrokontroléru |
VCC | Napájecí napětí motoru |
GND | Společné GND |
Konektor motoru | Konektor pro připojení motoru |
Tabulka č. 1 – popis konektorů ovladače desky ULN2003 (ovladače krokového motoru)
I když modul ULN2003 může být připojen na napětí 5–12 V, jak vidíme na jeho potisku na obrázku č. 4, nemusíme se zde obávat o modul ESP32. Použitý integrovaný obvod je jen tranzistorové pole, které na základě přivedeného signálu spíná jednotlivé cívky krokového motoru – tedy 3,3 V logika modulu ESP32 se nedostane do kontaktu s napájecím napětím krokového motoru. Schéma elektronického zapojení (včetně vnitřního uspořádání jednoho „proudového zesilovače“ pro cívku motoru) zobrazuje obrázek č. 5.
- Poznámka:
- POZOR, existují i jiné typy řadičů krokových motorů, které mohou mít vstupní signály IN1–4 drženy pomocí pull-up rezistorů na napěťové úrovni +5 V. To by náš modul ESP32 ohrozilo! Je tedy vždy nutné u jiných typů ovladače krokových motorů zkontrolovat elektronické schéma a princip jejich činnosti.
Připojení krokového motoru k ESP32
Nyní už konečně připojíme krokový motor k modulu ESP32, pochopitelně prostřednictvím ovladače motoru ULN2003. K pinům GPIO 19, 18, 5 a 17 připojíme vstupy IN1, IN2, IN3 a IN4. Můžete použít jakékoli jiné vhodné digitální piny (podívejte se na článek ESP32 – Jak používat GPIO piny?). Modul ESP32 společně s krokovým motorem 28BYJ-48 budeme napájet externím napájecím zdrojem 5 V – schéma tohoto propojení vidíme na obrázku č. 6. Pokud bychom krokový motor příliš nezatěžovali (tedy kupříkladu JEN pro ilustraci otáčení krokového motoru), mohli bychom modul ESP32 napájet z USB konektoru a napájecí napětí (5 V) pro napájení krokového motoru odebírat z pinu Vin (ale není to nejlepší nápad pro praktické trvalé řešení). Spotřeba krokového motoru 28BYJ-48 je přibližně 280 mA.
Následující tabulka uvádí propojení řadiče ULN2003 s modulem ESP32.
Řadič motoru ULN2003 |
modul ESP32 |
IN1 | GPIO 19 |
IN2 | GPIO 18 |
IN3 | GPIO 5 |
IN4 | GPIO 17 |
Tabulka č. 2 – propojení řadiče ULN2003 a modulem ESP32
Ovládací program krokového motoru
Jako ukázku ovládání krokového motoru si vytvočíme v prostředí Arduino IDE jednoduchý program, který nejdříve otočí krokovým motorem o jednu otáčku ve směru hodinových ručiček, počká jednu vteřinu, pak se otočí o jednu otáčku zpět a po jedné vteřině čekání se vše bude opakovat.
Existují různé způsoby, jak ovládat krokové motory pomocí mikrokontroléru. První způsob je přímé zapínání jednotlivých cívek. Tedy postupné adresování GPIO pinů. Nevýhodou tohoto řešení je, že neustále musíme řešit sekvenci zapojených cívek, stejně tak řešit časování kroků, aby bylo otáčení krokového motoru rovnoměrné.
Asi lepší bude použít způsob druhý, který je postavený na knihovně Stepper.h
. Tato knihovna poskytuje snadný způsob ovládání pohybu motoru o definovaný počet kroků a definovanou rychlostí.
Krokový motoru se díky knihovně Stepper.h
ovládá prostřednictvím objektu Stepper
a jeho příkazů. Například příkaz setStepper
nastavuje rychlost otáčení, příkaz step
vykoná zadaný počet kroků – v případě kladného počtu kroků se motor otáčí ve směru hodinových ručiček, při zadání záporného počtu je směr otáčení opačný.
Následující program nám ukazuje, jak vyřešit naše zadání.
Kód
/* KROKOVY MOTOR */
#include <Stepper.h>
const int stepsPerRevolution = 2048; // pocet otacek motoru na jednu otacku
// ULN2003 - zapojeni pinu
#define IN1 19
#define IN2 18
#define IN3 5
#define IN4 17
// vytvoreni objektu Stepper (pocet kroku na otacku, piny civek)
Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);
// funkce SETUP se spusti jednou pri stisknuti tlacitka reset nebo pri zapnuti desky.
void setup() {
Serial.begin(115200); // nastaveni rychlosti sériového portu
myStepper.setSpeed(5); // nastaveni rychlosti motoru (5 ot/min)
}
// funkce LOOP bezi stale dokola.
void loop() {
// jedna otacka ve smeru hodinovych rucicek
Serial.println("Otacim ve smeru hodinovych rucicek...");
myStepper.step(stepsPerRevolution);
delay(1000);
// jedna otacka proti smeru hodinovych rucicek
Serial.println("Otacim proti smeru hodinovych rucicek...");
myStepper.step(-stepsPerRevolution);
delay(1000);
}
Po přeložení a nahrání programu do modulu ESP32 se motor opakovaně otáčí o jednu otáčku ve směru hodinových ručiček a pak zpět proti směru hodinových ručiček – viz obrázek č. 7.
Závěr:
Ukázali jsme si jednoduchý příklad, jak lze modulem ESP32 řídit krokový motor. Výše uvedená knihovna Stepper.h
není jediná, kterou lze pro ovládání krokového motoru využít. Hlubší zájemce o problematiku krokového motoru si dovolíme odkázat na následující anglický článek ESP32 with Stepper Motor (28BYJ-48 and ULN2003 Motor Driver), ze kterého jsme čerpali i pro tento text. Na samém závěru zmíněného článku lze najít odkaz na knihovnu AccelStepper
, která umožní vývojáři získat větší kontrolu nad krokovým motorem. Použití této knihovny je tam i doloženo odkazem na stránku s několika příklady.