Arduino L298N Motor Sürücü Kullanımı

Arduino L298N motor sürücü kullanımı, robot projelerinden, maket rc arablara kadar geniş kullanım alanına sahiptir. Arduino veya PIC gibi bir mikrodenetleyici kullanarak bir LED’i açıp kapatabilirsiniz. Çünkü genel olara pinlerden gelen 20mA akım LED yakma gibi işlemler için yeterlidir. Fakat, motor gibi çok daha fazla akım gerektiren yükleri sürmek için tek başına mikrodenetleyici pinleri yeterli olmaz. L298N motor sürcüsünün devreye girdiği yer burasıdır.

DC motorun hızını, motora giden giriş voltajını basitçe kontrol ederek kontrol edebiliriz ve bunu yapmanın en yaygın yöntemi PWM sinyali kullanmaktır.

Bu içeriğimizde, birden fazla L298N kullanım örneği göreceksiniz, eğer takıldığınız bir yer olursa bize ulaşmaktan çekinmeyin!

PWM DC Motor Kontrolü

PWM veya darbe genişlik modülasyonu, gücü hızlı bir şekilde açıp kapatarak elektronik cihaza giden voltajın ortalama değerini ayarlamamızı sağlayan bir tekniktir. Ortalama voltaj, görev döngüsüne(duty cycle) veya sinyalin AÇIK olduğu süreye karşı sinyalin tek bir zaman diliminde KAPALI olduğu süreye bağlıdır.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Ayrıca daha önce hazırladığımız PWM ile DC Motor Kontrolü yazımıza bakmanızı öneriyoruz.

Motorun boyutuna bağlı olarak, basitçe bir Arduino PWM çıkışını transistörün tabanına veya bir MOSFET’in kapısına bağlayabilir ve PWM çıkışını kontrol ederek motorun hızını kontrol edebiliriz. Düşük güçlü Arduino PWM sinyali, yüksek güçlü motorun sürüldüğü MOSFET’teki kapıyı açar ve kapatır.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü
PWM Kontrolü

H-Bridge DC Motor Kontrolü

Öte yandan, dönüş yönünü kontrol etmek için, motordan geçen akımın yönünü tersine çevirmemiz yeterlidir ve bunu yapmanın en yaygın yöntemi bir H-Bridge kullanmaktır. Bir H-Bridge devresi, merkezde motor H benzeri bir konfigürasyon oluşturan dört anahtarlama elemanı, transistör veya MOSFET içerir. Aynı anda iki özel anahtarı etkinleştirerek akımın yönünü değiştirebilir, böylece motorun dönüş yönünü değiştirebiliriz.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü
H-Bridge

Dolayısıyla bu iki yöntemi, PWM ve H-Bridge’i birleştirirsek, DC motor üzerinde tam bir kontrole sahip olabiliriz. Bu özelliklere sahip birçok DC motor sürücüsü vardır ve L298N de bunlardan biridir.

L298N Sürücüsü

L298N, aynı anda iki DC motorun hız ve yön kontrolünü sağlayan çift H-Bridge motor sürücüsüdür. Modül, 2A’ya kadar tepe akımı ile 5 ile 35V arasında gerilime sahip DC motorları çalıştırabilir.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü
L298N Sürücüsü

L298N modülünün pin çıkışına daha yakından bakalım ve nasıl çalıştığını açıklayalım. Modül, motor A ve B için iki vidalı terminal bloğuna ve topraklama pini için başka bir vidalı terminal bloğuna, motor için VCC’ye ve giriş veya çıkış olabilen bir 5V pine sahiptir.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Modül, bir jumper kullanılarak etkinleştirilen veya devre dışı bırakılan yerleşik bir 5V regülatöre sahiptir. Motor besleme voltajı 12V’a kadar ise 5V regülatörü etkinleştirebiliriz ve 5V pin çıkış olarak örneğin Arduino kartımıza güç sağlamak için kullanılabiliriz. Ancak motor voltajı 12V’den büyükse, jumper’ı ayırmalıyız çünkü bu voltajlar yerleşik 5V regülatöre zarar verir. Bu durumda, entegrenin düzgün çalışması için 5V’luk bir güç kaynağına bağlamamız gerektiğinden 5V pin giriş olarak kullanılacaktır.

