Arduino & C# - RF Haberleşme İle DC Motor Dört Bölge Hız Kontrolü - Elektrik Elektronik Projeleri

Post Top Ad

19 Ocak 2015 Pazartesi

Arduino & C# - RF Haberleşme İle DC Motor Dört Bölge Hız Kontrolü

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.
1.      Proje Devresi:

2.      Projede Kullanılacak Elemanlar:
a.       Arduino Uno
b.      434 MHz RF Alıcı – Verici
c.       L293D Motor Sürücü Entegre
d.      DC Motor
2.1.434 MHz RF Alıcı – Verici:
RF haberleşmeyi sağlayacak elemanlardır. Verici üzerinde 3 adet pin bulunmaktadır (VCC, GND, Data). Verici 3 – 12 V gerilimle çalışmaktadır. Vericinin gerilimi artırıldıkça haberleşme mesafesi de artacaktır. Alıcı ise 5V gerilimle çalışmaktadır. Alıcı üzerinde 4 adet pin bulunur (VCC, GND, Data, Data). Alıcıda bulunan iki data pini de birbirinin aynıdır, aynı veri gelmektedir.
2.2.L293D Motor Sürücü Entegresi
Motoru çalıştırmak için kullanacağımız entegredir. Arduino motor için yeteri kadar amper akım üretemez. Bundan dolayı motora, daha yüksek akım sağlamak için bu entegreyi kullanacağız ve entegreyi harici bir kaynak ile destekleyeceğiz.
Entegre iki motoru aynı anda sürebilmek için tasarlanmış bir entegredir. Biz 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.
3.      RF Haberleşme:
RF iletişim teknolojisi elektromanyetik dalgalar yoluyla gerçekleşmektedir. Bu dalgalar belirli bir frekans bandı aralığında iletim 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 lisans gerektirmemektedir. Geniş bant kablosuz iletişim sağlayan sistemler 2.4 – 2.8 GHz frekans bölgesinde çalışmaktadır. [Kaynak: GU J Sci Part C, 2(1):181-188 (2014)/ Seyfettin VADİ, Naki GÜLER, Ramazan BAYINDIR]
4.      Projenin Kaynak Kodu:
Arduino kodlarını derlemeden önce VirtualWire kütüphanesini programa import etmemiz gerekmektedir. Bunun için önce VirtualWire kütüphanesini indirmeliyiz (Dosyayı indirmek için tıklayınız). Daha sonra Arduino programında Sketch > Import Library > Add Library yolunu izlemeliyiz.
4.1.Verici Devresinin Arduino Kodu:
#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));
  }
}         
4.2.Alıcı Devresinin Arduino Kodu:
#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);
   }
  }
}

                NOT: Alıcı devresinin kodlarında gelen veriyi arduinonun serial monitor’üne yazdırmak için de komutlar kullanılmıştır. Bunun amacı gelen veriyi görebilmek içindir.
5.      C# Uygulaması:
5.1.Programın tasarımı:

            Forma ekleyeceğimiz nesneler yukarıda resimde görülmektedir.
5.2.Programın Kodu:
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;
            }
        }
    }
}

7 yorum:

  1. Merhabalar acaba denendimi bu ? Bende çalışmadı da

    YanıtlaSil
    Yanıtlar
    1. blogdaki projelerin tamamı denenmiş, çalıştırılmış projelerdir. sizde çalışmaması başka nedenlerden dolayı olabilir.

      Sil
  2. merhabalar ben bu kodla kablosuz potlu karaşimşek yaptım çalıştı. ama bu kodla drone motorlarını kontrol etmek istiyorum 16 tane falan mesajla yaptım olmadı maksimum kaç mesaj ile kod çalışabilir?

    YanıtlaSil
  3. merhabalar ben bu kodla kablosuz potlu karaşimşek yaptım çalıştı. ama bu kodla drone motorlarını kontrol etmek istiyorum 16 tane falan mesajla yaptım olmadı maksimum kaç mesaj ile kod çalışabilir?

    YanıtlaSil
    Yanıtlar
    1. veri boyutu 1byte'ı aşmadığı sürece sorunsuz çalışması gerekir. siz nasıl bir sorun yaşıyorsunuz?

      Sil
  4. deneme amaçlı 2 ledin parlaklığını artırıp azaltmak istiyorum önce ledlerden biri tam parlak yanıyor sonra kafasına göre ya sönüyo ya sönmüyo kod:
    #include
    //YOLLAYICI

    char *msg;
    int joy;
    int pot;

    void setup()
    {

    pinMode(A1,INPUT);
    pinMode(A0,INPUT);
    vw_set_tx_pin(12);
    vw_setup(2000);
    }
    void loop()
    {

    joy=analogRead(A1);
    joy=map(joy,0,1023,0,5);
    pot=analogRead(A0);
    pot=map(pot,0,1023,0,4);

    if(pot==0)
    {
    msg = "0";
    vw_send((uint8_t *)msg, strlen(msg));
    }
    else if(pot==1&&joy==0)
    {

    msg = "1";
    vw_send((uint8_t *)msg, strlen(msg));
    }
    else if(pot==1&&joy==1)
    {
    msg = "2";
    vw_send((uint8_t *)msg, strlen(msg));
    }

    else if(pot==1&&joy==2)
    {
    msg = "3";
    vw_send((uint8_t *)msg, strlen(msg));
    }
    else if(pot==1&&joy==3)
    {
    msg = "4";
    vw_send((uint8_t *)msg, strlen(msg));
    }
    else if(pot==1&&joy==4)
    {
    msg = "5";
    vw_send((uint8_t *)msg, strlen(msg));
    }
    else if(pot==2&&joy==0)
    {
    msg = "6";
    vw_send((uint8_t *)msg, strlen(msg));
    }
    else if(pot==2&&joy==1)
    {
    msg = "7";
    vw_send((uint8_t *)msg, strlen(msg));
    }
    else if(pot==2&&joy==2)
    {
    msg = "8";
    vw_send((uint8_t *)msg, strlen(msg));
    }
    else if(pot==2&&joy==3)
    {
    msg = "9";
    vw_send((uint8_t *)msg, strlen(msg));
    }


    }


    #include
    //ALICI



    char message;
    void setup()
    {

    vw_setup(2000);
    vw_rx_start();


    pinMode(11, OUTPUT);
    pinMode(9, 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];


    if (message == '0')
    {
    analogWrite(11, 0);
    analogWrite(9, 0);
    }
    else if (message == '1')
    {
    analogWrite(11, 255);
    analogWrite(9, 64);
    }
    else if (message == '2')
    {
    analogWrite(11, 191);
    analogWrite(9, 64);
    }
    else if (message == '3')
    {
    analogWrite(11, 64);
    analogWrite(9, 64);
    }
    else if (message == '4')
    {
    analogWrite(11, 64);
    analogWrite(9, 191);
    }
    else if (message == '5')
    {
    analogWrite(11, 64);
    analogWrite(9, 255);
    }
    else if (message == '6')
    {
    analogWrite(11, 255);
    analogWrite(9, 127);
    }
    else if (message == '7')
    {
    analogWrite(11, 191);
    analogWrite(9, 127);
    }
    else if (message == '8')
    {
    analogWrite(11, 127);
    analogWrite(9, 127);
    }
    else if (message == '9')
    {
    analogWrite(11, 127);
    analogWrite(9, 191);
    }
    }
    }

    YanıtlaSil
    Yanıtlar
    1. sorunun neden kaynaklandığını bulamadım. kodlarda bir sorun yok gibi görülüyor.

      Sil

Post Top Ad