28 Mart 2024 Perşembe

Arduino ile araba yapmak

Bu yazıda arduino ile basit bir araba nasıl yapılırı işleyeceğiz. Araba aşama aşama kurulacak ve aşamalı bir şekilde ilerleteceğiz. 

Bu araba için hazır olan bir platform kullanacağız. Bu platform yukarıdaki fotoğrafta da görüldüğü gibi şeffaf plastiklerden oluşan bir gövde. Sarı-gri renkli olan bileşenler DC motor ve bunlara bağlı tekerlekler mevcut. Ön tarafta sarhoş tekerlek olarak bilinen sabit bir tekerlek mevcut.
Öncelikle çok basit mantık üzerinden bu arabayı anlayalım. Arabadaki 2 motora aynı anda güç verilince 2 motor da hareket eder ve araba ilerler. Motorların bağlantıları ve yönlerinin başlangıçta düzgün bir şekilde takıldığından emin olduğumuzu bilmek gerekir. Bunun için gerekirse deneme yanılma yapılır. 
2 motordan biri durup diğeri çalışıyorsa araba duran motor yönüne hareket eder. Bu mantık su üstündeki bir sandalda da geçerlidir. Hangi taraftaki küreği çekmeye bağlarsanız çekilmeyen kürek yönüne hareket eder.

Gelelim motorları çalıştırmaya; yukarıdaki motor DC Motor olarak bilinen 2 ucuna + ve - olarak 3-6 volt civarı güç verilerek çalışan bir motordur. Yukarıdaki resimden de anlaşılacağı üzere + ve - yönler motorun ucundaki pim'in dönme yönünü etkiliyor. Kırmızı renkle belirtilen şekilde bir uca + ve - verdiğimizde motor piminin kırmızı yönde döndüğünü, girişleri mavi renkle belirtildiği şekilde güçle beslediğimizde ise pimin kırmızıya ters olarak döndüğünü görüyoruz. Bu durum bu basit motorların çalışma prensibini anlatmaktadır. Bu şekilde ters yönde çalıştırmak motorlar vasıtasıyla tekerleklerin ileri ya da geri dönmesini sağlayacaktır.

Bu motorun bir ucunu Arduino'da 3 numara bir ucunu da 4 numaraya bağladığımızı düşünelim. + için HIGH, - için de LOW kullanmalıyız.
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
komutlarıyla motora güç verdiğimizi düşünürsek motor belirli bir yönde döner. Bunun tam tersi yani;
digitalWrite(3,LOW);
digitalWrite(4,HIGH); 
komutlarını verirsek motor bir öncekinin ters yönünde hareket eder. Eğer motoru durdurmak istersek 2 uçta da LOW komutunu aşağıdaki gibi kullanmalıyız.
digitalWrite(3,LOW);
digitalWrite(4,HIGH); 

Fakat burada işler bu kadar da kolay olmuyor. Çünkü Arduino pinlerinden doğrudan motoru bağlayarak çalıştırmak istersek motorlar hareket etmez. Çünkü Arduino'nun verdiği elektrik gücü motorları çevirmeye yetmemektedir. Yani mantık doğru bile olsa uygulamada bu sorun yaratacaktır. Bu yüzden Arduino pinlerini önce güçlendirmek için bir elektronik karta bağlarız. Bu kartlara motor sürücü kartlar denir. Yukarıdaki fotoğrafta kırmızı renkli olan karttır. Bu kart 2 tane motoru kontrol edebilecek şekilde dizayn edilmiştir. Bu kartın adı L298N motor sürücü kartıdır.
Yukarıdaki şekilde motor sürücü kartı olan L298N kartının Arduino ile olan bağlantısı gösterilmiştir. Arduino'dan çıkan 4 uç 2 motoru simgeler. Bu 4 uç L298N kartındaki IN1,IN2,IN3,IN4 girişlerine bağlanır. Bu örnekte Arduinodaki 7 ve 6. çıkışlar bir motoru, 5 ve 4 nolu çıkışlar ise bir motoru simgeler. L298N kartının 1,2 girişleri şekildeki yukarıdaki motora bağlanan OUT1 ve OUT2 ile 3 ve 4 girişleri ise şekildeki aşağıda bulunan motora OUT3 ve OUT4 ile bağlantılıdır. Ayrıca karta dışarıdan 9 voltluk pil ile bir besleme yapılır ve bu besleme uçlarından şekilde yeşil ve kahverengi kablolar ile Arduino'ya aktarma yapılır. Yani Arduionun GND ucu ile L298N kartının - ucu birleşir. L298N üzerindeki 5 volt bağlantısı Arduino'nun Vin girişine bağlanarak Arduino'ya da çalışması için güç verilmiş olur. 

