Facebook RSS Feed
 
.NET Micro Framework: Netduino: WT41 ile Bluetooth İletişimi
Tarih: 23.11.2013, Platform: .NET MF 4.2, IDE: Visual Studio 2012, Level: 200

Geliştirdiğiniz cihazların birbirleriyle ya da bilgisayarlarla haberleşmesinde kullanılan en popüler iletişim yollarından biri, Bluetooth'dur. Tüm tablet, telefon ve bilgisayarlarda bulunan Bluetooth ile, robotik projelerinizi kontrol edebilir, data logger cihazlarınızdaki verileri transfer edebilir ve aklınıza gelen bir çok olasılığı gerçekleştirebilirsiniz.

Hedef

Bluegiga WT41 Chipsetini kullanan bir Bluetooth iletişim uygulaması geliştireceğiz. WT41 Chipseti, Bluetooth iletişimini seri port iletişimi ile aynı kolaylığa getiren, dahili stack'a sahip bir modül. 1 km çekim alanına sahip olması da en büyük avantajları arasında.

Gerekenler

Netduino Plus 2
Bluegiga WT41 Bluetooth Modülü
Bluetooth'lu Bilgisayar
Terminal Uygulaması

Çalışma Prensibi

Haberleşme amacıyla kullandığımız Bluetooth modülleri, mikrodenetleyicilerle seri port üzerinden iletişim kurar. Uygulama başladığında mikrodenetleyici, Bluetooth chipsetine yapılandırma parametrelerini gönderir. Ardından, seri port ile bağlantı kurma mantığıyla işlem devam eder.

Bluetooth cihazına ait cihaz adı ve parolası gibi parametreler, chipsete aktarıldıktan sonra, bilgisayar üzerinde Bluetooth cihazlarını tarayarak kendi cihazınızı bulabilirsiniz. Cihazınızı ekledikten sonra, Device Manager'dan Ports bölümüne gelerek iletişimde kullanacağınız COM port adını görebilirsiniz. (Genellikle COM7 - 8 adresleri verilir.)

Bluetooth eşleştirmesini yaptıktan sonra, kendi uygulamanızla ya da bir terminal uygulaması ile iletişim kurmaya başlayabilirsiniz.

Bağlantı Şeması

-

BT RX: Digital 2
BT TX: Digital 3
BT RTS: Digital 7
BT CTS: Digital 8
BT 3.3V: 3.3V
BT GND: GND

Uygulama Kodları

Visual Studio'dan NetduinoWT41 adında Micro Framework Console Application oluşturun. Proje özelliklerinden SDK versiyonunu Netduino'nuza yüklü versiyon ile aynı olacak şekilde ayarlayın. (4.2) Proje referanslarına Microsoft.SPOT.Hardware.dll, Microsoft.SPOT.Hardware.SerialPort.dll, SecretLabs.NETMF.Hardware.dll ve SecretLabs.NETMF.Hardware.NetduinoPlus.dll dosyalarını ekleyin.

Micro Framework, seri port iletişiminde satır sonunu algılayan ReadLine metodunu içermiyor. Bunun yerine, Read metodu ile karakterleri tek tek işliyor. Bu durumu çözmek ve iletişimi kolaylaştırmak için geliştirdiğim BluetoothWT41 yardımcı class'ını öncelikle projenize ekleyin.

