Arduino & C# - Bluetooth Bağlantısı ile DC Motor Kontrol Etme - Elektrik Elektronik Projeleri

Post Top Ad

6 Mart 2015 Cuma

Arduino & C# - Bluetooth Bağlantısı ile DC Motor Kontrol Etme

Bu projede Arduinomuzu bluetooth bağlantısı üzerinden bilgisayara bağlayarak bir DC motorun döndürülmesini sağlayacağız. HC-06 modülü ile bluetooth bağlantısı kurarak, kablosuz haberleşme yapacağız. Arduinoyu bilgisayardan yönetmek için c# ile bir arayüz oluşturacağız.
Proje Devresi:
Devrede DC motoru kontrol etmek için L293 entegresini kullandık. Bluetooth modülü olarak HC-06 kullandık. Kullandığımız buluetooth modülü 3.3V ile çalıştığı için, modülün beslemesini 3.3V pininden aldık.

Devre bağlantılarını yaptığımızda, öncelikle bluetooth modülünü bilgisayarla ilişkilendirmeliyiz. Bunun için bluetooth ayarlarından bluetooth aygıtı ekle sayfasını açmalıyız. Gelen sayfada HC-06 ‘ya tıklayıp eşleştir demeliyiz. Bunu yaptığımızda bizden parola isteyecektir. Modülümüzün parolası 1234’tür. Eşleştirmeyi yaptıktan sonra bluetooth modülünün hangi porta bağlandığımı bilmemiz gerek. Bunun için bluetooth simgesine tıklayıp ayarları aç demeliyiz. Gelen ekranda com bağlantı noktaları sekmesini açmalıyız. Burada giden bağlantının olduğu portu bu proje için yazdığımız programı çalıştırdığımızda seçmeliyiz. Eğer com bağlantı noktaları sekmesinde modülün portlar görünmüyor ise, ekle butonuna tıklayarak modülümüzü elle eklemeliyiz.

Bluetooth Hakkında Kısa Bilgi
Bluetooth cihazlar arası kablosuz haberleşme sağlayan bir teknolojidir. 2.4 GHz frekans bandı civarında çalışmaktadır. Veri aktarma hızı 720 kbps’ye kadar ulaşabilmektedir. Etkinlik mesafesi kullanılan cihaza göre değişmekte olup, 10 ila 100 metre arasındadır.

HC-06 Bluetooth Modülü
Kablosuz seri haberleşme için tasarlanmış bir bluetooth modülüdür. 2.4 GHz frekans bandında haberleşme yapılmasına imkan sağlamaktadır. Açık alanda 10 m’ye kadar etkinlik sağlamaktadır. Modül bluetooth 2.0’ı desteklemektedir.  Bu modül yalnızca slave modunda çalışmaktadır. HC-05 modülü ise master/slave modunda çalışmaktadır.

Özellikleri:
  • Bluetooth Protokolü: Bluetooth 2.0+EDR(Gelişmiş Veri Hızı)
  • 2.4GHz haberleşme frekansı
  • Hassasiyet: ≤-80 dBm
  • Çıkış Gücü: ≤+4 dBm
  • Asenkron Hız: 2.1 MBps/160 KBps
  • Senkron Hız: 1 MBps/1 MBps
  • Güvenlik: Kimlik Doğrulama ve Şifreleme
  • Çalışma Gerilimi: 1.8-3.6V(Önerilen 3.3V)
  • Akım: 50 mA
Projenin Kaynak Kodu:
#include <SoftwareSerial.h>

SoftwareSerial bluetooth(1, 0);
int enable_pin=5;
int input1_pin=6;
int input2_pin=7;
int gelenVeri;

void setup() {
  pinMode(enable_pin, OUTPUT);
  pinMode(input1_pin, OUTPUT);
  pinMode(input2_pin, OUTPUT);
  bluetooth.begin(9600);
}

void loop() {
  if(bluetooth.available()) {
    gelenVeri=bluetooth.read();
    if(gelenVeri>0){
      if(gelenVeri==20) {
        analogWrite(enable_pin, 0);
        digitalWrite(input1_pin, LOW);
        digitalWrite(input2_pin, LOW);
      }
      else if(gelenVeri>0 && gelenVeri<=10) {
        gelenVeri=map(gelenVeri, 1, 10, 0, 255);
        analogWrite(enable_pin, gelenVeri);
        digitalWrite(input1_pin, HIGH);
        digitalWrite(input2_pin, LOW);
      }
      else if(gelenVeri>20 && gelenVeri<=30) {
        gelenVeri=map(gelenVeri, 21, 30, 0, 255);
        analogWrite(enable_pin, gelenVeri);
        digitalWrite(input1_pin, LOW);
        digitalWrite(input2_pin, HIGH);
      }
    }
  }
}

