25 Aralık 2015 Cuma

Arduino - ULN2003A ile Step (Adım) Motor Sürme


DC Motor ve  Servo Motoru PWM yöntemiyle sürmüştük. Step motorun sürülmesi ise bu diğer 2 motora göre biraz daha farklı. Step motorlar dijital kontrollüdürler ve her gönderilen pals için belli açıda döndürülebilirler. Hassasiyet gereken küçük açılarla hareket etmesi istenen cihazlar için kullanılırlar.



Soldaki gifte görüldüğü gibi step motorun 4 sargısında sırasıyla verilen lojik-1'ler ile oluşan manyetik alan sayesinde rotorun dönmesi sağlanır.

Step motorun sürülmesi için 2 yöntem vardır. Bunlar "Tam Adım" ve "Yarım Adım" sürme teknikleridir.

Tam Adım'da motor sargılarının ikisi aynı anda enerjilendirilir, tıpkı soldaki gifte görüldüğü gibi.

Yarım Adım'da ise tek faz ve tam adım sürme adımları art arda uygulanır. Böylece motor her enerjilendirmede yarım adım döner.



Kullandığımız motor 28BYJ-48 Tam adımda 3º , Yarım Adımda 1.5º dönmekte. Biz uygulamamızda yarım adım yöntemini kullanacağız. Tam adım ve yarım adım motor sürmek için sargılara sırasıyla uygulanması için gereken pals tablosu  aşağıda.




Yapacağımız uygulamayı özetlemek gerekirse bağladığımız 2 buton ile step motorumuza 1.5º'lik açıyla yön vereceğiz. 

Bu sargılara verilmesi gereken akımı Arduino karşılayamadığı için dolaylı yoldan, ULN2003A entregresini kullanarak süreceğiz. Bu entegre 500mA'e kadar çıkış verebilmektedir.





Kodlarımız;




  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
#define IN1  8
#define IN2  9
#define IN3  10
#define IN4  11
#define saga 2
#define sola 3

int bekle=1;

void setup()
{  
   pinMode(IN1, OUTPUT);
   pinMode(IN2, OUTPUT);
   pinMode(IN3, OUTPUT);
   pinMode(IN4, OUTPUT);
   pinMode(saga,INPUT_PULLUP);
   pinMode(sola,INPUT_PULLUP);
}

void loop()
{
  if(digitalRead(saga)==HIGH)
  {
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, HIGH);
     delay(bekle);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, HIGH);
     delay(bekle);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, HIGH);
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, HIGH);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, HIGH);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, HIGH);
     delay(bekle);    
  }
  if(digitalRead(sola)==1)
  {
    digitalWrite(IN1, HIGH);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, HIGH);
     delay(bekle);
      digitalWrite(IN1, HIGH);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, HIGH);
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, LOW);
     delay(bekle);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, LOW);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, HIGH);
     delay(bekle);
     digitalWrite(IN1, LOW);
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, HIGH);
     delay(bekle);
   
  }
}

Denemek için zamanım olmadı fakat I/O kodlarını hexal moda çevirip kısaltarak burda tekrar paylaşacağım. 

Tam adım sürmek isteyenler, sargıları tek tek lojik-1 (HIGH) yaparak sonuca ulaşabilirler.

NOT: Daha önce ki motor uygulamalarımızda yaptığımız gibi motorun beslemesini toprakları ortak olmak şartıyla dışardan almanızda fayda var. Fakat beslemeyi Arduino'dan almanızda da bir sakınca yok, çalışıyor.

Uygulama Videosu;





Şemalarını kullanmış olduğum kaynaklar;
http://domoticx.com/arduino-modules-stappenmotor-28byj-48/

http://www.electricaleasy.com/2014/10/stepper-motor.html

Hiç yorum yok:

Yorum Gönder