Burada, bu entegrenin yaklaşık 2V’luk bir voltaj düşüşü yaptığını not edebiliriz. Yani örneğin 12V’luk bir güç kaynağı kullanırsak, motor terminallerindeki voltaj yaklaşık 10V olacaktır, bu da 12V DC motorumuzdan maksimum hızı alamayacağımız anlamına gelir.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Enable A ve Enable B pinleri, motorun hızını etkinleştirmek ve kontrol etmek için kullanılır. Bu pin üzerinde jumper varsa motor devreye girecek ve maksimum hızda çalışacaktır ve jumperı çıkarırsak bu pine bir PWM girişi bağlayabilir ve bu sayede motorun hızını kontrol edebiliriz. Bu pini bir GND’ye bağlarsak motor devre dışı kalacaktır.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Input 1 ve Input 2 pinleri A motorunun dönüş yönünü kontrol etmek için kullanılır ve motor B için 3 ve 4 girişleri kullanılır. Bu pinleri kullanarak aslında L298N entegresi içindeki H-Bridge’in anahtarlarını kontrol ederiz. Giriş 1 DÜŞÜK ve giriş 2 YÜKSEK ise motor ileri hareket eder ve bunun terside geçerlidir, giriş 1 YÜKSEK ve giriş 2 DÜŞÜK ise motor geri hareket eder. Her iki girişin de aynı olması durumunda, DÜŞÜK veya YÜKSEK motor duracaktır. Aynısı giriş 3 ve 4 ve motor B için de geçerlidir.

Arduino ile L298N Motor Sürücüsü Kullanımı

İlk örnekte bir potansiyometre kullanarak motorun hızını kontrol edeceğiz ve bir basma düğmesi kullanarak dönüş yönünü değiştireceğiz.

Potansiyometre Olmadan Kontrol Devre Şeması

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Proje Kodu

#define EnA 10
#define EnB 5
#define In1 9
#define In2 8
#define In3 7
#define In4 6


void setup()
{
  pinMode(EnA, OUTPUT);
  pinMode(EnB, OUTPUT);
  pinMode(In1, OUTPUT);
  pinMode(In2, OUTPUT);
  pinMode(In3, OUTPUT);
  pinMode(In4, OUTPUT);
}
void duzcalistirma()   
{
  // motor a çalışsın
  digitalWrite(In1, HIGH);
  digitalWrite(In2, LOW);
  // hızı 150/255 yap
  analogWrite(EnA, 200);
  // motor b çalışssın
  digitalWrite(In3, HIGH);
  digitalWrite(In4, LOW);
  // hızı 150/255 yap
  analogWrite(EnB, 200);
  delay(2000);
  // motorları kapat
  digitalWrite(In1, LOW);
  digitalWrite(In2, LOW);  
  digitalWrite(In3, LOW);
  digitalWrite(In4, LOW);
}
void loop()
{
  duzcalistirma();
  delay(1000);
}

Potansiyometre ve Butonlu Devre Şeması

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Bu örneği yapmak L298N motor sürücüsüne, bir DC motora, bir potansiyometreye, bir butona ve bir Arduino geliştirme kartına ihtiyacımız var.

Proje Kodu

#define enA 9
#define in1 6
#define in2 7
#define buton 4

int yondegistirme = 0;
int butonkontrol = false;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(buton, INPUT);
  // baslangic yönünü ayarlama
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
}

void loop() {
  int potValue = analogRead(A0); // potansiyometre değerini oku
  int pwmOutput = map(potValue, 0, 1023, 0 , 255); // 0-255 arasında map(yerleştir)
  analogWrite(enA, pwmOutput); // Enable pinine pwm sinyali gönder

  // buton okuma ve debounce 
  if (digitalRead(buton) == true) {
    butonkontrol = !butonkontrol;
  }
  while (digitalRead(buton) == true);
  delay(20);

  // butonda değişiklik olursa yön değiştir
  if (butonkontrol == true  & yondegistirme == 0) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    yondegistirme = 1;
    delay(20);
  }
  // butonda değişiklik olursa yön değiştir
  if (butonkontrol == false & yondegistirme == 1) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    yondegistirme = 0;
    delay(20);
  }
}

Kod Açıklaması

Program için gerekli olan pinleri ve bazı değişkenleri tanımlamamız gerekiyor. Kurulum kısmında pin modlarını ve motorun ilk dönüş yönünü ayarlamamız gerekiyor. Döngü bölümünde, potansiyometre değerini okuyarak başlıyoruz ve ondan aldığımız değeri 0 ila 1023 arasında, PWM sinyali için 0 ila 255 arasında bir değerle eşleştiriyoru. Daha sonra analogWrite() işlevini kullanarak PWM sinyalini, aslında motoru çalıştıran L298N kartının Enable pinine gönderiyoruz.

