Wiele urządzeń talkich jak drukarki atramentowe, drukarki 3D, frezarki, maszyny CNC i inne, w swojej budowie wykorzystuje silniki krokowe. Z ich budową można zapoznać się tu. W kursie przedstawiam możliwość sterowania typowymi 4 i 6-wejściowymi silnikami krokowymi DC za pomocą popularnego sterownika EasyDriver v44.
EasyDriver v44 (Fig. 1) to sterownik bipolarnych silników krokowych (schemat). Można go wykorzystać wraz z silnikami 4, 6 lub 8 przewodowymi. Umożliwia obsługę silników z obciążeniem 150-750 mA/cewkę. Domyślnie układ jest zasilany napięciem 5V, ale po zlutowaniu odpowiedniej zworki możliwa jest zmiana napięcia zasialnia na 3,3V. Sterownik umożliwia pracę w 4 trybach: pełny krok, 1/2, 1/4, 1/8. UWAGA! nie należy włączać, bądź wyłączać silników w trakcie zasilania układu. Grozi to jego zniszczeniem.
Sygnały niezbędne do uruchomienia silnika:
Piny | Podłączenia cewek | Standardowe kolory kabli silników |
---|---|---|
A1 | A "+" | zielony |
A2 | A "-" | czerwony |
B1 | B "+" | niebieski |
B2 | B "-" | żółty |
Sygnały opcjonalne (używane do zmiany ustawień domyślnych sterownika EasyDriver):
MS1 | MS2 | obroty |
---|---|---|
0 | 0 | pełen krok |
1 | 0 | 1/2 kroku |
0 | 1 | 1/4 kroku |
1 | 1 | 1/8 kroku |
Potencjometr umożliwienie wybór max prądu dostarczonego do silnika w zakresie 150-750mA. Ustawienie wymaga znajomości parametrów silnika. Należy sprawdzić w jego nocie katalogowej jaki prąd obsługuje silnik. Jeżeli nie możemy zdobyć takiej informacji, poprawne ustawienie potencjometru należy ustawić ręcznie. Należy ustawić potencjometr w położeniu minimalnym. Następnie należy ostrożnie zmieniać położenie potencjometru. Poszukujemy położenia, w którym silnik będzie się płynnie kręcił ze stałą prędkością, bez szarpnięć i zatrzymań. Staramy się aby prąd był jak najmniejszy. Pozwoli to na ograniczenie ilości ciepła wydzielanego na układzie scalonym sterownika.
Aby prawidłowo podłączyć silnik do sterownika musimy rozpoznać pary przewodów wejściowych silnika. Najwygodniejszym sposobem jest zapoznanie się z odpowiednią notą katalogową. Jeżeli nie znamy typu silnika i nie możemy skorzystać z jego dokumentacji, istnieje prosty sposób na określenie par jego przewodów.
Weź dowolny przewód silnika i sprawdzić jego oporność względem trzech pozostałych wejść. Kabel, z którym pierwszy przewód wykazuje najniższą rezystancję stanowi parę (jest drugim końcem cewki). Pozostałe dwa przewody powinny wykazywać pomiędzy sobą podobną rezystancję jak para pierwsza.
W silnikach 6-przewodowych, należy określić, które z trzech przewodów stanowią jedną cewkę. Wybierz jeden dowolny przewód i przetestuj jego rezystancję względem wszystkich pozostałych przewodów. Dwa przewody powinny wykazywać w stosunku do niego jakiś opór, a trzy pozostałe nie pokażą żadnego związku. W ten sposób określimy które z przewodów tworzą dwie cewki silnika. W drugim kroku musimy określić, które z trzech przewodów każdej cewki stanowią jej końce. Dla każdej cewki osobno sprawdzamy oporność pomiędzy poszczególnymi przewodami. Kable, pomiędzy którymi opór jest największy stanowią dwa końce cewki. Badanie należy powtórzyć dla drugiej cewki.
Schemat podłączenia typowych silników 4-przewodowych przedstawia Tab. 1.
W pierwszym przykładzie spowodujemy ruch silnika krokowego najpierw w jedną stronę, a później w drugą. Do sterowania układem EasyDriver potrzebne nam będą dwa sygnały: DIR - wyznaczający kierunek ruchu oraz STEP - sterujący krokami silnika. Silnik od starego napędu DVD zasilano napięciem 6V. Przed przystąpieniem do testów, za pomocą potencjometra w sterowniku EasyDriver wykonano regulację prądu silnika. W tym przypadku obrócono potencjometr na pozycję minimum. Spowodowało to wyraźny spadek temperatury wydzielanej na układzie sterownika.
int stepPIN = 2; int dirPIN = 3; void setup(){ pinMode(stepPIN, OUTPUT); pinMode(dirPIN, OUTPUT); } void loop(){ digitalWrite(dirPIN, LOW); // kierunek 1 delay(100); for(int i=0; i<1000; i++){ digitalWrite(stepPIN, LOW); // krok do przodu digitalWrite(stepPIN, HIGH); // stop delayMicroseconds(500); } digitalWrite(dirPIN, HIGH); // kierunek 2 delay(100); for(int i=0; i<1000; i++){ digitalWrite(stepPIN, LOW); // krok do przodu digitalWrite(stepPIN, HIGH); // stop delayMicroseconds(500); } }
Drugi przykład przedstawia szereg opcji konfiguracyjnych sterownika EasyDriver. Pomysł szkicu zaczerpnięto z tutoriala Easy Driver Hook-up Guide. Szkic umożliwia sterowanie silnikiem za pomocą portu szeregowego. Program udostępnia testowanie ruchu silnika w następujących trybach:
#define Step 2 #define Dir 3 #define MS1 4 #define MS2 5 #define Enable 6 char user_input; int state; void setup() { pinMode(Step, OUTPUT); pinMode(Dir, OUTPUT); pinMode(MS1, OUTPUT); pinMode(MS2, OUTPUT); pinMode(Enable, OUTPUT); resetPins(); // Funkcja przywraca domyślne ustawienia pinów Serial.begin(9600); Serial.println("Sterowanie silnikiem krokowym"); Serial.println(); Serial.println("Wprowadz odpowiednia opcje:"); Serial.println("1. Tryb mikrokrokow: 1/1 kroku (domyslny), ruch do przodu"); Serial.println("2. Tryb mikrokrokow: 1/1 kroku (domyslny), ruch do tylu"); Serial.println("3. Tryb mikrokrokow: 1/2 kroku"); Serial.println("4. Tryb mikrokrokow: 1/4 kroku"); Serial.println("5. Tryb mikrokrokow: 1/8 kroku"); Serial.println("6. Ruch w jedna i druga strone (1/1 kroku)"); Serial.println(); } void loop() { while(Serial.available()){ user_input = Serial.read(); digitalWrite(Enable, LOW); // Otwarcie możliwości obsługi sterownika EasyDriver if (user_input =='1') { StepMode_1_1(); } else if(user_input =='2') { StepReverse_1_1(); } else if(user_input =='3') { StepMode_1_2(); } else if(user_input =='4') { StepMode_1_4(); } else if(user_input =='5') { StepMode_1_8(); } else if(user_input =='6') { ForwardBackwardStep(); } else { Serial.println("Niepoprawny nr opcji"); } resetPins(); } } // OPCJA 1: Ruch do przodu w trybie pełnego kroku (tryb domyślny) void StepMode_1_1(){ Serial.println("Ruch do przodu w trybie pelnego kroku (tryb domyslny"); digitalWrite(Dir, LOW); // "0" logiczne na pin DIR: kierunek ruchu silnika (ruch do przodu) for(int x=1; x<200; x++) // 200 kroków do przodu { digitalWrite(Step, HIGH); // 1 krok do przodu delay(1); digitalWrite(Step, LOW); // przerwa przed następnym krokiem delay(1); } Serial.println("Wprowadz nowa opcje"); Serial.println(); } // OPCJA 2: Ruch do tylu w trybie pełnego kroku void StepReverse_1_1(){ Serial.println("Ruch do tyłu w trybie pelnego kroku"); digitalWrite(Dir, HIGH); // "1" logiczna na pin DIR: kierunek ruchu silnika (ruch do tyłu) for(int x=1; x<200; x++) // 200 kroków do tyłu { digitalWrite(Step, HIGH); // 1 krok do tyłu delay(1); digitalWrite(Step, LOW); // przerwa przed następnym krokiem delay(1); } Serial.println("Wprowadz nowa opcje"); Serial.println(); } // OPCJA 3: Tryb mikrokroków: (1/2 kroku) void StepMode_1_2(){ Serial.println("Tryb mikrokrokow (1/2 kroku)"); digitalWrite(Dir, LOW); // "0" logiczne na pin DIR: kierunek ruchu silnika (ruch do przodu) digitalWrite(MS1, HIGH); // MS1 = "1" ustawienie trybu o rozdzielczości 1/2 kroku digitalWrite(MS2, LOW); // MS2 = "0" ustawienie trybu o rozdzielczości 1/2 kroku for(int x=1; x<400; x++) // 400 kroków { digitalWrite(Step, HIGH); // 1 krok do przodu delay(1); digitalWrite(Step, LOW); // przerwa przed następnym krokiem delay(1); } Serial.println("Wprowadz nowa opcje"); Serial.println(); } // OPCJA 4: Tryb mikrokroków: (1/4 kroku) void StepMode_1_4(){ Serial.println("Tryb mikrokrokow (1/4 kroku)"); digitalWrite(Dir, LOW); // "0" logiczne na pin DIR: kierunek ruchu silnika (ruch do przodu) digitalWrite(MS1, LOW); // MS1 = "0" ustawienie trybu o rozdzielczości 1/4 kroku digitalWrite(MS2, HIGH); // MS2 = "1" ustawienie trybu o rozdzielczości 1/4 kroku for(int x=1; x<800; x++) // 800 kroków { digitalWrite(Step, HIGH); // 1 krok do przodu delay(1); digitalWrite(Step, LOW); // przerwa przed następnym krokiem delay(1); } Serial.println("Wprowadz nowa opcje"); Serial.println(); } // OPCJA 5: Tryb mikrokroków: (1/8 kroku) void StepMode_1_8(){ Serial.println("Tryb mikrokrokow (1/8 kroku)"); digitalWrite(Dir, LOW); // "0" logiczne na pin DIR: kierunek ruchu silnika (ruch do przodu) digitalWrite(MS1, HIGH); // MS1 = "1" ustawienie trybu o rozdzielczości 1/8 kroku digitalWrite(MS2, HIGH); // MS1 = "1" ustawienie trybu o rozdzielczości 1/8 kroku for(int x=0; x<1600; x++) // 1600 kroków { digitalWrite(Step, HIGH); // 1 krok do przodu delay(1); digitalWrite(Step, LOW); // przerwa przed następnym krokiem delay(1); } Serial.println("Wprowadz nowa opcje"); Serial.println(); } // OPCJA 6: Naprzemienny ruch do przodu i do tylu void ForwardBackwardStep(){ Serial.println("NaprzemiEnableny ruch do przodu i do tylu"); for(int x=0; x<10; x++) { state=digitalRead(Dir); // Sczytanie stanu pinu DIR if(state == HIGH) { // zmiana stanu pinu DIR digitalWrite(Dir, LOW); } else if(state == LOW) { digitalWrite(Dir, HIGH); } for(int y=0; y<200; y++) { // 201 kroków digitalWrite(Step, HIGH); // 1 krok do przodu delay(1); digitalWrite(Step, LOW); // przerwa przed następnym krokiem delay(1); } } Serial.println("Wprowadz nowa opcje:"); Serial.println(); } // Przywracanie ustawień domyslnych void resetPins(){ digitalWrite(Step, LOW); digitalWrite(Dir, LOW); digitalWrite(MS1, LOW); digitalWrite(MS2, LOW); digitalWrite(Enable, HIGH); }