[C#] BluetoothWT41.cs

// Bluetooth WT41 Library
// Version: 1.2
// Copyright Umut Erkal - www.uerkal.com

//#define FirstTimeRun

using System;
using System.IO.Ports;
using System.Text;
using System.Threading;
using Microsoft.SPOT;

namespace NetduinoWT41
{
    #region Events
    // Data for Events
    public class BluetoothWT41EventArgs : EventArgs
    {
        private string receivedData;

        // Constructor
        public BluetoothWT41EventArgs(string receivedData)
        {
            this.receivedData = receivedData;
        }

        public string ReceivedData
        {
            get { return receivedData; }
        }
    }

    // Delegate Decleration
    public delegate void BluetoothWT41EventHandler(object sender,
        BluetoothWT41EventArgs e);
    #endregion

    public class BluetoothWT41 : IDisposable
    {
        private SerialPort btSerialPort;

        private static string incomingBuffer = string.Empty;
        
        public BluetoothWT41(string bluetoothSerialPort, bool enableHandshake)
        {
            btSerialPort = new SerialPort(bluetoothSerialPort, 115200,
                Parity.None, 8, StopBits.One);
            btSerialPort.Handshake =
                enableHandshake ? Handshake.RequestToSend : Handshake.None;
            btSerialPort.Open();
            BTInit();
            btSerialPort.DataReceived +=
                new SerialDataReceivedEventHandler(btSerialPort_DataReceived);
        }

        public void WriteLine(string _dataToSend)
        {
            if (btSerialPort.IsOpen)
            {
                btSerialPort.Write(Encoding.UTF8.GetBytes(
                    _dataToSend + "\r\n"), 0, _dataToSend.Length + 2);
            }
        }

        #region Internal Operations

        private void btSerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (e.EventType == SerialData.Chars)
            {
                byte[] input = new byte[btSerialPort.BytesToRead];
                btSerialPort.Read(input, 0, input.Length);

                foreach (byte item in input)
                {
                    if (item == 0x0A) { } // NL
                    else if (item != 0x0D) // !CR
                    {
                        // Buffer Capacity Check
                        if (incomingBuffer.Length > 256)
                            incomingBuffer = string.Empty;
                        incomingBuffer += new string(UTF8Encoding.UTF8.GetChars(
                            new byte[] { item }));
                    }
                    else // CR
                    {
                        BluetoothWT41EventArgs ea =
                            new BluetoothWT41EventArgs(incomingBuffer);
                        incomingBuffer = string.Empty;
                        OnDataReceived(ea);
                    }
                }
            }
        }

        private void BTInit()
        {
            // First time run set-up
            #if FirstTimeRun
            BTWrite("SET RESET", 3000);
            BTWrite("SET CONTROL ECHO 0", 500);
            BTWrite("SET BT NAME NETDUINO", 500); // Device Name
            BTWrite("SET BT AUTH * 12345678", 500); // Password
            #endif

            BTWrite("RESET", 1000);
        }

        private void BTWrite(string _command, int _wait)
        {
            btSerialPort.Write(UTF8Encoding.UTF8.GetBytes(_command), 0, _command.Length);
            btSerialPort.Write(new byte[] { 0x0D }, 0, 1);
            Thread.Sleep(_wait);
        }

        #endregion

        public void Dispose()
        {
            btSerialPort.Dispose();
        }

        #region Events
        public event BluetoothWT41EventHandler DataReceived;

        protected virtual void OnDataReceived(BluetoothWT41EventArgs e)
        {
            BluetoothWT41EventHandler handler = DataReceived;
            if (handler != null) handler(this, e);
        }
        #endregion
    }
}

Uygulamayı ilk kez çalıştırırken, // #define FirstTimeRun satırının başındaki comment'leri kaldırın ve BTInit metodundaki Device Name ile Password açıklamalarının olduğu satırların değerlerini değiştirin. Uygulama bir kez çalıştıktan sonra, bu değerleri değiştirmeyecekseniz #define FirstTimeRun satırını commentleyin. Bu yolla girmiş olduğunuz parametreler, Bluetooth modülünün hafızasında kalacak ve uygulama başlangıcınız birkaç saniye hızlanacaktır.

Uygulamayı deneyeceğimiz kodların bulunduğu Program.cs dosyası da aşağıdaki gibi olsun.

[C#] Program.cs

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;

namespace NetduinoWT41
{
    public class Program
    {
        // COM 2 üzerinde, handshaking'i aktive ederek
        // Bluetooth bağlantısını başlat
        // (Handshaking'e ait CTS ve RTS pinlerini kullanmak istemiyorsanız,
        // Enable Handshake parametresine false değeri verin.)
        static BluetoothWT41 bt = new BluetoothWT41("COM2", true);

        public static void Main()
        {
            // Bluetooth event handler'ını oluştur
            bt.DataReceived += bt_DataReceived;

            // Main thread'i uyut
            Thread.Sleep(Timeout.Infinite);
        }

        // Bluetooth üzerinden alınan satır tamamlandığında:
        static void bt_DataReceived(object sender, BluetoothWT41EventArgs e)
        {
            // Gelen satırı Immediate Window'da yazdır
            Debug.Print(e.ReceivedData);

            // Gelen satırı geri gönder
            bt.WriteLine(e.ReceivedData);
        }
    }
}

Bu aşamadan sonra, uygulamayı mikrodenetleyiciye yüklediğinizde bilgisayardan gönderdiğiniz \r\n ile biten satırlar işlenecek ve Immediate Window'da gösterilecektir. Aynı zamanda, çift taraflı iletişimi test edebilmeniz için gönderdiğiniz veri bilgisayarınıza da aktarılacaktır.

Mikrodenetleyicinizin sınırlı RAM'i olduğu için, bir satırın uzunluğunun 256 karakter olduğunu unutmayın. Dilerseniz bu değeri, BluetoothWT41 class'ı içerisinden değiştirebilirsiniz.


Ek Dosya: Belirtilmemiş.
Okunma Sayısı: 1993

comments powered by Disqus
 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi