28BYJ-48 Step Motor ile Stepper kütüphanesi Sorunu


Herkese uzun bir süreden sonra tekrar merhaba,
Bu yazımda sizlere 28BYJ-48 Step Motorunun Arduino ile nasıl sürüleceğini anlatacağım. Motoru sürücüsü ile beraber çinden yaklaşık 2 dolar gibi bir fiyata aldım. Her ne kadar torku ve hızı düşük olsa da bu motorun kullanılabileceği bir çok proje var. Motoru ilk başta Arduinonun kendi ile gelen Stepper.h ile denedim fakat çok kötü bir performans aldım. Motor gereğinden fazla ısınıyor ve çok yavaş dönüyordu. Gerekli araştırmaları yaptıktan sonra Accelstepper kütüphanesinin bu motor için çok iyi çalıştığını deneyimledim. Fakat kullanılan sınıfların bazı uygulamalar için gereksiz olduğunu gördüm. Normal olarak motoru sürmek için step motorların çalışma mantığına baktım. Her bir fazda hangi sinyal göndereceğimi bilirsem bu motoru sürebilirim. Biraz daha araştırdıktan sonra sırasıyla aşağıdaki ve bunun kombinasyonları gibi pinlere sinyalleri yolladım.
IN1 1 0 0 0
IN2 0 1 0 0
IN3 0 0 1 0
IN4 0 0 0 1

Her bir faz arasına bekleme ekdim. Delay süresi arttıkça motor yavaş dönmeye başlar. Hızlı dönmesini istiyorsanız delay miktarını en aza indirin. Sinyaller motorun alabileceğinden fazla hızlı giderse motorun dönmeyeceğini göreceksiniz. Bu motoru adım sayısının önemli olduğu labirent çözen robot, mini-cnc, 2 boyutlu çizim robotu gibi  projelerinizde kullanabilirsiniz. Başka bir yazıda görüşmek üzere hoşçakalın :)

Arduino Kodu:

// niyazitoker.blogspot.com.tr 28BYJ-48 Step Motor kontrol kodu
int Pin0 = 2;
int Pin1 = 3;
int Pin2 = 4;
int Pin3 = 5;

int one_git =1;
int geri_git =0;

int counter++;
int max_steps = 65;
int step = 0;

void setup() {
  pinMode(Pin0, OUTPUT);
  pinMode(Pin1, OUTPUT);
  pinMode(Pin2, OUTPUT);
  pinMode(Pin3, OUTPUT);
}

void loop() {
while(counter<max_steps)
{
  switch(step) {
    case 0:
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, HIGH);
      break;
    case 1:
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, HIGH);
      digitalWrite(Pin3, HIGH);
      break;
    case 2:
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, HIGH);
      digitalWrite(Pin3, LOW);
      break;
    case 3:
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, HIGH);
      digitalWrite(Pin2, HIGH);
      digitalWrite(Pin3, LOW);
      break;
    case 4:
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, HIGH);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, LOW);
      break;
    case 5:
      digitalWrite(Pin0, HIGH);
      digitalWrite(Pin1, HIGH);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, LOW);
      break;
    case 6:
      digitalWrite(Pin0, HIGH);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, LOW);
      break;
    case 7:
      digitalWrite(Pin0, HIGH);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, HIGH);
      break;
  }

  if(one_git) {   // geri_git yazarsanız motorların ters yonde döneceğini görebilirsiniz.
    step++;
  } else {
    step--;
  }
  if(step>7) {
    step=0;
  }
  if(step<0) {
    step=7;
  }
  delay(1);  // beklemeyi arttırdığınızda motorun yavaşladığını görebilirsiniz.
counter++;
}

}

Yorumlar

Bu blogdaki popüler yayınlar

Sinyal Jeneratörü Nedir? (Function generator)

Arduino'dan Python'a veri aktarma

#12 Arduino ile Step Motor Kontrolü