C# Uygulaması:
Yazdığımız bu program, daha önce seri haberleşme için yazdığımız programların benzeridir.
  • Programın tasarımı:
Forma ekleyeceğimiz nesneler yukarıda resimde görülmektedir.

  • 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;
using System.IO.Ports;

namespace bluetoothHaberlesmeIleDCMotorHizKontrolu
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (string portlar in SerialPort.GetPortNames())
            {
                comboBox1.Items.Add(portlar);
            }

            groupBox1.Enabled = false;
            groupBox2.Enabled = false;

            label2.Text = Convert.ToSingle(trackBar1.Value) + "%";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = 9600;
                serialPort1.Open();
            }
            catch (Exception)
            {
            }

            if (serialPort1.IsOpen)
            {
                groupBox1.Enabled = true;
                groupBox2.Enabled = true;
            }
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            int trackBarDeger = trackBar1.Value;
            byte[] gidenVeri;

            if (radioButton1.Checked == true)
            {
                gidenVeri = BitConverter.GetBytes(trackBarDeger);
                serialPort1.Write(gidenVeri, 0, 4);
            }
            else if (radioButton2.Checked == true)
            {
                gidenVeri = BitConverter.GetBytes(trackBarDeger + 20);
                serialPort1.Write(gidenVeri, 0, 4);
            }

            label2.Text = Convert.ToString(trackBar1.Value * 10) + "%";
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            int trackBarDeger = trackBar1.Value;
            byte[] gidenVeri = BitConverter.GetBytes(trackBarDeger);
            serialPort1.Write(gidenVeri, 0, 4);
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            int trackBarDeger = trackBar1.Value;
            byte[] gidenVeri = BitConverter.GetBytes(trackBarDeger + 20);
            serialPort1.Write(gidenVeri, 0, 4);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                byte[] gidenVeri = BitConverter.GetBytes(20);
                serialPort1.Write(gidenVeri, 0, 4);
                serialPort1.Close();
            }
        }
    }
}

