Step Motor nedir?
Step motorlar adım adım ilerleme mantığı ile çalışan, hassas konumlama yapabilen DC (doğru akım) ile çalışan motorlardır. Birden fazla bobinden oluşan stator, sabit mıknatıstan oluşan rotor içermektedir.


Yukarıda 28 BYJ-48 5V step motorun içindeki bobin sayısı ve bağlantı sayısı görülmektedir. İki adet bobinden 4 adet uç çıkarılmış ve bu bobinler orta uçları da birleştirilerek kırmızı kabloya bağlanmıştır.
Adım adım ilerleme görevini içerisinde yer alan birden fazla stator sarımlarına uygulanan farklı gerilimlerle sağlar. Adım açısı motorun türüne bağlı olarak farklı değerlerde olabilir (90,45,18,7.5,1.8, gibi). Her bir adım hareket ettirildiklerinde, adım açısı kadar hareket yaparlar.
Bu konuda kullanacağımız 28 BYJ-48 Step Motoru genellikle ULN2003 entegreli sürücüsü ile birlikte satılır. Tam adım sayısı 32, yarım adım sayısı ise 64’ tür. Tam veya yarım adımlarla hareket ettirilebilirler. Ayrıca 28 BYJ-48 step motoru, her bir adım sayısını 64’ e bölen mekanik çark sistemi içermektedir. Hesaplayacak olursak;
360/32=11,25 mekanik bölücü olmadan.
11,25/64=0,17 derece mekanik bölücü ile birlikte.

Mekanik bölücüyü çıkarma şansımız olmadığı için programda adım sayısı olarak 32 yi gireceğiz. Fakat kodları yazarken her bir adım 64’ e bölündüğü için 32*64=2048 sayısını kullanacağız. Yani 2048 adımlı bir step motorumuz var. 2048 adımda 360 derece hareket ediyor olacak.

Step motoru hareket ettirmek için, bobinler sırası ile enerjilendirilir. Bu da sabit bir mıknatıstan oluşan rotoru hareket ettirir. Yukarıdaki şemada step motorun arduino uno üzerinden ULN 2003A entegresi ile nasıl kontrol edilebileceği görülmektedir. Bu devrede 8,9,10,11 nolu bacaklara sırası ile 1 göndermek step motoru adım adım hareket ettirecektir. Aşağıdaki tabloda bu durumun nasıl yapılacağı anlatılmıştır.

Bacak 1.aşama 2.aşama 3.aşama 4.aşama KOD
in1 1 0 0 0 digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
digitalWrite(in3,LOW);
digitalWrite(in4,LOW);
in2 0 1 0 0 digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
digitalWrite(in3,LOW);
digitalWrite(in4,LOW);
in3 0 0 1 0 digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
in4 0 0 0 1 digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);


Kütüphane kullanmadan adım adım saat yönünde (cw) hareket ettirmek için gerekli kodlar aşağıda verilmiştir:
Kod:
int in1 = 8; //burada motor sürücü entegresinin arduino uno nun
int in2 = 9; //hangi bacaklarına bağlandığı belirtildi ve bu bacaklar isimlendirildi.
int in3 = 10;
int in4 = 11;
int bekleme = 2; // bekleme isimli integer türünde değişken tanımlandı ilk değeri 2 yapıldı.
int i = 0; // sayac işlemi için i değişkeni tanımlandı.
 
void setup() {
  pinMode(in1, OUTPUT); //in1,,,in4 bacakları çıkış yapıldı.
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}
void loop() {
  for (i = 0; i < 512; i++) { //512 adet döndürülecek döngü kurgulandı. 512*4=2948 adım dönecek.
    digitalWrite(in1, HIGH); //sırası ile bacaklar 1 yapılarak adım adım ilerme sağlanıyor. www.ilerikontrol.com
    digitalWrite(in2, LOW);  //28 byj 48 için 2048 adım 360 derece demek.
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
   delay(bekleme);
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
   delay(bekleme);
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
   delay(bekleme);
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
   delay(bekleme);
  }
  delay(2500); // her for döngüsü bitişinde 2500 ms beklesin de ne kadar döndüğünü görelim :)
}
Şimdi de yine kütüphane kullanmadan saat yönünün tersinde (ccw) döndürecek kodları görelim. Sadece başlangıçta in1 değil i4 olacak ve geriye doğru kod gönderilecek.
Kod:
int in1 = 8;     // entegrenin bağlandığı bacaklar belirtildi.
int in2 = 9;
int in3 = 10;
int in4 = 11;
int bekleme = 2; /*bekleme süresi tek satırdan tüm programda değişsin diye değişken tanımladık. Bekleme süresi 1 ms yapınca 28byj48 hareket etmedi. Bekleme süresi aynı zamanda motorun hızını belirliyor.*/
int i=0; //www.ilerikontrol.com
 
void setup() {
  pinMode(in1, OUTPUT); //in1,2,3,4 çıkış yapıldı.
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}
 
void loop() {
  for(i=0;i<512;i++){
  digitalWrite(in4, HIGH); // şimdi de saat yönünün tersinde
  digitalWrite(in3, LOW); // in4 den in1 e doğru bir vererek
  digitalWrite(in2, LOW);  // step motorumuzu döndürüyoruz.
  digitalWrite(in1, LOW);  //yine 512*4=2048 adım 360 dereceye denk gelmekte.
  delay(bekleme);
  digitalWrite(in4, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in1, LOW);
  delay(bekleme);
  digitalWrite(in4, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in1, LOW);
  delay(bekleme);
  digitalWrite(in4, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in1, HIGH);
  delay(bekleme);
  }
  delay(2500); //2500 ms yani 2.5 sn beklesin ki kaç derece dönüyor görelim.
}
Kütüphane kullanmadan yazdığımızda biraz fazla kod kullansak ta döngüleri fonksiyonlar içerisinde yazarsak işimiz çok da zor değil. Şimdi de KÜTÜPHANE kullanarak step motorumuzu kontrol edelim.
Kod:
#include <Stepper.h> //stepper kütüphanesini çağırdık.
// aşağıdaki sayı step motor adım sayısı ile değiştirilir.
#define STEPS 32 //www.ilerikontrol.com @mrt4shn
Stepper motor(STEPS, 8, 10, 9, 11); /*step motor sınıfında MOTOR isminde yeni motorumuz oluşturuldu.*/
//burada in1,in3,in2,in4 sırası izlenmeli. buna göre bacak numaraları girildi.
 
void setup() {
  motor.setSpeed(30); /*28 byj 48 için hız ayarı yaptık. Burada en fazla kaç yazılabileceği hususundan emin değilim.*/
  //1024 den sonra verim alamadık.
}
 
void loop() {
  motor.step(1024); //180 derece saat yönünde
  delay(500); //yarım saniye bekleme verildi.
  motor.step(-2048); /*360 derece saat yönünün tersinde döndürmek için adım değerleri yazıldı.*/
  delay(500); //burada yine 2048 adımın 360 derece olduğu unutulmamalı.
}
Şimdi de 28 byj 48 5V 2048 adımlık Step Motorumuzu yarım adım ilerletme için gerekli kodlamayı görelim. Yarım adım kod gönderim tablosu da aşağıda yer almaktadır.



Kod:
int in1 = 8;          
int in2 = 9;
int in3 = 10;
int in4 = 11;
int bekleme = 2;
int i=0;
 
void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}
 
void loop() {
  for(i=0;i<512;i++){
digitalWrite(in4, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in1, LOW);
  delay(bekleme);
digitalWrite(in4, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in1, LOW);
  delay(bekleme);
digitalWrite(in4, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in1, LOW);
  delay(bekleme);
digitalWrite(in4, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in2, HIGH);
  digitalWrite(in1, LOW);
  delay(bekleme);
digitalWrite(in4, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in1, LOW);
  delay(bekleme);
digitalWrite(in4, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in1, HIGH);
  delay(bekleme);
digitalWrite(in4, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in1, HIGH);
  delay(bekleme);
digitalWrite(in4, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in1, HIGH);
  delay(bekleme);
  }
  delay(500);
}