Yukarıdaki bağlantıyı yaptıktan sonra daha önce bahsettiğimiz gibi digitalWrite komutları ile motorlara enerji verilerek tekerleklerin dönmesi sağlanır ve arabayı ilk kez hareket ettirmiş oluruz. 

void setup() {
pinMode(4,OUTPUT);//1.motorun bir ucu
pinMode(5,OUTPUT);//1.motorun bir ucu
pinMode(6,OUTPUT);//2.motorun bir ucu
pinMode(7,OUTPUT);//2.motorun bir ucu
}

void loop() {
delay(1000); //ilk başladığında 1 saniye bekler
// 2motor da çalışır
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
delay(1000);
//ilk motor çalışmaz 2. motor çalışır
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
delay(1000);
//ikinci motor çalışmaz 1. motor çalışır
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
delay(1000);
}

Yukarıdaki kodlar ile bu hareket basit bir hareket olacak ve aşağıdaki videoda bu hareket gerçek görüntülerini izleyebilirsiniz. Önce 1 saniye ileri gider, sonra bir motor 1 saniye durur ve bir yöne hareket daha sonra diğer motor durur ve ilk olarak duran motor yeniden çalışır ve bu sefer ters yönde hareket eder.


Yukarıdaki işlemlerde motorlara HIGH değeri vererek maksimum sabit hız verdik. Şimdi bu hızı kontrol etme ya da herhangi bir motoru kontrol etmek için motor sürücü kart üzerinde bulunan Enable adı verilen pinler ile motorları kontrol edeceğiz.

Yukarıdaki görselde görüldüğü üzere Arduino'da 9 ve 10 numaralı pinlerden çıkan pembe ve mor kablolar motor sürücü kartta enable adı verilen uçlara takılmıştır. Mor renkli olan 1 numaralı motoru kontrol edecek, pembe renkli olan ise 2 numaralı motoru kontrol edecektir. Yani motor sürücü kartı motoru kontrol edecektir.

Hatırlayalım! Motoru çalıştırmak için 2 pinden biri HIGH diğeri de LOW olmak zorundaydı. Motoru durdurmak için iki pine de LOW göndermek gerekir. 

İşte burada enable olarak adlandırdığımız kontrol pinleri devreye giriyor.

digitalWrite(9,HIGH); //kontrol pini
digitalWrite(4,HIGH);
digitalWrite(5,LOW);

Yukarıdaki kodlarda 4 ve 5 numaralı pinlerden motora HIGH ve LOW giderek motor çalışır. 9 numaralı pin ise o motoru kontrol eden enable pinidir. Bu pine HIGH değeri verirsek motor aktif olur. Fakat LOW değeri verirsek 4 ve 5 deki değerlere bakılmaksızın motor pasif olur çalışmaz. Yani bu kontrol pinleri ile HIGH ve LOW değerlerini vererek motoru aktif ya da pasif yapabiliriz. Yani daha önce yaptığımız gibi motoru durdurmak için 4 ve 5 numaralı pinlere aynı anda LOW değeri vermeye gerek kalmaz. Yani aşağıdaki kodlarda görüldüğü üzere 4 ve 5 pinlerinde HIGH ve LOW olmasına rağmen kontrol pinine LOW değeri verildiği için bu motor pasif olur çalışmaz.

digitalWrite(9,LOW); //kontrol pini
digitalWrite(4,HIGH);
digitalWrite(5,LOW);