37 yorum:

  1. Merhaba projeler için çok teşekkürler güzel projeler var.Sormak istediğim (gidenVeri,0,4); ne anlama gelmektedir? arduinoya gönderilen veriler char yada string türüne nasıl çevrilebilir? ben başka bir proje yapıyorum orda serial üzerinden string veriler alıyorum bluetooth ile.ama hız kontrolü yapmak istediğimde int türünde alınıyor veriler bu sorunu nasıl çözebilirim?

    YanıtlaSil
  2. seri porttan verileri ya string ya da byte tipinde göndermekteyiz. bu örnekte veriler byte olarak gönderilmiştir. çünkü arduinoda verileri byte olarak karşılaştırmak daha kolaydır. aksi halde veri dönüşümü yapmamız gerekecekti.

    siz de verileri byte olarak göndermeyi deneyiniz.

    YanıtlaSil
  3. Merhaba Mehmet abi ben bu işlerde yeniyim de arduino ve bluettoth şeyini anladım diğer alet ne? greklimi ?

    YanıtlaSil
  4. Abi bi sorum daha var 2 adet motor olucak DC ve buton 1 e tıkladığımda trackbar daki hızda iki motor da ileri gidecek buton 2 de iki motorda geri gelecek buton üçte motor 1 duracak motor 2 ileri çalışacak 4 te 2 duracak 1 ileri çalışacak

    YanıtlaSil
  5. bluetooth haberleşmesi için arduinoya bağlayabileceğin herhangi bir bluetooth modülü gereklidir.

    YanıtlaSil
  6. ikinci olarak arduino-bluetooth kontrollü araba uygulamaları internette mevcuttur. incelemeni tavsiye ederim.

    YanıtlaSil
  7. bu devre modeli için gerekli olan elemanlar nelerdir

    YanıtlaSil
    Yanıtlar
    1. Projede Fritzing çiziminde yer alan elemanlar kullanılmıştır. Arduino Uno, Hc-05 veya HC-06, L293, DC Motor.

      Sil
  8. Bu bilgileri bizimle paylaştığın için çok teşekkür ederim.

    SerialPort1.write() ile veri gönderiyoruz fakat veriyi nasıl alacağız bilgin var mı ?

    SerialPort1.read(); komutu içine ne yazmalıyım ?

    Alperin de sorduğu gibi serialport1.write(veri, 0 ,4) teki 0 ve 4 ne anlama geliyor ?

    YanıtlaSil
    Yanıtlar
    1. Uygulamada veriyi Byte tipinde göndermekteyiz. Bu durumda serialPort1.write() fonksiyonu parametrelerini buna göre ayarlamaktayız.
      detaylı bilgi için şu adrese bakınız:
      https://msdn.microsoft.com/tr-tr/library/ms143551(v=vs.110).aspx

      Sil
  9. Abi merhaba devreyi kurdum kodlar herşey tamam ama pc bluetoothu görmedi bu sıkıntıyı nasıl halledebilirim ?

    YanıtlaSil
    Yanıtlar
    1. programı çalıştırmadan önce bluetooth modülünü bilgisayara eklemeniz gerekmekteydi. bunu yaptınız mı? eğer yapmamışsanız görev çubuğunun sağ tarafında bulunan simgelerden bluetooth simgesine tıklayın ve açılan menüden bluetooth aygıtı ekleye tıklayın. gelen ekranda bluetooth modülü görünecektir. eğer görünmüyorsa modülde bir sıkıntı olabilir.

      Sil
  10. Biraz cahilce olacak ama ; 2 adet bluetooth gerekiyor de mi ? :)

    YanıtlaSil
    Yanıtlar
    1. bu uygulamada arduino ile bilgisayarı bluetooth üzerinden haberleştiriyoruz. arduinoya bluetooth modülü takıyoruz. bilgisayar zaten bluetooth'a sahip.

      Sil
  11. Abi com1 falan demişsin ama biz kablo ile bağladığımızda usb kablo ile bağlancak kablo ile kontrol etme şansımız var mı yani port adı falan ne olacak ?

    YanıtlaSil
    Yanıtlar
    1. değişen bişey olmaz, usb kablonun bağlandığı portu seçersin.

      Sil
  12. Abi bilgisayarın HC 06 aygitini görebilmesi için HC 06'ya enerji vermemiz gerekli mi ? Gerekliyse bunu nasıl yapabilirim ?

    YanıtlaSil
    Yanıtlar
    1. hc06 nın vcc girişinden 3.3 volt uygulayarak modülü çalıştırabilirsiniz.

      Sil
  13. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  14. C# ile web server yazıp gelen giden datayı okuma-yazdırma ve komutları ardiuno ya yaptırma şansımız varmı acaba ?

    YanıtlaSil
  15. hc-06 modulü 5v ile calısıyor

    YanıtlaSil
  16. programı derlerken expected nested-name--specifier before 'system' şeklinde bir hata veriyor yükleyemiyorum nedeni nedir acaba?

    YanıtlaSil
  17. Derleyeciden kaynakli bir hata olabilir. Lutfen deroeyici versiyonunuzun guncel ldugundan emin olunuz.

    YanıtlaSil
  18. programın ikinci kısmındaki using system şeklinde olanlarla ilgili hata veriyor bunun için bi kütüphane veya program kurmam gerekiyor mu ve bu projeyi 12 V dc motor motor control shield ile yaparken bi sorun olur mu ?

    YanıtlaSil
    Yanıtlar
    1. Muhtemelen using system.io.ports kismina hata veriyordur. Motor shielden kaynaklanan bi sorun degil. İnternette using system.io.ports için arama yapabilir misiniz. Belki biseyler cikabilir. Ben de sorunla ilgili bi çözüm bulursam dönüş yaparım.

      Sil
  19. abi bluetooth yerine serial yaparsak ne degişir

    YanıtlaSil
  20. Biz C# ile bluetooth arasında bağlantı kuramadik yardım edermisiniz.Bluetooth olarak hc -06 kullandık.

    YanıtlaSil
    Yanıtlar
    1. Bluetooth modulunu bilgisayara yeni cihaz olarak eklemeniz gerekiyor. Com port açılıyor mu onu kontrol etmelisiniz.

      Sil
  21. Motorun dönüş hızı degişmiyor neden olabilir

    YanıtlaSil
    Yanıtlar
    1. PWM'den kısmında sorun yaşıyor olabilirsiniz. Ya da C# kısmında motorun hızını artırıp azalttığınız datalar arduinoya ulaşmıyordur.

      Sil
  22. bluetooth bağlantısı yanlış

    YanıtlaSil
  23. #include

    SoftwareSerial bluetooth(1, 0);
    int enable_pin=5;
    int input1_pin=6;
    int input2_pin=7;
    int gelenVeri;

    void setup() {
    pinMode(enable_pin, OUTPUT);
    pinMode(input1_pin, OUTPUT);
    pinMode(input2_pin, OUTPUT);
    Serial.begin(9600);
    }

    void loop() {
    if(Serial.available()) {
    gelenVeri=Serial.read();
    if(gelenVeri>0){
    if(gelenVeri==20) {
    analogWrite(enable_pin, 0);
    digitalWrite(input1_pin, LOW);
    digitalWrite(input2_pin, LOW);
    }
    else if(gelenVeri>0 && gelenVeri<=10) {
    gelenVeri=map(gelenVeri, 1, 10, 0, 255);
    analogWrite(enable_pin, gelenVeri);
    digitalWrite(input1_pin, HIGH);
    digitalWrite(input2_pin, LOW);
    }
    else if(gelenVeri>20 && gelenVeri<=30) {
    gelenVeri=map(gelenVeri, 21, 30, 0, 255);
    analogWrite(enable_pin, gelenVeri);
    digitalWrite(input1_pin, LOW);
    digitalWrite(input2_pin, HIGH);
    }
    }
    }
    }

    YanıtlaSil
  24. 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;
    using System.IO.Ports;

    namespace bluetooth
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    byte[] gidenVeri;

    private void Form1_Load(object sender, EventArgs e)
    {
    foreach (string portlar in SerialPort.GetPortNames())
    {
    comboBox1.Items.Add(portlar);
    }

    groupBox1.Enabled = false;
    groupBox2.Enabled = false;

    label2.Text = Convert.ToSingle(trackBar1.Value) + "%";
    }

    private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    serialPort1.PortName = comboBox1.Text;
    serialPort1.BaudRate = 9600;
    serialPort1.Open();
    }
    catch (Exception)
    {
    }

    if (serialPort1.IsOpen)
    {
    groupBox1.Enabled = true;
    groupBox2.Enabled = true;
    }

    }



    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {

    gidenVeri = BitConverter.GetBytes(trackBar1.Value);
    serialPort1.Write(gidenVeri, 0, 4);
    }

    private void radioButton2_CheckedChanged(object sender, EventArgs e)
    {

    gidenVeri = BitConverter.GetBytes(trackBar1.Value+ 20);
    serialPort1.Write(gidenVeri, 0, 4);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
    if (serialPort1.IsOpen)
    {
    gidenVeri = BitConverter.GetBytes(20);
    serialPort1.Write(gidenVeri, 0, 4);
    serialPort1.Close();
    }
    }



    private void trackBar1_ValueChanged(object sender, EventArgs e)
    {
    if (radioButton1.Checked == true)
    {

    gidenVeri = BitConverter.GetBytes(trackBar1.Value);
    serialPort1.Write(gidenVeri, 0, 4);
    }
    else if (radioButton2.Checked == true)
    {

    gidenVeri = BitConverter.GetBytes(trackBar1.Value + 20);
    serialPort1.Write(gidenVeri, 0, 4);
    }

    label2.Text = Convert.ToString(trackBar1.Value * 10) + "% MOTOR HIZI";
    }
    }
    }

    YanıtlaSil
  25. Merhaba Mehmet Bey,oncelikle emeginize sagkik.Bir sorum olacakti.
    if(gelenVeri==20) buradaki 20 verisi veya else if(gelenVeri>0 && gelenVeri<=10 verilerielse if(gelenVeri>20 && gelenVeri<=30 nereden nasil bularak yazdik? Seriport uzerinden bu verileri nasil gonderiyoruz? Yani 20 yerine mesela 100 olabilir miydi? 20 yi nereden bulduk?
    Saygilar selamlar.

    YanıtlaSil
  26. Merhaba Mehmet Bey;
    private void trackBar1_Scroll(object sender, EventArgs e)
    {
    int trackBarDeger = trackBar1.Value;
    byte[] gidenVeri;

    if (radioButton1.Checked == true)
    {
    gidenVeri = BitConverter.GetBytes(trackBarDeger);
    serialPort1.Write(gidenVeri, 0, 4);
    }
    else if (radioButton2.Checked == true)
    {
    gidenVeri = BitConverter.GetBytes(trackBarDeger + 20);
    serialPort1.Write(gidenVeri, 0, 4);
    }

    label2.Text = Convert.ToString(trackBar1.Value * 10) + "%";
    Yukaridaki kodlama ile ,
    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
    int trackBarDeger = trackBar1.Value;
    byte[] gidenVeri = BitConverter.GetBytes(trackBarDeger);
    serialPort1.Write(gidenVeri, 0, 4);
    }

    private void radioButton2_CheckedChanged(object sender, EventArgs e)
    {
    int trackBarDeger = trackBar1.Value;
    byte[] gidenVeri = BitConverter.GetBytes(trackBarDeger + 20);
    serialPort1.Write(gidenVeri, 0, 4);
    }

    Bu kodlamar ayni
    Nasil yon ve hiz icin ayri ayri kullanabiliyoruz? Acikliyabilirseniz cok memnun olutum.Saygilar.

    YanıtlaSil

Post Top Ad