Ardından butona basıp basmadığımızı kontrol ediyoruz. Butona basılırsa Giriş 1 ve Giriş 2 durumlarını ters ayarlayarak motorun dönüş yönünü değiştireceğiz. Basma butonu geçiş butonu olarak çalışacak ve her bastığımızda motorun dönüş yönünü değiştirecektir.

Joystick Motor Kontrol Devre Şeması

Robot ya da araba projelerinde sıklıkla buna benzer bir devre kullanılmaktadır. Sizde aşağıdaki örnek ile kendi robot arabanızı yapabilirisinz.

Devre Şeması

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Tek ihtiyacınız olan 2 DC Motor, L298N motor sürücüsü, bir Arduino kartı ve kontrol için bir joystick. Güç kaynağına gelince, toplam 11V sağlayan üç adet 3.7V Li-ion pil kullanabilirsiniz. Bütün bunları sabitlemek için 3mm kontrplak kullanabilirsiniz.

Analog Çalışma Mantığı

Joystick aslında Arduino’nun analog girişlerine bağlanan ve 0 ile 1023 arasında değerlere sahip iki potansiyometreden yapılmıştır. Joystick merkez konumunda kaldığında her iki potansiyometrenin veya eksenin değeri 512 civarındadır.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Biraz tolerans ekleyeceğiz ve 470 ile 550 arasındaki değerleri merkez olarak kabul edeceğiz. Yani joystick’in Y eksenini geriye doğru hareket ettirirsek ve değer 470’in altına düşerse, dört giriş pinini kullanarak iki motorun dönüş yönünü geriye doğru ayarlayacağız. Ardından, 470’den 0’a düşen değerleri, aslında motorun hızı olan 0’dan 255’e artan PWM değerlerine dönüştüreceğiz.

Proje Kodu

#define enA 9
#define in1 4
#define in2 5
#define enB 10
#define in3 6
#define in4 7

int motorAhizi = 0;
int motorBhizi = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
  int xEkseni = analogRead(A0); // Joystick X eksenini oku
  int yEkseni = analogRead(A1); // Joystick Y eksenini oku

  // İleri ve geri kontrol için kullanılan Y ekseni
  if (yEkseni < 470) {
    // Motor A'yı geriye doğru ayarlar
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Motor B'yi geriye doğru ayarlar
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // 470'ten 0'a geri gitmek için azalan Y ekseni okumalarını motor hızını artırmak için PWM sinyali için 0 ila 255 değerine dönüştür
    motorAhizi = map(yEkseni, 470, 0, 0, 255);
    motorBhizi = map(yEkseni, 470, 0, 0, 255);
  }
  else if (yEkseni > 550) {
    // Motor B'yi geri ayarlar
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Motor B'yi ileri ayarlar
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // 550'den 1023'e ilerlemek için artan Y ekseni okumalarını motor hızını artırmak için PWM sinyali için 0 ila 255 değerine dönüştür
    motorAhizi = map(yEkseni, 550, 1023, 0, 255);
    motorBhizi = map(yEkseni, 550, 1023, 0, 255);
  }
  // Joystick ortada kalırsa motorlar hareket etmez.
  else {
    motorAhizi = 0;
    motorBhizi = 0;
  }

  // Sol ve sağ kontrol için kullanılan X ekseni
  if (xEkseni < 470) {
    // 470'ten 0'a azalan X ekseni okumalarını artan 0 ila 255 değerine dönüştür
    int xMapped = map(xEkseni, 470, 0, 0, 255);
    // Sola hareket - sol motor hızını azalt, sağ motor hızını artır
    motorAhizi = motorAhizi - xMapped;
    motorBhizi = motorBhizi + xMapped;
    // 0 ile 255 arasındaki aralığı sınırla
    if (motorAhizi < 0) {
      motorAhizi = 0;
    }
    if (motorBhizi > 255) {
      motorBhizi = 255;
    }
  }
  if (xEkseni > 550) {
    // 550'den 1023'e artan X ekseni okumalarını 0 ila 255 değerine dönüştür
    int xMapped = map(xEkseni, 550, 1023, 0, 255);
    // Sağa hareket ettir - sağ motor hızını azalt, sol motor hızını artır
    motorAhizi = motorAhizi + xMapped;
    motorBhizi = motorBhizi - xMapped;
    // 0-255 arasında ayarla
    if (motorAhizi > 255) {
      motorAhizi = 255;
    }
    if (motorBhizi < 0) {
      motorBhizi = 0;
    }
  }
  // Düşük hızlarda kontrolü kolaylaştırır (Motorlarınıza göre ayarlayın. PWM değeri 70'in altına düştüğünde motorlar harekete geçmiyor)
  if (motorAhizi < 70) {
    motorAhizi = 0;
  }
  if (motorBhizi < 70) {
    motorBhizi = 0;
  }
  analogWrite(enA, motorAhizi); // A motoruna pwm sinyali gönder
  analogWrite(enB, motorBhizi); // B motoruna pwm sinyali gönder
}

