Bu içeriğe 6 Mart 2024 tarihinde fotoğraf güncellemesi yapıldı.

Herkese merhaba, bugün VNH2SP30 motor sürücünün nasıl kullanıldığını anlatacağım. Hemen başlıyoruz!

  • VNH2SP30 Motor Sürücünün Teknik Özellikleri

Çalışma Gerilimi: 5.5V – 16V
Sürekli Akım: 14A/h
Maksimum Anlık Akım: 30A/h
Mosfet Direnç Miktarı: 19 mΩ (Pin başına)
Maksimum PWM Frekansı: 20 kHz
Termal Koruması
Düşük ve Yüksek Gerilim Koruması
Boyut: 53.8 mm x 28.2 mm
Datasheet: https://www.pololu.com/file/0J52/vnh2sp30.pdf

  • VNH2SP30 Motor Sürücünün Pin Diyagramı

VIN ve GND: Motorları beslemek için VIN kısmına maksimum +16VGND kısmına ise kaynağınızın GND’sini bağlıyoruz, bu sayede motora güç vermiş oluyoruz. VIN kısmına önerilen gerilim değeri +12V‘dir.

PWM: Motorun hız ayarını yapmak için kullanıyoruz.

INA ve INB: Motorun yönlerini değiştirmek için kullanıyoruz. Bir tarafa HIGH diğer tarafa LOW geldiğinde motor bir yöne, bir tarafa LOW diğer tarafa HIGH geldiğinde diğer yöne ve her iki tarafa da LOW geldiğinde ise motor duracaktır.

CS (Current Sense – Akım Algılama): Motorun akım miktarını ölçmek için kullanıyoruz. Amper başına yaklaşık olarak 0,13V gerilim vermektedir. Bu pini kullanmak istiyorsanız daha iyi bir çıkış vermesi için şu devreyi kurmalısınız.

EN: Motorları açıp kapatmak için kullanıyoruz.

+5V ve GND: Kartı beslemek için +5V kısmına +5VGND kısmına ise kaynağınızın GND’sini bağlıyoruz, bu sayede karta güç vermiş oluyoruz.

OUTA ve OUTB: DC motorumuzdaki her iki kabloyu ayrı ayrı bir şekilde bu pinlere bağlıyoruz.

VIN, GND, OUTA ve OUTB pinlerine bağlı herhangi bir klemens bulunmamaktadır. Bu pinlere klemens lehimlemeniz işinizi kolaylaştıracaktır.

  • Arduino ile VNH2SP30 Motor Sürücünün Bağlantı Şeması
  • Arduino ile VNH2SP30 Motor Sürücünün Kodu

Kodları paylaşmadan önce şunları belirtmeliyim:

  1. Eğer motor ters dönüyorsa kablolarını veya A1 ve B1 pininin değerlerini ters çeviriniz.
  2. İlk başlatıldığındaki motor hızını ayarlamak için motorHizi değişkenini %0 – %100 arasında bir değer ayarlamalısınız.
  3. Motor Akımını Göster seçeneğini seçtiğinizde karşınıza çıkan değer maalesef çözünürlük sebebiyle %12 hatalıdır. Testlerinizi buna göre ayarlamanızı öneririm.
  4. İlk başta direkt olarak çalışmasını istiyorsanız motorYonu değişkenine bağlı değeri solaDonKomutu veya sagaDonKomutu ile değiştirebilirsiniz. Güvenlik amaçla eklediğim bu değişkeni değiştirmenizi pek tavsiye etmem.
/*
  ____                 _   _____                    
 |  _ \ ___  ___ _   _| | |_   _|   _ _______ _ __  
 | |_) / _ \/ __| | | | |   | || | | |_  / _ \ '_ \ 
 |  _ <  __/\__ \ |_| | |   | || |_| |/ /  __/ | | |
 |_| \_\___||___/\__,_|_|   |_| \__,_/___\___|_| |_|

*/   
                                                 
#define motorAcmaPini        8
#define motorA1Pini          9
#define motorB1Pini          10
#define motorHizPini         11
#define motorAkimOlcmePini   A0

#define durKomutu            1
#define solaDonKomutu        2
#define sagaDonKomutu        3

