Geçenlerde elime eski bir scanner geçti. Bu sefer içini fazla kırmadan açtım ve hareketli kısma ulaştım. Motorun kart bağlantısını çıkardım ve Arduino Due kartıma yetişebilsin diue uçları kablo ekleyerek uzattım. Sonra bu adım motorunu kontrol edecek devreyi yapmak için aramalara başladım. Internette bu tür bir sürü şema var ama genelde hepsi Arduino UNO türü kartlar için, yani giriş çıkışların 5V ile çalıştığı kartlar fakat DUE giriş çıkışları 3.3V ile çalışıyor. Bu şemaların DUE ile çalışıp çalışmayacağı konusunda araştırmalar yaptım ve adafruit sayfası forumlarında Limor Fried'ın buna benzer bir soruya verdiği ayrıntısız ama olumlu cevabı gördüm. Bunun üzerine önce L293D motor kontrol çipinin özelliklerine baktım.
L293D
VCC1 girişi çip üzerindeki mantık devreleri için güç kaynağı olarak kullanılıyor. Bu bacağa 4.5V - 7V arası bir gerilim uygulamak gerekiyor ve maksimum 60 mA akım çekiyor. Arduino Due'nin 5V çıkışı 600 mA kadar akım verebiliyor. Motor için kullanılan VCC2 güç kaynağı ise VCC1'den 36V'a kadar bir gerilimle çalışıyor. Bunun için baba yadigarı ayarlanabilir bir güç kaynağı kullandım. 1A, 2A, 3A, 4A girişleri Arduino Due üzerindeki sayısal çıkışlarla kontrol ediliyor ve en fazla 100 μA akım çekiyorlar. Due kartındaki sayısal giriş çıkışlar ise 15 mA akıma kaynaklık yapabilecek ve 9 mA akım çekebilecek güçte. Bu karşılaştırmalardan sonra bu adresteki gibi bir bağlantı yapma çalışmasına başladım.
Elimdeki motor da adafruit adresindeki deneydeki gibi tek kutuplu (unipolar) ve 5 kabloya sahip bir adım motoruydu fakat önce hangi kablonun nereye bağlanması gerektiğini bulmam gerekiyordu. Aşağıda wikipedia sayfasından aldığım bir tek kutuplu adım motoru temsili şeması görülüyor.
Program aslında oldukça basit ama bazı satırları yine de açıklamak istiyorum.
int in1Pin = 12;
int in2Pin = 11;
int in3Pin = 10;
int in4Pin = 9;
Stepper motor(512, in1Pin, in2Pin, in3Pin, in4Pin);
Bu komut ile motorun temel konfigürasyonu yapılıyor. Birinci parametre (512) motorun bir turu kaç adımda yaptığını belirtiyor. Yukarıdaki örneğe göre motor bir turu 512 adımda tamamlıyormuş. Diğer parametreler de motorun girişlerini kontrol eden dijital giriş çıkışlar, motorun kabloları değil. Bu girişler L293D çipinin 1A, 2A, 3A ve 4A ayaklarına bağlı ve sıraları önemli. Ben bu sıralamayı deneme yanılmayla buldum. Eğer motor sadece iki kablo ile kontrol edilecekse yukarıdaki komutun başka bir versiyonu kullanılmalı:
Stepper motor(768, in1Pin, in2Pin);
motor.setSpeed(10);
Bu komut motorun bir dakikada kaç tur atacağını yani hangi hızla döneceğini belirliyor. Bunu yapmak için kullanılan kütüphane daha önce bir tur için gereken adım sayısını kullanarak iki adım arasında geçmesi gereken süreyi hesaplıyor ve her adımdan sonra o kadar milisaniye bekliyor. Bu değişkenlerin hepsi tamsayı tipler olduğundan kütüphanenin duyarlılığı da milisaniye ile sınırlı. Yani iki adım arasında ancak 1 milisaniyenin katları (0 dahil) kadar beklenebilir.
loop içi de aslında oldukça kolay. Seri port monitöründen girilen bir tamsayı alınıyor ve motor o kadar adım hareket ettiriliyor. Hareket için kullanılan komut
motor.step(steps);
motoru steps değişkenindeki değer kadar hareket ettiriyor. Bu hareket sırasında yukarıda tanımlanan in1Pin, in2Pin, in3Pin ve in4Pin çıkışlarına belli bir sırayla HIGH ve LOW değerleri veriliyor. Dönüş sırasında her adımda çıkışlar aşağıdaki şemaya göre aktifleştiriliyor:
Bu tablo kullanılarak motorun kabloları yazılımla deneme yapılmadan da bulunabilir. Tablodaki çıkışlar L293D çipindeki 1A ... 4A girişlerine girerken bunlara tekabül eden 1Y ... 4Y çıkışları da motorun kablolarına bağlanıyor. Yani aynı tablo kullanılarak motorun kablolarına yeterli gerilim verildiğinde motorun beklenen adımı atması lazım. Tabii adımlar sırasındaki hareket çok küçük olduğundan motora dikkatlice bakmak gerekiyor.
Burada ortadaki uçlar ortak olacak şekilde bağlarsak tipik bir 5 kablolu tek kutuplu adım motoru elde etmiş oluruz. Elimdeki motorun ortak ucunu bulmak için basit bir test uyguladım. İkişer ikişer uçların arasındaki direnci ölçtüm. Ortak uç ile bobinin bir ucu arasındaki direnç bobinin iki ucu arasındaki direncin yarısı kadar olmalı. Aynı şekilde diğer dört uçla arasında aynı dirence sahip olan uç ortak uç olmalı. Yaptığım ölçümler sonucu bobin uçları arasında 150 ohm ve ortak uç ile bobin uçları arasında ise 75 ohm okumalar elde ettim. Ortak ucu bulduktan sonra diğer dört ucu hangi sırayla aktifleştirmem gerektiğini deneme yanılmayla buldum. Bunun için adafruit sayfasındaki adım motoru eğitim projesini denemeye başladım. Devreyi projedeki gibi oluşturdum.
Ben testte tabii ki Arduino UNO yerine DUE kullandım ama aynı bağlantıları yaptım, çünkü projede verilen programı birebir kullanmayı planlamıştım. Tabii ki elimdeki motorun kabloları bu şemadakinden farklıydı. Dolayısı ile bir sonraki sayfadaki programı yükleyip kablo bağlantılarını değiştirerek motorun ne kadar yumuşak çalıştığını gözlemledim. Birkaç deneme sonunda istediğim sonucu almayı başardım.
Programı Arduino'ya yükledikten sonra seri port monitörünü açıp oradan motorun hangi yöne (pozitif ya da negatif) ne kadar dönmesi gerektiği yazılıyor ve ENTER tuşuna basınca da program bu değeri okuyup motor kontrolüne başlıyor. Motor verilen değer kadar döndüğünde otomatik olarak durduruluyor.
Program aslında oldukça basit ama bazı satırları yine de açıklamak istiyorum.
int in1Pin = 12;
int in2Pin = 11;
int in3Pin = 10;
int in4Pin = 9;
Stepper motor(512, in1Pin, in2Pin, in3Pin, in4Pin);
Bu komut ile motorun temel konfigürasyonu yapılıyor. Birinci parametre (512) motorun bir turu kaç adımda yaptığını belirtiyor. Yukarıdaki örneğe göre motor bir turu 512 adımda tamamlıyormuş. Diğer parametreler de motorun girişlerini kontrol eden dijital giriş çıkışlar, motorun kabloları değil. Bu girişler L293D çipinin 1A, 2A, 3A ve 4A ayaklarına bağlı ve sıraları önemli. Ben bu sıralamayı deneme yanılmayla buldum. Eğer motor sadece iki kablo ile kontrol edilecekse yukarıdaki komutun başka bir versiyonu kullanılmalı:
Stepper motor(768, in1Pin, in2Pin);
motor.setSpeed(10);
Bu komut motorun bir dakikada kaç tur atacağını yani hangi hızla döneceğini belirliyor. Bunu yapmak için kullanılan kütüphane daha önce bir tur için gereken adım sayısını kullanarak iki adım arasında geçmesi gereken süreyi hesaplıyor ve her adımdan sonra o kadar milisaniye bekliyor. Bu değişkenlerin hepsi tamsayı tipler olduğundan kütüphanenin duyarlılığı da milisaniye ile sınırlı. Yani iki adım arasında ancak 1 milisaniyenin katları (0 dahil) kadar beklenebilir.
loop içi de aslında oldukça kolay. Seri port monitöründen girilen bir tamsayı alınıyor ve motor o kadar adım hareket ettiriliyor. Hareket için kullanılan komut
motor.step(steps);
motoru steps değişkenindeki değer kadar hareket ettiriyor. Bu hareket sırasında yukarıda tanımlanan in1Pin, in2Pin, in3Pin ve in4Pin çıkışlarına belli bir sırayla HIGH ve LOW değerleri veriliyor. Dönüş sırasında her adımda çıkışlar aşağıdaki şemaya göre aktifleştiriliyor:
| Adım no modulo 4 = 0 | Adım no modulo 4 = 1 | Adım no modulo 4 = 2 | Adım no modulo 4 = 3 |
| 1010 | 0110 | 0101 | 1001 |
| in1Pin = HIGH | in1Pin = LOW | in1Pin = LOW | in1Pin = HIGH |
| in2Pin = LOW | in2Pin = HIGH | in2Pin = HIGH | in2Pin = LOW |
| in3Pin = HIGH | in3Pin = HIGH | in3Pin = LOW | in3Pin = LOW |
| in4Pin = LOW | in4Pin = LOW | in4Pin = HIGH | in1Pin = HIGH |
Bu tablo kullanılarak motorun kabloları yazılımla deneme yapılmadan da bulunabilir. Tablodaki çıkışlar L293D çipindeki 1A ... 4A girişlerine girerken bunlara tekabül eden 1Y ... 4Y çıkışları da motorun kablolarına bağlanıyor. Yani aynı tablo kullanılarak motorun kablolarına yeterli gerilim verildiğinde motorun beklenen adımı atması lazım. Tabii adımlar sırasındaki hareket çok küçük olduğundan motora dikkatlice bakmak gerekiyor.



Hiç yorum yok:
Yorum Gönder