Adafruit Motor Shield Pin Yapısı ve Yazılım Fonksiyonları

21 8.719

Merhaba arkadaşlar, robotik uygulamalarda en çok kullanılan motor sürücü kartlarından biri olan adafruit firmasının geliştirdiği L293d entegresi barından Adafruit motor shield motor sürücü kartından bahsedeceğim. Tercih edilmesinin en başlıca sebebi arduino üzerine takılabilir olmasından dolayı pratik bir şekilde bağlantı sağlanmasıdır. Öncelikle kartın genel pin yapısına bakıp ardından kartın kullandığı kütüphaneyi ve fonksiyonların anlamlarını açıklayacağım. Kartın kütüphane kullanması da yazılım açısından büyük bir avantajdır.

Adafruit Motor Shield Genel Bakış

Pin yapısına baktığımızda şekilde de görüldüğü üzere 4 adet dc motor, 2 adet servo motor ve 2 adet step motor sürebiliyor. Yani sadece dc motor sürmek için tasarlanmamış. Bu yönüyle de oldukça avantajlıdır. Arduino uno üzerine taktığımızda arduinonun pinleri kapandığından ek olarak arduinodan çıkış almamız gerektiği durum olursa shield üzerinde ek pinler bulunmaktadır. Yani bu pinler normal arduino pinleri olarak kullanılır. Şekilde de görüldüğü gibi analog 0’dan 5’e kadar ve dijital 0’dan 13’e kadar ek pinler yer alır. Ayrıca besleme pinleri de ayrı bir çıkıştan verilmiştir.  Bu modellerin bazı shieldlerde ek olarak djital pinler bulunmuyor. Bu durumda ise shield i pinlere takarken ek bir kablo ile aynı pinden çıkış alabilirsiniz. 5-12v arası çalışma voltajına sahiptir. Her kanal 600 mah akım vermektedir.

Adafruit Shield Kütüphane Fonksiyonları

Bilindiği üzere bu kart kütüphane kullanmaktadır. Kütüphaneyi buradan indirebilirsiniz.

Kütüphaneyi çağırmak için #include <AFMotor.h> yazabilir veya kütüphane ekle menüsünden çağırabilirsiniz.

Dc Motor Kontrol Fonksiyonları:

AF_DCMotor : Bu fonksiyon ile dc motor tanımı yapılır.

Dc motor sürmede iki husus vardır. Birincisi kanal numarası, ikincisi de pwm frekansıdır.

1 ve 2 nolu kanal için frekans tanımlamaları;

  • MOTOR12_1KHZ // 1khz frekans
  • MOTOR12_2KHZ // 2khz frekans
  • MOTOR12_8KHZ // 8khz frekans
  • MOTOR12_64KHZ // 64khz frekans

3 ve 4 nolu kanal frekans tanımlamaları;

  • MOTOR34_1KHZ // 1khz frekans
  • MOTOR34_8KHZ // 8khz frekans
  • MOTOR34_64KHZ  // 64khz frekans

Motorların tanımlarını iki şekilde yapabilirsiniz.

1.Tanımlama :

AF_DCMotor motor1(1); >> Burada parantez içindeki sayı kanal numarasını verir.Dışındaki  “motor1” tanımı ise 1.kanala atadığımız isimdir Bu şekilde tanımladığımızda pwm frekansını girmediğimiz için varsayılan frekans değeri 1khz olarak tanımlanmış olacaktır.

2.Tanımlama : 

AF_DCMotor left_motor(1, MOTOR12_64KHZ); 

Burada yine 1. kanalı tanımladık. Kanal adını “left_motor” olarak tanımladık. Bu tanımlamada frekans değerimizi de girdik. Parantezde birinci kısım kanal adı ikinci kısım ise frekans değerimizdir.

  • Yüksek frekans seçerseniz motorlardan daha az uğultu gelir fakat motorun torkunu düşürür.

Motorların Hız Fonksiyonu:

setSpeed Fonksiyonu: Bu fonksiyon ile motorları 0 ile 255 değerler arasında hızını ayarlayabilirsiniz.

motor1.setSpeed(180); >> Bu şekilde motor1 isimli motor kanalına parantez içine girdiğimiz değer ile hızını belirlemiş olduk.

Motorların Hareket Fonksiyonları:

run fonksiyonu: Bu fonksiyon ile motorların ileri geri ve durma işlemini gerçekleştiriyoruz.

