Jak na krokový motor s Arduinem

Jak na krokový motor s Arduinem

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?

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 by se ale při větším zatížení Arduino restartovalo nebo motor začal 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:

Zapojení krokového motoru 28BYJ-48 s driverem ULN2003 a Arduino UNO

Schéma zapojení vytvořeno v programu Fritzing (fritzing.org).

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 volání funkce. 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 běžných motorů 28BYJ-48 se můžeme setkat se skutečným převodem přibližně 63,68:1. Při jedné částečné otáčce rozdíl prakticky nepoznáme, ale 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ěž. Pokud motor pouze vrní, nerozběhne se nebo vynechává kroky, zkuste hodnotu pause zvýšit například na 2 nebo 3 ms.

// čí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ý motor 28BYJ-48 se hodí všude tam, kde potřebujeme pomalý, přesný a opakovatelný mechanický pohyb. Díky vestavěné převodovce dokáže výstupní hřídel natočit o velmi malý úhel a zároveň nabídne na svoji velikost poměrně slušný krouticí moment.

Můžeme s ním například natáčet lamely žaluzií nebo ovládat menší roletu, postavit otočný stolek pro 360° fotografování, automatický dávkovač krmiva či drobných součástek, mechanický ukazatel s ručičkou nebo pomalu natáčet senzor, kameru či malý solární panel. Se závitovou tyčí z něj můžeme vytvořit také jednoduchý lineární posuv pro malý plotr nebo jiný pohyblivý mechanismus.

U těžších mechanismů, například při zvedání celé žaluzie, už může být výkon tohoto malého motoru omezený. Pro natáčení lamel, ukazatele, otočné platformy a lehké převodové mechanismy je ale 28BYJ-48 jednoduchý a cenově dostupný způsob, jak do projektu přidat přesně řízený pohyb.

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.

Soubory ke stažení