Silnik krokowy

silnik krokowy arduino

Przygoda z silnikiem krokowym rozpoczęła się w momencie zainteresowania modelarstwem, dokładniej stolarstwem. Możliwość wprawienia w ruch jakiegoś elementu sprawiła, że silnik krokowy stał się odpowiedzią na moje potrzeby.

Potrzeb było kilka…. szlaban, podnośnik i winda dla resoraków, wszystkie elementy, którymi można sterować elektronicznie, właśnie poprzez silnik krokowy. Impulsowe zasilanie prądem elektrycznym powoduje, że wirnik silnika nie obraca się ruchem ciągłym. Poprzez sekwencje impulsów wykonuje za każdym razem ruch obrotowy o ściśle ustalony kąt. Daje to możliwość wykonywania precyzyjnym ruchów wałem o konkretną ilość stopni. Można na tym oprzeć budowę przekładni, która skutecznie wprawi w ruch jakiś element.

Sam silnik krokowy to za mało… potrzeba do niego podłączyć sterownik. Zapewni on zarządzanie pracą samego silnika, a sam jest sterowany poprzez impulsu płynące z mikrokontrolera – np. Arduino.

Jaki silnik krokowy wybrać?

To zależy co chcesz napędzać. Sam postawiłem na prosty, tani i szeroko dostępny silnik 28BYJ-48 5V/ 0.1A/ 0,03Nm, który sterowany jest sterownikiem ULN2003. Łatwo można kupić całe zestawy za kilkanaście PLN. Wadą, jaką dostrzegłem już w trakcie instalacji, to fakt, że silnik nie jest zbyt mocny. Również sam sterownik i silnik zabierają dość dużo miejsca – ale to zależy oczywiście kto jaką powierzchnia dysponuje.

Silnik pracuje na 5V, wał kręci się w obie strony, a jeżeli brakuje momentu obrotowego można zastosować przekładnię zembatą. Innym sposobem zwiększenia mocy jest zmiejszenie delaya pomiędzy wysokimi stanami pinów Arduino, co spowoduje, że wał będzie kręcił się wolniej, ale z większą siłą.

Co do samego podłączenia, to potrzeba 5V, GND oraz 4 cyfrowe piny mikrokontrolera, na które sekwencyjnie będą wysyłane stany wysokie w pętli, ale o tym w przykładzie:

#define P1 22
#define P2 23
#define P3 24 
#define P4 25

void setup() {
  
  pinMode(P1, OUTPUT);
  pinMode(P2, OUTPUT);
  pinMode(P3, OUTPUT);
  pinMode(P4, OUTPUT);

  for(int i=0;i<600;i++){
    motor_CW(2);
  }
}
void loop (){

}

//clockwise
void motor_CW( int dly){
  digitalWrite(P1, HIGH);
  delay(dly);
  digitalWrite(P1, LOW);
  digitalWrite(P2, HIGH);

  delay(dly);
  digitalWrite(P2, LOW);
  digitalWrite(P3, HIGH);

  delay(dly);
  digitalWrite(P3, LOW);
  digitalWrite(P4, HIGH);

  delay(dly);
  digitalWrite(P4, LOW);
}

//counter clockwise
void motor_CCW(int dly){
  digitalWrite(P4, HIGH);
  delay(dly);
  digitalWrite(P4, LOW);
  digitalWrite(P3, HIGH);

  delay(dly);
  digitalWrite(P3, LOW);
  digitalWrite(P2, HIGH);

  delay(dly);
  digitalWrite(P2, LOW);
  digitalWrite(P1, HIGH);

  delay(dly);
  digitalWrite(P1, LOW);
}

Przykład uruchamia raz na starcie programu pętlę, która wykonuje się 600 razy i w tym czasie na poszczególne piny idzie stan wysoki i odpowiedniej sekwencji, z wykorzystaniem wspomnianego wcześniej delay’a. W zależności od wywołania funkcji motor_CW lub motor_CCW wał silnika będzie się obracał w stronę zgodną z ruchem wskazówek zegara lub przeciwną.


Opublikowano: 13 listopada, 2020 przez Pan z Pogodna

Leave a Reply