Fonksiyonda yön işlemleri ingilizce terimlerle sağlanıyor.

FORWARD – ileri
BACKWARD  – geri
RELEASE – dur

motor1.run(FORWARD); >> Bu şekilde “motor1” isimli kanalın motorun yönü ileri olarak ayarlandı.

motor.run(BACKWARDS); // Geri git
motor.run(RELEASE); // Dur

Step Motor Kontrol Fonksiyonları

Yukarıdaki şekilde de görüldüğü üzere 2 tane step motor sürebiliyoruz. 1. ve 2. kanal birinci step, 3.ve 4. kanal ikinci step motoru kontrol etmemizi sağlıyor.

AF_Stepper: Bu fonksiyon step motor tanımı yapar.

AF_Stepper motor_adı(adım, kanal numarası)

Yukarıdaki fonksiyon yapısı step motorun genel tanımıdır.

AF_Stepper ile step motor fonksiyonunu çağırdık.

motor_adı” kısmı step motorunuza vereceğiniz isimdir.

“adım” kısmına step motorun  bir devirdeki adım sayısı girilir.

“kanal numarası” kısmına da step motoru hangi kanala bağlamak istiyorsak o kanalın numarası girilir. Yani sol kısım 1. kanal sağ kısım ise 2. kanal idi. 1 veya 2 girmemiz gerekir.

Örnek tanımlama:

AF_Stepper Stepper1(200, 1); Bu tanım ile “Stepper1” adında motorun 200 adımlık step bilgisi ile 1. kanala tanımlı olduğu belirtilir

[/vc_column_text]

step(adım, yön, mod) : Bu tanımlama step motoru hareket ettirmek için adım yön ve mod bilgisinin girildiği kısımdır.

“adım” kısmına motorun kaç adım döneceği bilgisi girilir.

“yön” kısmına motorun dönme yönü girilir. Yön fonksiyonları “FORWARD” ve “BACKWARD” olarak tanımlanır.

“mod” kısmında step motorun hareket şekli girilir. Bunlar;

  • SINGLE : Bir bobine enerji  vermesiyle motoru çalıştırır. Güç tasarrufu gerektiren yerlerde kullanışlıdır fakat çok yaygın değildir. Motora az tork verir.
  • DOUBLE : İki bobine enerji vermesiyle motoru çalıştırır. Motora tam tork verir.
  • INTERLEAVE : Bobinlere eş zamanlı enerji vererek adım açısını yarıya düşürür. Bu sayede adım sayısı iki katına çıkar ve çözünürlük artar. Örneğin 200 adım 1.8 derece motor bu fonksiyon ile 0.9 derece 400 adım değerini alır.
  • MICROSTEP : Pürüzsüz motor sürüşü sağlar. Yaygın kullanılan fonksiyondur. Adımlar arasında yumuşak geçiş sağlar. Fakat torku düşürür.

Örnek fonksiyon :

Stepper1.step(150, FORWARD, DOUBLE); >> Burada “Stepper1” isimli motorun 150adım ile “DOUBLE” modunda döneceği bilgisi girildi.

setSpeed(rpm) fonksiyonuStep motorun rpm değerini ayarlamak için kullanılan fonksiyondur. Parantez içine rpm değeri girilir.

Stepper1.setSpeed(10); Bu şekilde “Stepper1” isimli motorun hız değerini tanımladık.

onestep(yön, mod) fonksiyonu: Bu fonksiyon tek adım step motorlar için geçerlidir. Parantez içindeki yön ifadesine FORWARD veya BACKWARD yazılarak yön belirtilir. mod ifadesine de yukarıdaki aynı modları kullanarak tanımlamamızı yapıyoruz.

Örnek fonksiyon:

Stepper1.onestep(FORWARD, DOUBLE); Bu şekilde “Stepper1” isimli motorun yönünü ileri ve modunu ise “DOUBLE” olarak belirttik.

release() fonksiyonu: Bu fonksiyon motoru durdurur ve torku tutar yani enerji kesmez ve motorun aynı torkta kalmasını sağlar.

Stepper1.release(); Bu şekilde “Stepper1” isimli motoru durdurur.

Servo motor Kontrolü

