Běžný stejnosměrný motor jednoduše roztočíme a on se točí. Krokový motor je ale trochu jiný – můžeme mu říct, o kolik kroků se má otočit, jakým směrem a jak rychle. Právě proto se skvěle hodí všude tam, kde potřebujeme přesný a opakovatelný mechanický pohyb.
V tomto návodu si ukážeme, jak funguje krokový motor 28BYJ-48, proč k němu potřebujeme driver ULN2003 a jak ho pomocí Arduina roztočit přesně o požadovaný úhel. Takový motor můžete využít třeba v malém plotru, otočném mechanismu, modelu CNC stroje nebo při natáčení solárního panelu za Sluncem.
Jak krokový motor funguje?
Krokový motor se na rozdíl od běžného stejnosměrného motoru neotáčí plynule, ale pohybuje se po malých přesně definovaných krocích. Uvnitř motoru najdeme několik cívek a magnetický rotor. Když jednotlivé cívky postupně zapínáme ve správném pořadí, mění se magnetické pole uvnitř motoru a rotor se vždy o malý kousek pootočí.
Změnou pořadí spínání cívek můžeme jednoduše změnit také směr otáčení. A pokud budeme jednotlivé kroky provádět rychleji nebo pomaleji, změníme rychlost otáčení motoru.
Náš 28BYJ-48 je čtyřfázový unipolární krokový motor s pěti vodiči. Uvnitř má navíc převodovku s nominálním převodem 1:64. Převodovka motor zpomalí, ale zároveň zvýší jeho krouticí moment a umožní velmi jemné natočení výstupní hřídele.
Proč potřebujeme driver ULN2003?
Cívky krokového motoru nemůžeme napájet přímo z digitálních pinů Arduina. Potřebují totiž větší proud, než jsou výstupy mikrokontroléru určené bezpečně dodávat. Proto mezi Arduino a motor zapojíme driver s obvodem ULN2003.
Arduino vytváří správnou sekvenci logických stavů na čtyřech výstupech a ULN2003 podle nich spíná proud jednotlivými cívkami motoru. Driver tedy samotné kroky nevymýšlí – o pořadí a rychlosti kroků rozhoduje náš program v Arduinu.
Obvod ULN2003 obsahuje výkonové Darlingtonovy tranzistory a také ochranné diody, které pomáhají bezpečně spínat indukční zátěž, jakou cívky motoru představují.
Zapojení krokového motoru 28BYJ-48
Co budeme potřebovat?
- řídicí desku Arduino UNO nebo jinou kompatibilní desku Arduino
- krokový motor 28BYJ-48 s driverem ULN2003
- propojovací vodiče
- USB kabel A–B
Motor má pět vodičů zakončených konektorem, který jednoduše zasuneme do příslušného konektoru na desce driveru. Díky jeho tvaru ho prakticky nelze zapojit obráceně.
Vstupy driveru potom propojíme s Arduinem následovně:
- IN1 → D8
- IN2 → D9
- IN3 → D10
- IN4 → D11
Driver potřebuje také napájení 5 V a GND. Pro krátké vyzkoušení motoru bez větší mechanické zátěže můžeme použít 5 V z Arduino UNO napájeného přes USB. Pokud ale bude motor pracovat pod větším zatížením, bude se Arduino restartovat nebo motor začne vynechávat kroky, je lepší použít samostatný stabilizovaný 5V zdroj. V takovém případě nezapomeňte propojit GND externího zdroje s GND Arduina.
Zapojení provedeme podle následujícího schématu:

Kolik kroků potřebujeme na jednu otáčku?
Než začneme programovat, potřebujeme vědět, kolik kroků odpovídá požadovanému úhlu otočení.
Datasheet motoru 28BYJ-48 uvádí krok 5,625° / 64. Při použité půlkrokové sekvenci to odpovídá přibližně 4096 půlkrokům na jednu otáčku výstupní hřídele.
V našem programu ale funkce inDirection() neudělá pouze jeden půlkrok. Obsahuje rovnou osm po sobě jdoucích stavů cívek. Jedno její zavolání tedy provede osm půlkroků.
4096 / 8 = 512
Na jednu celou otáčku 360° proto potřebujeme přibližně 512 volání funkce. Z toho můžeme vypočítat převod mezi požadovaným úhlem a počtem volání:
360° × X = 512
X = 512 / 360 = 64 / 45
Výsledný vztah použitý v programu je tedy:
počet volání = úhel × 64 / 45
Například pro požadovaných 180° dostaneme:
180 × 64 / 45 = 256 volání
U úhlů, které nevycházejí přesně na celé číslo, musíme počet kroků zaokrouhlit. Například při 200° vyjde 284,44, ale náš program pracuje s celými čísly a provede 284 cyklů. Výsledný úhel proto nebude přesně 200°, ale přibližně 199,69°. To je přirozená vlastnost krokového řízení – motor se může zastavit pouze v některé z dostupných krokových poloh.
Bastlířská poznámka: hodnota převodu 1:64 je nominální údaj. U různých verzí motoru 28BYJ-48 se může skutečný převod mírně lišit, takže při mnoha celých otáčkách se může malá odchylka postupně nasčítat. Pro většinu běžných projektů ale můžeme s hodnotou 4096 půlkroků bez problémů pracovat.
Program pro krokový motor 28BYJ-48
Teď už můžeme motor rozpohybovat. Program používá osm stavů cívek, které tvoří půlkrokovou sekvenci. Funkce inDirection() provede těchto osm kroků v jednom pořadí, zatímco againstDirection() je zavolá přesně opačně a motor se proto otočí druhým směrem.
Proměnnou angle nastavujeme požadovaný úhel otočení. Proměnná pause určuje prodlevu mezi jednotlivými půlkroky a tím také rychlost motoru. Vyšší hodnota znamená pomalejší pohyb, nižší hodnota motor zrychlí.
Pozor: pokud nastavíme prodlevu příliš malou, motor už nemusí stíhat jednotlivé kroky a může začít vynechávat, zvlášť pokud pohání nějakou mechanickou zátěž.
// čísla pinů Arduina, kam jsou připojené vstupy driveru const int in1 = 8; const int in2 = 9; const int in3 = 10; const int in4 = 11; // prodleva mezi jednotlivými půlkroky v ms int pause = 1; // požadovaný úhel otočení int angle = 360; void setup() { // nastavení pinů jako výstupů pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); } // motor se otočí o zadaný úhel jedním směrem, // počká 2 s a potom se otočí o stejný úhel zpět void loop() { // přepočet požadovaného úhlu na počet osmipůlkrokových cyklů for(int i=0; i<(angle*64/45); i++) { inDirection(); } delay(2000); for(int i=0; i<(angle*64/45); i++) { againstDirection(); } delay(2000); } // osm půlkroků pro otáčení jedním směrem void inDirection() { step1(); step2(); step3(); step4(); step5(); step6(); step7(); step8(); } // pro opačný směr zavoláme stejné kroky v obráceném pořadí void againstDirection() { step8(); step7(); step6(); step5(); step4(); step3(); step2(); step1(); } // osm stavů cívek tvoří půlkrokovou sekvenci void step1() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(pause); } void step2() { digitalWrite(in1, HIGH); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(pause); } void step3() { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(pause); } void step4() { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); delay(pause); } void step5() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); delay(pause); } void step6() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, HIGH); delay(pause); } void step7() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); delay(pause); } void step8() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); delay(pause); }
Co se v programu děje?
Všimněte si, jak se v jednotlivých funkcích step1() až step8() mění kombinace stavů HIGH a LOW. Tím postupně zapínáme jednotlivé fáze motoru:
1000 → 1100 → 0100 → 0110 → 0010 → 0011 → 0001 → 1001
Právě tato posloupnost vytváří půlkrokové řízení. Když pořadí otočíme, změní se směr otáčení motoru.
Během dvousekundové pauzy po dokončení pohybu zůstává poslední fáze motoru sepnutá. Motor proto aktivně drží svoji polohu, ale zároveň stále odebírá proud. Pokud v projektu přídržný moment nepotřebujete, můžete po dokončení pohybu všechny čtyři výstupy nastavit na LOW a motor tím uvolnit.
Co můžeme s krokovým motorem postavit?
Krokové motory se hodí všude tam, kde potřebujeme opakovatelný a poměrně přesný mechanický pohyb. S naším malým 28BYJ-48 můžete vyzkoušet třeba otočnou platformu, ukazatel s ručičkou, posuvný mechanismus, jednoduchý plotr nebo automatické natáčení malého solárního panelu.
Pokud později budete potřebovat větší rychlost, sílu nebo ještě přesnější řízení, můžete přejít na výkonnější krokové motory a drivery. Princip řízení ale zůstává velmi podobný tomu, který jsme si právě vyzkoušeli.
A je hotovo!
Teď už víte, jak krokový motor funguje, proč potřebuje driver a jak pomocí Arduina řídit jeho směr, rychlost i úhel natočení. Zároveň jsme si ukázali, co se skutečně děje uvnitř programu při postupném spínání jednotlivých fází motoru.
Teď už zbývá vymyslet, co bude váš krokový motor pohánět. Další inspiraci najdete v našich návodech HWKITCHEN.