ARABAYI HIZLANDIRIP YAVAŞLATMA?

Buraya kadar motorlara sadece LOW ve HIGH değeri vererek tek bir hızda gitmesini sağladık. Fakat biraz yavaş, biraz hızlı, çok hızlı, çok yavaş gitmek gibi kavramları bu araba üzerinde işlemek için kontrol pinlerine farklı değerler vererek bu durumu anlayalım.

LOW ve HIGH değerleri digitalWrite komutu ile verilmektedir. Farklı değerler verme işlemi ise analogWrite komutu ile olmaktadır. Arduino'da bazı pinlerin önünde ~ işareti vardır. Bu pinler analog olarak da kullanılmaktadır. Bu pinlere 0-255 arası değer verilebilmektedir. Bu durumda 0, LOW gibi, 255 ise HIGH gibi algılanabilir. Yani motora 255 değeri verirsek en hızlı dönüşü yapar. 0 verirsek motor çalışmaz.

analogWrite(9,125); //1 nolu motor kontrol pini bu sefer analogWrite ile
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
analogWrite(10,125); //2 nolu motor kontrol pini bu sefer analogWrite ile
digitalWrite(6,HIGH);
digitalWrite(7,LOW);

Yukarıdaki kodlarda 125 değeri verilerek (255 en üst hız 125 ise yaklaşık yarısı) orta değerde bir hız ile her iki motorun da hareket etmesi sağlanır. Kısaca özetlemek gerekirse motor kontrol pinlerine analog değerler verilerek hız kontrolü yapılabilir. Şimdi son olarak kademeli hızlanma ve yavaşlamayı nasıl yaparız bunun üzerinde çalışalım.

Kademeli kelimesi ile belirli bir sürede artış ya da azalıştan kastediliyor. Bu durumda bir döngü kullanıp hızı arttırmak ve yavaşlatmak lazım. bu konuda bize for döngüsü yardımcı olur. for döngüsünün başlangıç ve bitiş değerlerine değişim miktarı da eklenerek tam istediğimiz yapı elde edilir.  for döngüsünün detaylarını  daha önce işlediğimiz konulardan for döngüsü ile kara şimşek örneğine buraya tıklayarak buraya tıklayarak inceleyebilirsiniz. Aşağıdaki arduino kodlarında hızlanma ve yavaşlama yapılmıştır.

void setup() {
pinMode(10,OUTPUT);//2.motorkontrol
pinMode(9,OUTPUT);//1.motorkontrol
pinMode(4,OUTPUT);//1.motorun bir ucu
pinMode(5,OUTPUT);//1.motorun bir ucu
pinMode(6,OUTPUT);//2.motorun bir ucu
pinMode(7,OUTPUT);//2.motorun bir ucu
}

int a;
void loop() {
for (a=1;a<=255;a++)
{
  analogWrite(9,a);
  analogWrite(10,a);
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  delay(20);  
  }
for (a=255;a<=0;a=a-5)
{
  analogWrite(9,a);
  analogWrite(10,a);
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  delay(100);  
  }
}
Hızlanma 1'den 255'e birer artarak oluyor. Yani o döngü 255 defa dönecek. O döngüde sona eklenen 20 ms bekleme. 255x20=5100ms yani 5 saniye civarı olarak 0'dan 255'e hızlanmayı 5 saniyede yapacak. Yani döngünün sayısını bilip bu ekleyeceğimiz zamana göre süreyi ayarlayabiliriz.

Yavaşlama ise 255'den 0'a beşer azalarak oluyor. Bu da döngünün 51 defa döneceğini gösteriyor. Sona eklenen zaman 100 olduğu için 5100 ms yani 5 saniye gibi bir zamanda yavaşlayacağını gösteriyor.

Kısacası döngünün sayısı ve zaman değerlerini değiştirerek yavaşlama hızlanma sürelerini belirleyebiliriz.

Not: Motor kontrol pinine verilen 5, 10, 15 gibi bazı düşük değerlerde motor dönmeyebilir.




  




Hiç yorum yok:

Yorum Gönder