L293D ile PIC TABANLI AKILLI ARABA KONTROLÜ

L293D ile PIC TABANLI AKILLI ARABA KONTROLÜ

Günlük hayatta mühendislik uygulamalarında sürekli boy gösteren DC motorlarımızı, bu motorların hız ve yön kontrolünü aynı zamanda motor sürücü kartı tasarlamayı önceki yazılarımızda gördük. Sıra geldi teorileri pratiğe dönüştürmeye ve uygulama yapmaya. Bir arabayı 2 boyutlu uzayda ( X – Y ) her yönde kontrol edebilmek için 2 adet dc motora ihtiyaç duyarız. Yani arabanın sağ tarafı ile sol tarafını birbirinden bağımsız hale getirmeliyiz ki arabamıza sağ ve sol yönde kumanda verebilelim. Tabii ki bu konuda değişik tasarımların olduğu da göz önünde bulundurulmalıdır. Kimi tasarımlar arka tekerlekler ile sadece hız kontrolü yaparken ön tekerleklerde servo ile yön kontrolü yapmaktadırlar. Daha da ilerisi ise her tekerleğe ayrı birer DC motor koyarak bağımsızlık katsayısını artırıp her tekerde hem yön hem de hız kontrolü yapılabilmesidir. Tüm bu tasarımlar ihtiyaca göre değişmekle beraber benim akıllı araba için yaptığım uygulama şekli aşağıdaki fotoğrafta görünmektedir.

akıllı_araba_sağ_sol_motor
akıllı_araba_sağ_sol_motor

Görüldüğü üzere, arabanın sağ kısmı ile sol kısmı birbirinden bağımsızdır (öndeki servo yanıltmasın, kullanım amacı engelden kaçmak için sonar dedektör taraması yapmak). L293D kontrol kartımız var, arabamız da mevcut. O halde sıra geldi kontrole! Mikrokontrolcü olarak 16F628A kullandım. PIC ailesinde orta çapta çözümler için genelde tercih ettiğim bir tümleşik devredir. Sebebi,

  • Dahili osilatörünün olması,
  • Her yerde bulunabilmesi,
  • Ucuz olması ve
  • Smd versiyonunun varlığı diyebilirim. Ama en çok dahili osilatör beni cezbediyor. Dezavantajı ise kesinlikle analog – sayısal çevirici içermemesi.

PIC ile ilgili detaylara çok fazla girmeden genel olarak araba kontrolünden bahsetmek istiyorum. Aşağıda arabaya 2 boyutta mümkün olan her hareketi yaptırmak için gereken motor kontrolleri diyagramı eklenmiştir.

akaba_akıllı_araba_akış_şeması

Diyagramda toplamda 6 adet hareket tanımlanmıştır. Bunlar,

  • İLERİ
  • GERİ
  • İLERİ SAĞ
  • İLERİ SOL
  • GERİ SAĞ
  • GERİ SOL

Arabanın ileri hareketini sağlamak için her iki motorunda saat yönünde ya da saat yönünün tersi yönde eşit hızda dönmeleri gerekmektedir. Benim durumumda bu saat yönündedir. Geri yönde hareket için ise motorun saat yönünün tersi yönünde dönmesi gerekir. İleri sağ harekette ise, sol taraftaki motor saat yönünde dönerken sağ taraftaki motor durmaktadır. Böylece oluşan kuvvet farkı arabayı ileri sağ yöne doğru yönlendirecektir. İleri solda ise bu sefer sağ motor saat yönünde dönerken sol motor durma konumundadır. Geri sağda ise (genelde ek özellik olarak düşünebilirsiniz), sol motor saat yönünün aksi yönünde dönerken sağ motor hareketsizdir ve son olarak geri solda, sağ motor saat yönünün aksi yönünde dönerken sol motor durmaktadır. Diyagramdaki -1 saat yönünün tersini, +1 ise saat yönünü işaret etmektedir.