Sürücü üzerinde 2 adet servo girişi bulunmakta. Servoları sürmek için sürücünün kendi kütüphane fonksiyonu yok. Normal servo motor kütüphanesini kullanarak servoları kontrol edebilirsiniz. Servo1 yazan giriş arduinonun 9. dijital pinine, Servo2 yazan giriş ise arduinonun 10.dijital pinine bağlıdır. Kullanıcıya kolaylık olsun diye 2 adet servo girişi yapılmış.

servo1.attach(10); veya servo1.attach(9); ile servo motoru bu girişlere tanıtabilirsiniz.

Adafruit Shield ile yapılmış çizgi izleyen robot projesine bakabilirsiniz.

 

Bunlar da İlgini Çekebilir

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  1. Gökhan

    iyi günler. rahatsız ediyorum ama bir konu da yardımcı olabilirmisiniz?
    Ben 74HC595 ile “pwm” pinlerini çoğaltmak istiyorum. Bunun için şu kütühaneyi kullanıyorum:
    github.com/Simsso/ShiftRegister-PWM-Library
    Bu da bu kütüphaneye ait makale:
    timodenk.com/blog/shiftregister-pwm-library/
    Makaleye göre 74HC595 entegresinin “pwm” genişletme olarak kullanılması için şema:
    timodenk.com/blog/wp-content/uploads/2017/10/single-sr_schem_screenshot-768×500.png
    Bu da benim 2 dc motor enA pinleri ve 1 adet rgb led bağlantım.
    cdn.pbrd.co/images/HAN8m3y.png

    Bunlara göre yaptığım ardiuno da entegre komutlara hızlı cevap veriyor. yani performansda da bir sorun yok.
    Sadece dc motorları 0 ile 255 aralığında değer vererek çalışmasını/hızlanmasını/durdurulması
    sağlanırken, 0 ile durdurup, 255 ile de en hızlı şekilde hareket etmesini sağlıyor. yani 0 ile 255 aralığında bir değer verirsek bunu 0 gibi algılayıp, motoru durduruyor. yani bir nevi “digital pinlerde” olduğu gibi “HIGH/LOW” şeklinde yorumluyor. oysa “pwm pinlerinin” özelliği hızında istenilen seviyede ayarlanabilmesi ama bu olmuyor. nedendir bilmiyorum? yoksa gerisi gayet güzel çalışıyor.

  2. Gökhan

    2 tane step motor kullandığımızda 1nci ve 2nci kanal olarak görmekte.Arduino da 11, 6, 5, 3 olan pwm çıkışlarına bağlantısı olmakta.yani bu pwm çıkışlarını buna tahsis etmiş oluyoruz.Ayrıca 12, 8, 7, 4 nolu digital çıkışlarını da pwmlerle birlikte tahsis etmiş oluyormuyuz? Yani bu digital leri veya pwmleri başka bir led, motor vbg için aynı zamanda veya ayrı olarak kullanabiliyormuyuz? Bu kart hemen hemen 8 çıkış pini kullanıyor.Ardiuno Uno’da başka bir şeye ihtiyaç için pin kalmıyor. Bu durumda “digital pins extension” veya “pwm extension” yöntemi ile “74HC595” entegresini kullanmalımıyım? Bu sorularıma cevap verebilirseniz sevinirim. Teşekkürler.

  3. mahsun

    Cnc kurdum ama ne yazık ki gcode olarak gonderdigim hicbir seyi duzgun cizemedi suana kadar .Bilgisayara bagladıgım usb kabloyla besliyorum baglantıları da bircok kez gozden gecirdim ama hala karalamadan oteye gecemedim bi turlu.Nerede yanlıs yapıyorum acaba ?

  4. fatih

    Yazınız çok güzel olmuş teşekkür ederim

  5. Bülent

    “exit status 1 Error compiling for board Arduino Robot Motor.” hatası alıyorum. Yardım lütfen

  6. Alper

    peki servo nasıl sürüyoruz ????

  7. Turgay

    arduino ya yeni merak salmış biri olarak bu makale beni bir anda çok mutlu etti. 1 haftadır siteleri forumları yalayıp yutuyorum ama bu kadar net ve açıklayıcı bir yazı görmedim teşekkürler. sitenizi favorilere ekledim.

  8. Mehmet Ali GÖK

    bu kart ile 1 tane step motor ve 1 tane de dc motoru aynı zamanda sürebilirmiyiz.

    1. Sezgin GÜL

      Elbette sürebilirsiniz.

  9. serkan

    ekstra pil eklesek nasıl yapıcaz ?

    1. şükrü

      resimdeki sürücüde görmüş olduğunuz gibi gnd terminalinin yanında power jumper soketi var eger arduinoyu ek bir güçle beslemek istemiyorsak bu soketi çıkartmadan direk sürücüyü beslaediğimiz zaman ‘vın’ pininden arduinoya güç gidecektir eğer arduinoyu ek bir güçle beslemek istiyorsak bu jumper soketini çıkarmamız lazım her şey bu kadar umarım yardımcı olmuşumdur 🙂

  10. yağmur

    Öncelikle Merhaba,

    Okulda bir ders için proje yapmam gerekiyor.Servo ve step motorun kontrolünü motor shield yapmak istiyodum ve aldım. Motorların bağlantı şekli vs. öğrendim ama benim motorlara sağ-sol , on-off ve hız ayarıda yapmam gerekiyo ama bu butonlar için arduinodan bilgi bacağı almam gerekiyor ama nasıl alacağımı çözemedim bana bu konuda yardımcı olursanız çok sevinirim.

    İyi günler..

  11. Fatih ÇIKIKÇI

    Merhaba

    ben bu shield ile iki adet step motoru serial monitor üzerinden verdiğim değişik kordinatlarda gitmesini istiyorum fakat bir türlü başaramadım açıkcası x,y çalışan bir plotter yapmayı planlıyorum. bana bu konuda nasıl bir kod kullanmam gerektiğini söylermisiniz ?

    NOT : L293D sürücü entegresini tek kullanarak tek motoru ileri geri sürmeyi başardım fakat çift motoru süremedim.

  12. alp

    Merhaba, ben iki adet sg90 ve iki adet dc motoru shield üzerinden blueetoothla kontrol etmeye çalışıyorum ancak dc motorlar bağlı iken servoları taktığımda bluetooth enerjisi kesiliyor android uygulamsı çalışmıyor,servoları çıkarıp yeniden başlatınca düzgün çalışıyor
    İkili pil kutusuyla ex pw kısmına da bağladım doğrudan servoyu da besledim yine aynı şekilde oluyor ,bu sorunu nasıl çözebilirim

  13. Enes

    Ya ben yukarıda yazılanlardan bişey anlamadımda. Rica etsem bana anlaşılır örnek bir kod atabilirmisiniz.
    Yalnız birden fazla motoru sürücem hemde hız ayarı yapabilicem.Teşekkürler.

  14. ural

    merhaba ekstra olarak dijital çıkış kullanan renk sensörü kullanmak istiyorum. dijital çıkışlara lehim yapabilir miyim yoksa bu shield dijital çıkışların hepsini kullanıyor mu motorlar için?

    1. Sezgin GÜL

      shield pinlerine lehim yapabilirsiniz. motor sürücü hepsini kullanmıyor. kütüphanedeki c++ dosyasından pin numaralarına bakabilirsiniz. zaten aynı pinleri de kullansanız sorun olmaz ama stabil çalışmasını isterseniz boştaki pinleri kullanmanızda fayda var.

  15. fuat

    merhabalar bahsettıgınız motor shıeld bende de var fakat kulladıgım zaman 9v güç kullanmama ragmen ıkıtane oyuncak motorunu yeterı kadar besleyemıyor bazende 1dk beslıyor guc kesılıyor şimdi arduıno nun uzerıne taktıgımda ledı yanmıyor neden olmuş olabılır.Teşekkrler.

    1. Sezgin GÜL

      Olası Nedenler;
      1- sürücü fazla akım çekiyor olabilmesi durumunda enerji erken bitmiştir
      2- motorları uygun frekansta çalıştırmanız gerekir
      3- batarya olarak kömür piller kullandıysanız çok erken bitiyor.çünkü 350mah akım vermektedir.
      4- motor sürücünün ledi yanmıyor ise kısa devre olabilir veya enerji yetersizliğinden kaynaklı olabilir.
      5- kullandığınız motorun akımı sürücüye uygun olmalıdır. akımı fazla ise sürücüden yeterli akım çekemediğinden tam verimle çalışmaz.

      1. Bilal

        Hocam kütüphane kullanımını ve kurulumunu anlayamadım yardımcı olurmusunuz

        1. Sezgin GÜL

          Tam olarak hangi kısmı anlamadınız ?