Bu uygulamada iki adet buton üzerinden DC MOTOR hız kontrolü sağlanacaktır.

Uygulamada H köprü görevini görmek üzere oldukça kullanışlı olan L293D motor sürücü tüm devresi (entegresi-integrated circuits) kullanılmıştır.
Peki nedir H köprü?

H köprü DC motorların yönünün değiştirilmesi için kullanılan bir devredir. Bir DC Motorun yönünü değiştirmek için kutuplarının değiştirilmesi gerekmektedir. Yani, iki bacağına verdiğimiz + ve - kutuplar değişirse DC motor da yön değiştirir. Bu yön değiştirme işini yapan H köprü entegreleri bulunmaktadır. L293D bunlardan biridir.

DC motorların hızını değiştirmek için bacaklarına verilen gerilimi arttırmak veya azaltmak gerekir. Verilen gerilimle DC motor hızı doğru orantılıdır. Arduino UNO üzerinden PWM (Pulse Width Modulation) kullanılarak 0 ila 5V arasında oluşturulan gerilimler (analogWrite ile) L293D girişlerine uygulanır.

L293 D nin bacak yapısı ve görevleri aşağıdaki gibidir.



Bacak İsmi İşlevi
in1, in2 Out1 ve Out2 çıkışlarına bağlanan motoru kontrol eder.
in3,in4 Out3 ve Out4 çıkışlarına bağlanan motoru kontrol eder.
En1, [1 de yani 5V’ da etkin] Out 1-2’ de ki motoru aktif eder.
En2, [1 de yani 5V’ da etkin] Out 1-2’ de ki motoru aktif eder.
Vss Entegredeki dijital işlemler için 5V girişi
Vs Motoru besleyecek harici gerilim
(4,5V-36V arası)
GND Toprak hatları veya ortak uç bağlantısı.

Çalışmasını bir doğruluk tablosunda gösterecek olursak:
in1 in2 in3 in4 Out1-2 Out3-4
0 0 0 0 Motor1 dönmez. Motor2 dönmez.
0 1 0 1 Motor1 sola döner (örneğin) Motor2 sola döner (örneğin)
1 0 1 0 Motor1 sağa döner (örneğin) Motor1 sağa döner (örneğin)
1 1 1 1 Motor1 dönmez. Motor2 dönmez.
Motor hızları değiştirilecekse, PWM destekli Arduino Uno çıkışları kullanılarak analogWrite(in1,127); gibi kodlamalar ile kullanmak gerekmektedir.

H köprü entegresi L293D kullanmadan motorun yönünü değiştirmek istemiyorsanız bu konuya göz atmanız gerekmektedir. Transistörlü H köprü yapımı.
DEVRE ŞEMASI

A0’ a basıldığında bir gönderen arttırma butonu, A1’ e ise basıldığında bir gönderen azaltma isimli butonlar bağlanmıştır. L293 Motor sürücü entegrenin in1 bacağı 11 nolu pwm destekli çıkışa, in2 bacağı ise 10 nolu pwm destekli çıkışa bağlanmıştır. Yön değişikliği hedeflenmediği için bu uygulamada sadece analogWrite komutu ile PWM tekniği kullanılarak in1 çıkışına 0 ila 5V arasında değişen değerler gönderilecektir. analogWrite komutu ile PWM destekli bacaklara 0 ila 255 arasında değerler gönderilerek, 0 ila 5 V arasındaki değerler elde edilmektedir. Örneğin analodWrite(in1,127); komutu in1 çıkışına yaklaşık 2.5V gönderecektir. Bu da out1-2 ye bağlı motorun yarım hızda dönmesine olanak sağlayacaktır. Bu işlemler esnasında in2 bacağına ise sürekli 0V (digitalWrite(in2,LOW);) gönderilecektir. Doğruluk tablosuna göre yön değişikliği istenseydi aktif giriş in1 değil in2 olarak alınacaktı.


Aşağıda açıklamaları ile birlikte kodları bulabilirsiniz:

Kod:
#define hizlan A0 //A0' a hizlan butonu bağlandı.
#define yavasla A1 //A1' e yavasla butonu bağlandı.
int in1 = 11, in2 = 10; //in1 ve in2 değişkenlerinin değerleri 11 ve 10 olarak ayarlandı.
int surat = 0; // 0 dan başlayarak 250 ye kadar değişecek surat değişkeni ayarlandı. 25' er artırmayı hedefledik.
void setup() {
  pinMode(hizlan, INPUT); //bacakların giriş çıkış olarak ayarlanması yapıldı.
  pinMode(yavasla, INPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  digitalWrite(in2, LOW); //in2 bacağına bir seferlik olmak üzere 0 bilgisi gönderildi. [Setup () içerisinde kodlar bir kez çalıştırılır.]
}


void loop() {


  int art = digitalRead(hizlan); //A0 girişi okundu ve art değişkenine aktarıldı.
  int azal = digitalRead(yavasla); //A1 girişi okundu ve azal değişkenine aktarıldı.
  if (art == 1) //art değişkeni bir ise
  {
    while (digitalRead(hizlan)); //A0 butonundan el çekilene kadar bekle. "Başka bir deyişle: A0 butonu bir olduğu sürece burada dur." anlamı taşır.
           if (surat == 250) //surat 250 ise
    {
      surat = 250; //surat 250 kalsın. analogWrite komutuna en fazla 255 yazılabiliyor. Bu yüzden 250 de bırakıyoruz.
      analogWrite(in1, surat); //in1 bacağına surat değişkenini analog olarak aktar.
      }
      else //surat 250 değilse
      {
        surat = surat + 25; //surat değişkenini 25 arttır.
        analogWrite(in1, surat); //in1 bacağına surat değişkenini analog olarak aktar.
      }
  }
  if (azal == 1) //azal değişkeni bir ise
  {
    while (digitalRead(yavasla)); //A1 butonundan el çekilene kadar bekle. "Başka bir deyişle: A1 butonu bir olduğu sürece burada dur." anlamı taşır.
           if (surat == 0) //surat 0 ise
    {
      surat = 0; //surat 0 kalsın. analogWrite komutuna en az 0 yazılabiliyor. Bu yüzden 0 da bırakıyoruz.
      analogWrite(in1, surat); //in1 bacağına surat değişkenini analog olarak aktar.
      }
      else //surat 0 değilse
      {
        surat = surat - 25; //surat değişkenini 25 azalt.
        analogWrite(in1, surat); //in1 bacağına surat değişkenini analog olarak aktar.
      }
  }
}