short motorHizi = 50;
short motorAkimi = 0;
short motorYonu = durKomutu;

char yapilacakGorev;   
 
void setup()                         
{
  pinMode(motorAcmaPini, OUTPUT);
  pinMode(motorA1Pini, OUTPUT);
  pinMode(motorB1Pini, OUTPUT);
  pinMode(motorHizPini, OUTPUT);
  pinMode(motorAkimOlcmePini, INPUT);

  while (!Serial) {;}

  Serial.begin(9600);              
  Serial.println("VNH2SP30 Motor Sürücü İle DC Motor Kontrol Programı\n");
  Serial.println("Menülerden birini seçerek programı deneyebilirsiniz:");
  Serial.println("1) Motoru Durdur");
  Serial.println("2) Motoru Sağa Döndür");
  Serial.println("3) Motoru Sola Döndür");
  Serial.println("4) Motor Hızını %10 Artır");
  Serial.println("5) Motor Hızını %10 Azalt");
  Serial.println("6) Motor Akımını Göster\n");
}

void loop() 
{  
  while (Serial.available() > 0)
  {
    yapilacakGorev = Serial.read(); 
    
    digitalWrite(motorAcmaPini, HIGH);
     
    if (yapilacakGorev == '1')
    {
       motoruDurdur();
    }
    
    else if (yapilacakGorev == '2')
    {
      sagaDon();
    }
    
    else if (yapilacakGorev == '3')
    {
      solaDon();
    }
    
    else if (yapilacakGorev == '4')
    {
      hiziArtir();
    }
    
    else if (yapilacakGorev == '5')
    {
      hiziAzalt();
    }

    else if (yapilacakGorev == '6')
    {
      akimOlc();
    }
    
    else
    {
      Serial.println("Maalesef böyle bir seçenek yok :(");
    }
      
  }
}

void motoruDurdur()
{
  Serial.println("Motor Durduruluyor!");
  
  motorYonu = durKomutu;
  motoraGonder(motorYonu, durKomutu);
}

void solaDon()
{
  Serial.println("Motor Sola Dönüyor!");
  
  motorYonu = solaDonKomutu;
  motoraGonder(motorYonu, motorHizi);
}

void sagaDon()
{
  Serial.println("Motor Sağa Dönüyor!");
  
  motorYonu = sagaDonKomutu;
  motoraGonder(motorYonu, motorHizi);
}

void hiziArtir()
{
  motorHizi = motorHizi + 10;
  
  if (motorHizi > 100)
  {
    motorHizi = 100;  
  }
  
  Serial.print("Motor Hızı: %");
  Serial.println(motorHizi);

  motoraGonder(motorYonu, motorHizi);
}

void hiziAzalt()
{
  motorHizi = motorHizi - 10;
  
  if (motorHizi < 0)
  {
    motorHizi = 0;  
  }
  
  Serial.print("Motor Hızı: %");
  Serial.println(motorHizi);

  motoraGonder(motorYonu, motorHizi);
}

void akimOlc()
{
  motorAkimi = ((analogRead(motorAkimOlcmePini) / 3) * 100); 
  
  Serial.print("Motor Akımı: ");
  Serial.print(motorAkimi);
  Serial.println(" mA/h");

}

void motoraGonder (short hedefYon, short hedefHiz)
{
  if (hedefYon == solaDonKomutu)
  {
    digitalWrite(motorA1Pini, LOW); 
    digitalWrite(motorB1Pini, HIGH);
  }
  
  else if (hedefYon == sagaDonKomutu)
  {
    digitalWrite(motorA1Pini, HIGH);
    digitalWrite(motorB1Pini, LOW);      
  }

  else if (hedefYon == durKomutu)
  {
    digitalWrite(motorA1Pini, HIGH);
    digitalWrite(motorB1Pini, LOW);      
  }
  
  else
  {
    digitalWrite(motorA1Pini, LOW);
    digitalWrite(motorB1Pini, LOW);            
  }
  
  analogWrite(motorHizPini, round(hedefHiz * 2.55)); 
}

Paylaşmayı ve merak ettiğiniz yerleri sormayı unutmayın. Bir sonraki blogda görüşmek üzere! 🙃