Obousměrné řízení miniaturního unipolárního krokového motoru 28BYJ-48 stejnosměrným napětím nebo potenciometrem.
V minulých dílech jsme trochu macešsky zapomněli na v současnosti velmi populární miniaturní krokový motorek 28BYJ-48.
Motorek s rotorem z permanentního magnetu má jednu otáčku o 360 st. rozdělenu na 32 kroků. K motoru je pevně připojena převodovka s převodovým poměrem 64:1, k otočení výstupního hřídele o 360 st. tedy potřebujeme ((32×64) 2048 kroků. Díky převodovce běží motorek celkem hladce a na své rozměry má také slušný točivý moment.
Schéma zapojení:
Krokový motor je připojen k řídící desce ULN2003 a musí být napájen externím zdrojem napětí v rozsahu 5 až 9 V. Při pokusu o napájení přímo z Arduina hrozí nebezpečí jeho poškození! Obvod ULN2003 byl na Robodoupěti už podrobněji popsán, tak jen na připomenutí si ukážeme rozložení pinů a zapojení jednoho kanálu ve vnitřní struktuře.
Propojení s Arduinem:
IN1 – D11, IN2 – D10, IN3 – D9, IN4 – D8
Potenciometr je připojen na pin A0 Arduina podle obrázku, tedy:
Začátek dráhy – +5V, běžec – A0, konec dráhy – GND
Pozn: Při zkouškách motoru byl pro snadné a přehledné propojení s Arduinem použit Connector shield a proto je použit i na obrázku.
Program
K programu toho není příliš co říci, protože se podobá tomu z druhé části Krokohrátek s Arduinem. Na rozdíl od těch minulých je pro řízení motorku použita knihovna stepper, která je součástí instalace vývojového prostředí Arduina.
Její funkce jsou značně omezené:
Konstruktor
vytvoří instanci třídy, (v příkladu pojmenovanou stepper), předá tím programu počet kroků motoru na jednu otáčku a čísla pinů, které budou použity pro řízení motoru.
Stepper stepper(STEPS, IN4, IN2, IN3, IN1)
Knihovna obsahuje jen dvě funkce:
setSpeed(rpm)
Funkce nastavuje rychlost v otáčkách za minutu (ot/min nebo RPM), jakou se motor bude otáčet při volání funkce step().
step(steps)
Funkce otáčí motorem o parametrem určený počet kroků, rychlostí, určenou parametrem funkce setSpeed().
A zde je kód:
// připoj knihovnu Stepper motor Arduina #include <Stepper.h> // počet kroků motoru na otáčku #define STEPS 32 // definice řídících pinů pro motor #define IN1 11 #define IN2 10 #define IN3 9 #define IN4 8 // inicializace knihovny stepper Stepper stepper(STEPS, IN4, IN2, IN3, IN1); // potenciometr (1 - 10k) je připojen na pin A0 #define pot A0 void setup() { } void loop() { // přečteme analogovou hodnotu z potenciometru int val = analogRead(pot); // pokud je potenciometr ve střední poloze, motor se neotáčí if( (val > 500) && (val < 523) ) { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } else { // chceme otáčet motorem jedním směrem while (val >= 523) { // mapujeme proměnnou speed_ na rozsah 5 až 500 otáček / min. int speed_ = map(val, 523, 1023, 5, 500); // nastavíme motoru rychlost stepper.setSpeed(speed_); // pootoč motorem o jeden krok zvoleným směrem stepper.step(1); val = analogRead(pot); } // chceme otáčet motorem opačným směrem while (val <= 500) { // mapujeme proměnnou speed_ na rozsah 5 až 500 otáček / min. int speed_ = map(val, 500, 0, 5, 500); // nastavíme motoru rychlost stepper.setSpeed(speed_); // pootoč motorem o jeden krok zvoleným směrem stepper.step(-1); val = analogRead(pot); } } }