12. DERS - C# ve Arduino ile Servo Motor Kontrolü

Bu derste Microsoft Visual Studio C# 2013 de yazdığım SerialCom. V1.2. isimli program ve Arduino UNO ile servo motor kontrolünü gerçekleştirdim.

Şekil 1 - Servo Motor

Servo Motor
DC motorların aksine, konum (açı) kontrol sinyali kullanarak servo motorlarla motor milini belirli bir konuma konumlandırabiliriz. Kontrol sinyali değişmediği sürece motor mili konumunu korur. Robot kolu gibi belirli açıda döndürüp konumunu koruması gereken uygulamalarda oldukça kullanışlıdır.

Servo motorlar boyutuna ve torkuna  göre mini, standart ve büyük olarak sınıflandırılabilir. Genellikle mini ve standart boyutlu servo motorlar Arduino tarafından harici güç kaynağına  veya sürücüye gerek kalmadan sürülebilir. 

Nasıl Çalışır
Servo Motorun 3 ucu vardır (Şekil 2): 
Siyah(Kahve) Uç: GND (ground)     Krmızı Uç:+5v       Renkli Uç(Turuncu): Kontrol Sinali(PWM)

Şekil 2 - Servo Motor Uçları

Renkli uçtan kontrol sinyali (PWM - pulse-width modulation- derbe genişliği modülasyonu) uygulanır. PWM sinyali Arduino UNO tarafından üretilir. PWM sinyali ile servo motorun dönüş açısı belirlenir.PWM sinyalinin darbe genişliği ile dönme açısı belirlenir (Şekil 3). 

Şekil 3 - Kontrol (PWM) Sinyali
Arduino ile Servo Motor Kontrolü


Şekil 4 - Arduino UNO ve Servo Motor

Arduino'yu kullanarak standart servo motor kontrolü son derece kolaydır. Çünkü Arduino IDE yazılımı servo motor kütüphanesine sahiptir. Bu kütüphane sayesinde servo motor kontrolü oldukça kolay gerçekleştirilir.
  1. Servodaki siyah kabloyu Arduino'daki Gnd pinine bağlayın 
  2. Servodaki kırmızı kabloyu Arduino'daki + 5V pinine bağlayın 
  3. Üçüncü kabloyu (genellikle turuncu veya sarı)  Arduino üzerinde bir dijital  pine bağlayın
Şekil 5 - Arduino Servo Motor Devresi

Arduino Programı
#include <Servo.h>
Servo myservo;
int pos = 0;
int x;
void setup()
{
     Serial.begin(9600);
     myservo.attach(9);
}
void loop()
{
    if(Serial.available())
     {
         pos = Serial.read();
         if(pos>0)
          {
              x=pos;
           }
      }
  myservo.write(x);
}

Arduino Programını İndirilenler-Download sekmesinden indirebilirsiniz.

SerialCom V1.2 Programı
Daha önceki projelerde kullandığımız SerialCom isimli programın 2. versiyonunu (SerialCom V1.2) programladım. Bu programla arduinoya bağlı servo motorun dönüş açısı kontrol ediliyor (Şekil 6). 

Şekil 6 - SerialCom V1.2. Programı

Form üzerindeki TrackBar'ın hareketli ucu oynatılarak değeri seri port üzerinden Arduino'ya pwm değeri olarak gönderilir. TrackBar' ın minimum değeri 0 ve maksimum değeri 180 olmalıdır. Bu değerler servo motorun dönüş dereceleridir.

C# 2013 Kodları
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();//Seri Portu Oku
            foreach (string port in ports)
            {
                comboBox1.Items.Add(port); //Seri Portu Listeye At
            }
            timer1.Enabled = true; //Zamanı Görüntülemek için Timer1 Aktif Et
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string x = comboBox1.SelectedItem.ToString();
            serialPort1.PortName = x;
            serialPort1.BaudRate = 9600;
            //serialPort1.Open();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                if (!serialPort1.IsOpen)
                    serialPort1.Open();

            }
            catch
            {
                MessageBox.Show("Seri Port Seçin!");
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            textBox1.Text = DateTime.Now.ToLongTimeString();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true)
            {
                int PWM_deger = trackBar1.Value;
                textBox2.Text = trackBar1.Value.ToString();
                // int değeri byte a dönüştürme işlemi.
                byte[] b = BitConverter.GetBytes(PWM_deger);
                serialPort1.Write(b, 0, 4);
            }
            else // gerçekleşmemişse hata mesajı verir.
            {
                textBox2.Text = "Cihaz Bağlı Değil";
            }
        }
    }
}

Programı yazarken " using System.IO.Ports; " satırını yazmayı unutmayın. Bu kütüphane serialPort nesnesinin çalışmasını sağlar.

Proje Dosyaları

Proje dosyalarını aşağıdaki linklerden indirebilirsiniz.
Ders Videosu




11 yorum:

  1. Elinize sağlık

    YanıtlaSil
  2. C# ve Arduino haberleşmeyi gerçekleştirmekle büyük bir problemimi çözdüm. Elinize sağlık. Paylaşımlarınız için teşekkür ederim

    YanıtlaSil
  3. Ben teşekkür ederim. Probleminizi çözdüğü için çok mutlu oldum.

    YanıtlaSil
  4. Ben teşekkür ederim. Probleminizi çözdüğü için çok mutlu oldum.

    YanıtlaSil
    Yanıtlar
    1. serialport1 hatası verdi ve çözüm bulamıyorum. using System.IO.Ports; kütüphanesi de ekli yardım ederseniz sevinirim.

      Sil
    2. bunu butonlarla nasıl yapabiliriz gösterebilirmisiniz.

      Sil
  5. Merhaba, öncelikle projemi anlatayım sonra yaşadığım problemi bayadır arduino kullanıyorum C# 'yeni geçtim Arduino ile C#'ı haberleştiriyorum Net.socket kütüphanesi ile server kapalı ağda sayaç yazdım arduinoya her input geldiğinde +5v C# da okuyorum sayıyor 1 2 3... takıldığım problem şu C#'a Textbox açmam gerek ve bir buton textbox a sayı girmem lazım butona basınca arduinoya göndericek ama en az 0 -99999 5 basamklı arduinoya bunu bi int değere eşitlemem lazım arduino'da yazmış olduğum sayaç ile bu girilen değeri karşılaştırmak istiyorum misal if (sayaç > Gelenveri ) sayaç gelen veriye eşitse bir çıkışı aktif edicek textbox a girilen değeri butonla hangi komutla bu değeri gönderebilirim acil yardımınıza ihtiyacım var.

    YanıtlaSil
    Yanıtlar
    1. private void trackBar1_Scroll(object sender, EventArgs e)
      {
      if (serialPort1.IsOpen == true)
      {
      int PWM_deger = trackBar1.Value;
      textBox2.Text = trackBar1.Value.ToString();
      // int değeri byte a dönüştürme işlemi.
      byte[] b = BitConverter.GetBytes(PWM_deger);
      serialPort1.Write(b, 0, 4);
      }
      else // gerçekleşmemişse hata mesajı verir.
      {
      textBox2.Text = "Cihaz Bağlı Değil";
      }
      }

      Sil
    2. Yukarıdaki komutlardan faydalanabilirsin
      önce tür değişimi yaparak seri portdan gelen string veriyi byte a çevirmen gerekiyor

      Sil
  6. Merhaba, öncelikle projemi anlatayım sonra yaşadığım problemi bayadır arduino kullanıyorum C# 'yeni geçtim Arduino ile C#'ı haberleştiriyorum Net.socket kütüphanesi ile server kapalı ağda sayaç yazdım arduinoya her input geldiğinde +5v C# da okuyorum sayıyor 1 2 3... takıldığım problem şu C#'a Textbox açmam gerek ve bir buton textbox a sayı girmem lazım butona basınca arduinoya göndericek ama en az 0 -99999 5 basamklı arduinoya bunu bi int değere eşitlemem lazım arduino'da yazmış olduğum sayaç ile bu girilen değeri karşılaştırmak istiyorum misal if (sayaç > Gelenveri ) sayaç gelen veriye eşitse bir çıkışı aktif edicek textbox a girilen değeri butonla hangi komutla bu değeri gönderebilirim acil yardımınıza ihtiyacım var.

    YanıtlaSil