Kod Açıklaması

// İleri ve geri kontrol için kullanılan Y ekseni
  if (yEkseni < 470) {
    // Motor A'yı geriye doğru ayarlar
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Motor B'yi geriye doğru ayarlar
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // 470'ten 0'a geri gitmek için azalan Y ekseni okumalarını motor hızını artırmak için PWM sinyali için 0 ila 255 değerine dönüştür
    motorAhizi = map(yEkseni, 470, 0, 0, 255);
    motorBhizi = map(yEkseni, 470, 0, 0, 255);
  }

Joystick’in Y eksenini ileri doğru hareket ettirirsek ve değer 550’nin üzerine çıkarsa, motorları ileri hareket edecek ve 550’den 1023’e kadar olan okumaları 0’dan 255’e PWM değerlerine çevirecek şekilde ayarlayacağız. Joystick merkezinde kalırsa, motorların hızı sıfır olacaktır.

Ardından, arabanın sol ve sağ kontrolü için X eksenini nasıl kullandığımızı görelim.

 // Sol ve sağ kontrol için kullanılan X ekseni
  if (xEkseni < 470) {
    // 470'ten 0'a azalan X ekseni okumalarını artan 0 ila 255 değerine dönüştür
    int xMapped = map(xEkseni, 470, 0, 0, 255);
    // Sola hareket - sol motor hızını azalt, sağ motor hızını artır
    motorAhizi = motorAhizi - xMapped;
    motorBhizi = motorBhizi + xMapped;
    // 0 ile 255 arasındaki aralığı sınırla
    if (motorAhizi < 0) {
      motorAhizi = 0;
    }
    if (motorBhizi > 255) {
      motorBhizi = 255;
    }
  }

Yani yine ilk önce X ekseni okumalarını 0’dan 255’e kadar hız değerlerine dönüştürmemiz gerekiyor. Sola hareket için bu değeri sol motor hızını azaltmak ve sağ motor hızını artırmak için kullanıyoruz. Burada, aritmetik fonksiyonlar nedeniyle, motor hızı aralığını 0 ile 255 arasında sınırlamak için iki ek “if” ifadesi kullanıyoruz.

Arduino L298N Motor Sürücü Kullanımı Arduino L298N Motor Sürücü Kullanımı,arduino l298n,l298n,arduino l298n kullanımı,arduino l298n motor hız kontrolü

Arabayı sağa hareket ettirmek için de aynı yöntem kullanılır.

Uygulanan gerilime ve motorun kendisine bağlı olarak, daha düşük hızlarda motor hareket edemez ve vızıltı sesi çıkarır. Bizim durumumuzda, PWM sinyalinin değeri 70’in altındaysa motorlar hareket edemiyordu. Bu nedenle, bu iki if ifadesini kullanarak aslında 70 ila 255 arasındaki hız aralığını sınırladık. Sonunda sadece son motor hızlarını göndeririz veya L298N sürücüsünün etkinleştirme pinlerine PWM sinyali göndeririz

// Düşük hızlarda kontrolü kolaylaştırır (Vızıldama sesi, motorlarınıza göre ayarlayın. PWM değeri 70'in altına düştüğünde motorlar harekete geçmiyor)
if (motorAhizi < 70) {
motorAhizi = 0;
}
if (motorBhizi < 70) {
motorBhizi = 0;
}
analogWrite(enA, motorAhizi); // A motoruna pwm sinyali gönder
analogWrite(enB, motorBhizi); // B motoruna pwm sinyali gönder
}

.