Arduino ve C# RF Haberleşme ile DC Motor Kontrolü

Arduino ve C# kullanarak Bluetooth ile DC Motor Kontrolü yaptığımız bu içeriğimiz ile, windows form oluşturmayı. L293 entegresi ile DC motor kontrolünü ve bluetooth bağlantını seri haberleşme portu gibi kullanmayı öğreneceksiniz.

Bu projede radyo frekanslar (RF) kullanarak iki devrenin haberleşmesini sağlayacağız. Bu haberleşme için iki devremiz olacak; alıcı ve verici devreleri. Verici devremiz RF ile komutlar gönderecek, alıcı devremiz aldığı komutları işleyecektir. Biz bu veri işlemeyi DC motor hız kontrolü için yapacağız.

Verici devremizi bilgisayar ile kontrol edeceğiz. Yani seri haberleşme ile bilgisayardan verici devremize motorun hızı ve dönme yönü için veriler göndereceğiz. Verici devremiz aldığı bu verileri RF sinyal olarak alıcı devremize iletecektir. Alıcı devremiz ise aldığı bu sinyalleri çözümleyip, elde ettiği verilere göre motoru döndürecektir.

Eğer daha önce windows form ile bir proje yapmadıysanız öncelik buradaki yazımıza bakmanızı öneriyoruz.

Gerekli Malzemeler

  • Arduino geliştirme kartı(Arduino UNO) x 2
  • 433 MHz Alıcı ve Verici
  • L293D ya da L298 motor sürücü
  • DC Motor
  • Motor sürücü için +9V DC güç kaynağı

433 MHz Alıcı/Verici

İki Arduino arasında bağlantıyı kuracak modüllerdir. Verici üzerinde, VCC, GND, Data pinleri bulunmaktadır. 3.3-12V arasındaki gerilimle çalışmaktadır. Gerilim ve haberleşme mesafesi doğru orantılı olarak artıp, azalmaktadır. Alıcı üzerinde, VCC, GND, Data, Data olarak dört pin bulunmaktadır. İki data pini bir birine bağlıdır, yani istediğinizi kullanabilirsiniz.

RF iletişim teknolojisi elektromanyetik dalgalar aracılığı ile gerçekleşmektedir. Bu dalgalar belirli bir frekans bandı aralığında çalışma sağlamaktadır. Radyo dalgaları 10 kHz ile 3000 GHz frekans aralığını kapsamaktadır. RF haberleşme yöntemi, araçlarda merkezi kilit sistemleri, ev otomasyon sistemleri, güvelik sistemleri ve garaj kapıları vb. gibi daha çok basit uygulamalarda yaygın olarak kullanılmaktadır. Basit uygulamalar için kullanılan 433 MHz ve 860 MHz frekans bandında çalışan kablosuz haberleşme sistemleri amatör telsizcilikte gereken lisansı gerektirmemektedir.

L293D Motor Sürücü

Motoru sürmek için kullanacağımız entegredir. Arduino motor için yeteri kadar akım çıkışı yapamaz(bir pin üzerinden maksimum 40mA çıkış yapabilir). Bu yüzden motora, daha yüksek akımı aktarmak için bu entegreyi kullanacağız ve entegreyi harici bir kaynak(9-12V) ile destekleyeceğiz.

Entegre iki motoru aynı anda sürebilmek için tasarlanmış bir entegredir. Bu projemizde tek bir motor süreceğimiz için entegrenin Input1, Input2, Output1, Output2 ve Enable1 pinlerini kullanacağız, Input3, Input4, Output3, Output4 ve Enable2 pinlerini kullanmayacağız.

Arduino ve C# RF Haberleşme ile DC Motor Kontrolü C# RF Haberleşme,Arduino ve C# RF Haberleşme ile DC Motor Kontrolü

Devre Şeması

Arduino ve C# RF Haberleşme ile DC Motor Kontrolü C# RF Haberleşme,Arduino ve C# RF Haberleşme ile DC Motor Kontrolü

Kodları Arduino geliştirme kartlarına yüklemeden önce VirtualWire kütüphanesini kurmanız gerekir fakat burada şunu belirtmemiz gerekir; VirtualWire kütüphanesi artık kullanılmıyor, kısacası sadece bu proje için kurmanız gerekiyor. VirtualWire kütüphanesinin yerine artık yaygın olarak RadioHead kütüphanesi kullanılmaktadır.

Bu projede kullanılan VirtualWire kütüphanesini indirmek için buraya tıklayabilirsiniz. Arduino IDE’ye kütüphane nasıl kurulur bilmiyorsanız, hazırladığımız yazımıza bakabilirsiniz:

Arduino Kodu(Verici)

#include <VirtualWire.h>
int gelenVeri;
char *msg;
void setup()
{
  Serial.begin(9600);
  vw_set_tx_pin(12);
  vw_setup(2000);
}
void loop()
{
  gelenVeri=Serial.read();
  if(gelenVeri=='0')
  {
    msg = "0";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='1')
  {
    msg = "1";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='2')
  {
    msg = "2";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='3')
  {
    msg = "3";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='4')
  {
    msg = "4";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='5')
  {
    msg = "5";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='6')
  {
    msg = "6";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='7')
  {
    msg = "7";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='8')
  {
    msg = "8";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='9')
  {
    msg = "9";
    vw_send((uint8_t *)msg, strlen(msg));
  }
  else if(gelenVeri=='*')
  {
    msg = "*";
    vw_send((uint8_t *)msg, strlen(msg));
  }
}      

Arduino Kodu(Alıcı)

include <VirtualWire.h>
char message;
int I1=6;
int I2=9;
int E=5;
void setup()
{
 Serial.begin(9600);
 vw_setup(2000);
 vw_rx_start();
 pinMode(I1, OUTPUT);
 pinMode(I2, OUTPUT);
 pinMode(E, OUTPUT);
 pinMode(13, OUTPUT);
}
void loop()
{
 vw_set_rx_pin(2);              
 uint8_t buf[VW_MAX_MESSAGE_LEN];
 uint8_t buflen = VW_MAX_MESSAGE_LEN;
 if (vw_get_message(buf, &buflen))
 {
   message=buf[0];
   Serial.println(message);
   Serial.println(*buf);
   if(message=='0')
   {
     digitalWrite(I1, HIGH);
     digitalWrite(I2, LOW);
     analogWrite(E, 100);
   }
   if(message=='1')
   {
     digitalWrite(I1, HIGH);
     digitalWrite(I2, LOW);
     analogWrite(E, 130);
   }
   if(message=='2')
   {
     digitalWrite(I1, HIGH);
     digitalWrite(I2, LOW);
     analogWrite(E, 160);
   }
   if(message=='3')
   {
     digitalWrite(I1, HIGH);
     digitalWrite(I2, LOW);
     analogWrite(E, 190);
   }
   if(message=='4')
   {
     digitalWrite(I1, HIGH);
     digitalWrite(I2, LOW);
     analogWrite(E, 225);
   }
   if(message=='5')
   {
     digitalWrite(I1, LOW);
     digitalWrite(I2, HIGH);
     analogWrite(E, 100);
   }
   if(message=='6')
   {
     digitalWrite(I1, LOW);
     digitalWrite(I2, HIGH);
     analogWrite(E, 130);
   }
   if(message=='7')
   {
     digitalWrite(I1, LOW);
     digitalWrite(I2, HIGH);
     analogWrite(E, 160);
   }
   if(message=='8')
   {
     digitalWrite(I1, LOW);
     digitalWrite(I2, HIGH);
     analogWrite(E, 190);
   }
   if(message=='9')
   {
     digitalWrite(I1, LOW);
     digitalWrite(I2, HIGH);
     analogWrite(E, 225);
   }
   if(message=='*')
   {
     digitalWrite(I1, LOW);
     digitalWrite(I2, LOW);
     analogWrite(E, 0);
   }
  }
}

Windows Form Kodu

Forma eklemeniz gereken nesneler:

Arduino ve C# RF Haberleşme ile DC Motor Kontrolü C# RF Haberleşme,Arduino ve C# RF Haberleşme ile DC Motor Kontrolü
  • label x 4
  • serialPort x 1
  • button x 6
  • textBox x 1
  • groupBox x 1

Eğer kodu projenize eklemekte zorluk yaşıyorsanız buradan hazır proje dosyalarını indirebilirsiniz.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DCMotor_RFKontrol
{
    public partial class Form1 : Form
    {
        int hiz=0;
        int durdurKlik=0;
        int yonSayi;
        string yon;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            PozitifDondur.Enabled = false;
            NegatifDondur.Enabled = false;
            HizArtir.Enabled = false;
            HizAzalt.Enabled = false;
            Durdur.Enabled = false;
        }

        private void Baglan_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = textBox1.Text;
                serialPort1.BaudRate = 9600;
                serialPort1.Open();
                if (serialPort1.IsOpen)
                {
                    PozitifDondur.Enabled = true;
                    NegatifDondur.Enabled = true;
                    label6.Text = "Porta Bağlanıldı";
                    groupBox1.Enabled = false;
                }
            }
            catch
            {
                label6.Text = "Porta Bağlanılamadı";
            }
        }

        private void PozitifDondur_Click(object sender, EventArgs e)
        {
            yon = "+";
            yonSayi = 0;
            serialPort1.WriteLine(Convert.ToString(hiz+yonSayi));
            HizArtir.Enabled = true;
            HizAzalt.Enabled = true;
            Durdur.Enabled = true;
            NegatifDondur.Enabled = false;
            PozitifDondur.Enabled = false;
            durum();
        }

        private void HizArtir_Click(object sender, EventArgs e)
        {
            if (hiz < 4)
            {
                hiz++;
            }
            serialPort1.WriteLine(Convert.ToString(hiz+yonSayi));
            durum();
        }

        private void HizAzalt_Click(object sender, EventArgs e)
        {
            if (hiz > 0)
            {
                hiz--;
            }
            serialPort1.WriteLine(Convert.ToString(hiz+yonSayi));
            durum();
        }

        private void NegatifDondur_Click(object sender, EventArgs e)
        {
            yon = "-";
            yonSayi = 5;
            serialPort1.WriteLine(Convert.ToString(hiz+yonSayi));
            HizArtir.Enabled = true;
            HizAzalt.Enabled = true;
            Durdur.Enabled = true;
            PozitifDondur.Enabled = false;
            NegatifDondur.Enabled = false;
            durum();
        }

        private void Durdur_Click(object sender, EventArgs e)
        {
            serialPort1.Write("*");
            durdurKlik = 1;
            durum();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Write("*");
                serialPort1.Close();
            }

        }
        void durum()
        {
            if (yon == "+")
            {
                label3.Text = "Motor Pozitif Yönde Dönüyor";
            }
            if (yon == "-")
            {
                label3.Text = "Motor Negatif Yönde Dönüyor";
            }

            label4.Text = Convert.ToString(hiz+1) + "x";

            if (hiz == 4)
                HizArtir.Enabled = false;
            else if (hiz != 4)
                HizArtir.Enabled = true;
            if (hiz == 0)
                HizAzalt.Enabled = false;
            else if (hiz !=0)
                HizAzalt.Enabled = true;

            if (durdurKlik == 1)
            {
                hiz = 0;
                PozitifDondur.Enabled = true;
                NegatifDondur.Enabled = true;
                HizArtir.Enabled = false;
                HizAzalt.Enabled = false;
                Durdur.Enabled = false;
                label3.Text = "";
                label4.Text = "";
                durdurKlik = 0;
            }
        }
    }
}