Merhaba Arkadaşlar...
Öncelikle niçin motorları mikrokontrolcülerimize direk bağlayıp süremiyoruz da motor sürücleri kullanmamız gerekiyor? Ona değinelim... Arduino gibi bir mikrokontrolcünün giriş çıkış pinleri maksimum pin başına 50mA akım sağlayabiliyor. Buda motorların çalışması için yeterli değil. (Küçük Motorlar dışında) Buna rağmen Arduino'ya güçlü bir motor bağlayıp sürmeye çalışırsanız motor aşırı akım çekerek Arduino'ya hatta PC'nize zarar verebilir. İşte bu sorunu motor sürücüler çözüyor.. Motora sağlanacak akımı bir dış güç kaynağından almanızı buna rağmen motoru Arduino ile kontrol edebilmenizi sağlıyor. Bu dış güç kaynağı bir pil olabilir.
Birazda L298N (Motor Sürücüsü) 'ne değinelim birazda. Aynı anda iki motoru birbirinden bağımsız olarak sürebiliyor. O yüzden buna çift kanallı motor sürücü diyoruz. Piyasada tek, çift ve daha fazla kanallı motor sürücüleri mevcuttur. Bu sürücüler motorlara 5 ile 46 Volt arası güç kanal başına 2 Amper akım sağlayarak onları sürebiliyor. Tam kapasitede çalışınca haliyle oldukça ısınan parçalar bunlar.. Bu yüzden etkili bir şekilde soğutulmaya ihtiyaç duyar.
L298N i çalıştırmamız için H-Köprüsü dediğimiz bir devreye ihtiyacımız olacak. Bunu manuel olarak hazırlamamız gerekecek. H-Köprüsü dediğimiz özellik motor sürücünün bir motoru hem ileri hemde geri sürebilmesi sağlıyor. Bu köprüyü kendimizde yapabiliriz. Ama biz bunla uğraşmayıp L298N'in bir kart haline getirilmiş H-Köprüsü devresi hazırlanmış kullanımı pratikleştirilmiş versiyonunu kullanacağız.
Bu kartında kalbinde L298N motor sürücü bulunuyor. Farkıysa karta bağlanıptüm girş ve çıkışlar hazırlanıp etiketlenerek sunulmuş. Ek olarak sürücüye bir soğutucu takılarak ısınma problemi ortadan kaldırılmış.
L298 entegresiyle motor sürücü kartının yapımı
L298 entegresinde 15 adet pin bulunmaktadır. Bu pinlerden bazıları motorlara, bazıları Arduino'ya bazıları ise besleme kaynağına bağlanacaktır. L298 entegresinin pinleri aşağıdaki resimde gösterilmiştir.
Entegre üzerinde bulunan pinlere ve bu pinlerin görevlerine kısaca göz atalım:
- INPUT 1, 2, 3 ve 4 (5, 7, 10 ve 12. pinler): INPUT pinleri motorların dönme yönünün kontrolü için Arduino'ya bağlanır. INPUT 1 ve 2 pinleri 1. motorun, INPUT 3 ve 4 pinleri ise 2. motorun kontrolünde kullanılır. Örneğin 1. Motorun kontrolü için, INPUT 1 pini 5 volt, INPUT 2 pini 0 volt yapılır ise motor ileri yönde dönmeye başlar. Eğer INPUT 1 pini 0 volt ve INPUT 2 pini 5 volt yapılır ise motor geri yönde dönmeye başlar. İki pinin aynı anda 5 volt olması motoru kilitleyerek fren yapmasını sağlar. İki pininde 0 volt düzeyinde olması ise motorun boşta olmasına neden olup kısa süre sonra motorun durmasını sağlar.
- OUTPUT 1, 2, 3 ve 4 (2, 3, 13 ve 14. pinler): Bu pinler motorlara bağlanan pinlerdir. OUTPUT 1 ve 2. pinler 1. Motora, OUTPUT 3 ve 4. pinler ise 2. motora bağlanır.
- ENABLE A ve ENABLE B (6. ve 11. pinler): Bu iki pin motorların dönüş hızını ayarlamak için kullanılır. Bu yüzden bu pinleri Arduino'nun PWM ayaklarına bağlamamız gerekir. PWM sinyalinin görev zamanına göre motorun hızı arttırılabilir veya azaltılabilir. ENABLE A pini 1. motorun, ENABLE B pini ise 2. motorun hızını kontrol etmek için kullanılır. Eğer hız kontrolü yapılmayacak sa bu pinler 5 volt hattına bağlanabilir.
- VSS (LOGIC SUPPLY voltAGE – 9. pin): Adından da anlaşıldığı gibi bu pinin 5 volta bağlanması gerekmektedir. Devrenin kararsızlığını azaltmak için bu pinle toprak arasına 100nF'lık kondansatör bağlanabilir.
- GND (8. pin): Besleme hattının devreyi tamamlayabilmesi için bu pin toprak hattına bağlanması gerekir. Ayrıca entegrenin üzerindeki demir de GND pinine bağlıdır. Bu metalin devre kurulumunda yanlış pinlere değip kısa devre yapmamasına özen göstermek gerekir.
- VS (4. pin): Entegrenin motorlara vereceği enerjiyi aldığı ana besleme hattıdır. Bu hatta bağlanacak enerji kaynağı motorlara verileceği için, motorlarımızın özelliğine göre besleme gerilimi kullanmalıyız. Genellikle bu hatta 7 ila 12 volt arasında besleme kaynakları bağlanmaktadır.
Motor sürücü bağlantısını aşağıdaki gibi yapınız.
Arduino | Motor Sürücü |
8 | INPUT 1 |
9 | INPUT 2 |
13 | INPUT 3 |
12 | INPUT 4 |
11 | ENABLE A |
10 | ENABLE B |
Motor | Motor Sürücü |
Motor1 + | OUTPUT 1 |
Motor1 - | OUTPUT 2 |
Motor2 + | OUTPUT 3 |
Motor2 - | OUTPUT 4 |
Besleme | Motor Sürücü |
+12 Volt | VCC |
Toprak (-Uç) | GND |
+5 Volt | Vs |
int DonmeHizi = 175;
/* bu değişken ile motorların dönme hızı kontrol edilebilir */
/* motor sürücüsüne bağlanacak INPUT ve ENABLE pinleri belirleniyor */
const int sagileri = 9;
const int saggeri = 8;
const int solileri = 12;
const int solgeri = 13;
const int solenable = 11;
const int sagenable = 10;
void ileri(int hiz){
/* ilk değişkenimiz sag motorun ikincisi sol motorun hızını göstermektedir.
* motorlarımızın hızı 0-255 arasında olmalıdır.
* Fakat bazı motorların torkunun yetersizliğiniden 60-255 arasında çalışmaktadır.
* Eğer motorunuzdan tiz bir ses çıkıyorsa hızını arttırmanız gerekmektedir.
*/
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,HIGH); /* ileri dönme sağlanıyor */
digitalWrite(saggeri,LOW); /* ileri dönme sağlanıyor */
analogWrite(solenable, hiz); /* sol motorun hız verisi */
digitalWrite(solileri, HIGH); /* ileri dönme sağlanıyor */
digitalWrite(solgeri,LOW); /* ileri dönme sağlanıyor */
}
void sagaDon(int hiz){
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,LOW); /* geri dönme sağlanıyor */
digitalWrite(saggeri,HIGH); /* geri dönme sağlanıyor */
analogWrite(solenable, hiz); /* sol motorun hız verisi */
digitalWrite(solileri, HIGH); /* ileri dönme sağlanıyor */
digitalWrite(solgeri,LOW); /* ileri dönme sağlanıyor */
}
void solaDon(int hiz){
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,HIGH); /* ileri dönme sağlanıyor */
digitalWrite(saggeri,LOW); /* ileri dönme sağlanıyor */
analogWrite(solenable, hiz); /* sol motorun hız verisi */
digitalWrite(solileri, LOW); /* geri dönme sağlanıyor */
digitalWrite(solgeri,HIGH); /* geri dönme sağlanıyor */
}
void geri(int hiz){
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,LOW); /* geri yönde dönme sağlanıyor */
digitalWrite(saggeri, HIGH); /* geri yönde dönme sağlanıyor */
analogWrite(solenable, hiz); /* sol motorun hız verisi */
digitalWrite(solileri, LOW); /* geri yönde dönme sağlanıyor */
digitalWrite(solgeri, HIGH); /* geri yönde dönme sağlanıyor */
}
void dur()
{
/* Tüm motorlar kitlenerek durma sağlanıyor */
digitalWrite(sagileri, HIGH);
digitalWrite(saggeri, HIGH);
digitalWrite(solileri, HIGH);
digitalWrite(solgeri, HIGH);
}
void setup(){
/* motorları kontrol eden pinler çıkış olarak ayarlanıyor */
pinMode(sagileri,OUTPUT);
pinMode(saggeri,OUTPUT);
pinMode(solileri,OUTPUT);
pinMode(solgeri,OUTPUT);
pinMode(sagenable,OUTPUT);
pinMode(solenable,OUTPUT);
}
void loop(){
ileri(DonmeHizi);
delay(1000);
dur();
delay(1000);
solaDon(DonmeHizi);
delay(1000);
dur();
delay(1000);
sagaDon(DonmeHizi);
delay(1000);
dur();
delay(1000);
geri(DonmeHizi);
delay(1000);
dur();
delay(1000);
}
Yukarıdaki kodla motorlar dönmeye başlamalıdır. Eğer motorların dönmesinde bir sorun var ise, öncelikle kablo bağlantılarınızı gözden geçiriniz. INPUT pinleri hatalı bağlanmış olabilir, birbiri arasında yerlerini değiştirmeyi deneyebilirsiniz. Motorun ileri yönde dönmesi beklenirken geri yönde dönüyorsa motor bağlantılarının yerini değiştirebilirsiniz.Bu bölümde Arduino ile DC motor kontrolünün nasıl yapıldığını öğrenmiş olduk. Motor kontrolü için gereken motor sürücülerin türlerini ve kendimiz nasıl motor sürücü yapacağımızı da öğrendik. Artık hareket gerektiren projelerimizde motor sürücüler yardımıyla DC motorlarımızı kullanabiliriz.
Not: H Köprüsü DC motorların ileri ve geri yönde hareket etmesini sağlayan devredir. Devrede 2 adet NPN ve 2 adet PNP transistör bulunur.
H Köprüsü ile ilgili detaylı bilgi için tıklayınız.