Şimdi de gerekli kodu nasıl yazacağımıza bakalım. Her ne kadar yazının başlığında PIC tabanlı desem de size verdiğim kod birden fazla kontrolcü de kullanılabilir. Kodumuzda öncelik olarak motorlarımızı hangi pinlerden kontrol edeceğimizi belirtiyoruz. Bunu #define ile belirtiyoruz ki RA0 gibi pin numarasını yazmaktansa bize anlaşılır gelen sözcükleri kullanabilelim. Motorları hangi pinlerden kontrol edeceğimizi belirledikten sonra ileri, geri, sağ, sol ve durma işlemlerini tanımlıyoruz. Unutulmamalıdır ki, kontrolcü ile motor sürmek için pinlerimizin tipini çıkış olarak tanımlamak gerekmektedir. Bunu da örnek olması açısından mcu_init fonksiyonu içerisinde yazdım. Bu fonksiyonu main  fonksiyonundan çağırmalıyız. Sonrasında ise motor_control isimli motor kontrol fonksiyonunu görüyoruz. Yukarıda anlatılanları ve diyagramı kullanarak bunları C dilinde MikroC PRO for Pic ortamında kodluyoruz. Fonksiyon içerisine parametre olarak daha önceden tanımlanan ileri, geri gibi yönleri almakta ve if – else  ler ile işleyerek ilgili motorun kontrolü için pinler aracılığıyla L293D ye komut göndermektedir. Bu fonksiyon için aslında switch – case yapısı da oldukça uygundur.

/* PIC Based L293D Controlled Car       */
/* Motor Control Functions              */
/* akabamuhendislik.com                 */
/* Author : Aziz KABA                   */
/* Updated: 09/03/2016                  */
/* for info: akabamuhendislik@gmail.com */
/* TURKEY                               */


#define m11 RA0_bit
#define m12 RA1_bit
#define m21 RA2_bit
#define m22 RA3_bit


#define  forward 1
#define backward 2
#define left     3
#define right    4
#define stop     5

void mcu_init(void);
void motor_control(char directions);

/***********************ANA FONKSİYON BLOĞU (MAIN)********************************/
void main ()
{
       mcu_init();
       
       while(1)
                  {
                       motor_control(forward);
                       delay_ms(500);
                       motor_control(right);
                       delay_ms(100);
                       motor_control(forward);
                       delay_ms(500);
                       motor_control(left);
                       delay_ms(100);
                       motor_control(backward);
                       delay_ms(500);
                       motor_control(stop);
                  }
       
}

/***********************MCU İLK AYAR FONKSİYONU********************************/
void mcu_init(void)
{
portb = 0;      // portb yi sıfırla
porta = 0;      // porta yı sıfırla
cmcon = 0x07;   // Analog Komparatör ler kapalı
trisa = 0x00;      // hepsi çıkış all output
}

/***********************MOTOR KONTROL FONKSİYONU*******************************/
void motor_control (char direction)
{

     if(direction==forward)
      {
        m11 = 1;
          m12 = 0;
          m21 = 1;
        m22 = 0;
      }

    else if(direction==backward)
      {
        m11 = 0;
           m12 = 1;
           m21 = 0;
        m22 = 1;
      }

     else if(direction==left)
      {
          m11 = 1;
            m12 = 0;
            m21 = 0;
          m22 = 1;
      }
      
      else if(direction==right)
      {
          m11 = 0;
            m12 = 1;
            m21 = 1;
          m22 = 0;
      }
      
     else if(direction==stop)
      {
          m11 = 0;
            m12 = 0;
            m21 = 0;
          m22 = 0;
      }
}

İster yukarıda verilen fonksiyonlar ve anlatım sayesinde, gerekli yerleri kopyalayıp kendi kodunuza ekleyerek arabanızın ya da dc motorunuzun kontrolünü sağlayabilir isterseniz github sayfamdan kodu ve hex dosyasını indirerek işlemcinizi direk olarak programlayabilirsiniz.

Gömülü kod yazarken, yazdığınız kodu fonksiyonlar halinde yazmalı ve eğer fonksiyonlarınız genelleştirilebiliniyorsa da kesinlikle kütüphane olarak ayrılmalıdır. Böylece hem open – source ( açık kaynak ) dünyasına güzel bir katkıda bulunabilir hem de aynı kodu çok kere yazmak yerine bir kez yazıp istediğimiz kadar çağırabiliriz ki bu da düşük bütçeli projelerde kullandığımız mikrokontrolcüler için fazladan ROM ( program belleği ) kazancı demektir. Buna bir de yazdığımız fonksiyonu başka projelerde kullanma olasılığımız eklenince fonksiyonların ne kadar yararlı olduğunu söylemeye gerek kalmıyor. Yazdığımız kodu tekrar kullanmak derken, kod satırlarına eklenmesi gereken yorumlardan bahsetmeden olmaz! Kodun anlaşılması, başkaları tarafından çalışılması ya da aradan zaman geçince tekrar kullanılması için yorum olmazsa olmazdır!

Son olarak ta aşağıda sizler için eklediğim görsel yer almakta. Bu görselde, akıllı arabanın yukarıda tanımladığım her yöndeki hareketinin güzel bir gösterisini bulacaksınız.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir