C# ile Serialden Integer Değer Gönderme

C# üzerinden Arduino'yu kontrol ederken kimi zaman da integer yani tamsayı değerleri göndermemiz gerekebilir. Bunun için göndereceğimiz sayıyı byte'lar halinde göndermemiz gerekir. Aşağıda ilgili kısmı ayrı şekilde yazarak bir uygulama yapalım.

Arayüzü Arduino'ya bağlantı yapacak ve int değer gönderecek şekilde basitçe tasarlıyoruz.


Kodumuzun aşağıdaki kısmında "int" olarak tanımladığımız değişkeni bit'lere dönüştürüp "byte" olarak tanımlanan başka bir değişkene atanır. Byte değişkeni de serial üzerinden gönderilir.

                int MyInt = Convert.ToInt32(textBox1.Text);
                byte[] b = BitConverter.GetBytes(MyInt);
                serialPort1.Write(b, 0, 4);

Arayüzün kodları ise aşağıdaki gibidir.


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 İntegersend
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < System.IO.Ports.SerialPort.GetPortNames().Length; i++)
            {
                comboBox1.Items.Add(System.IO.Ports.SerialPort.GetPortNames()[i]);
            }

        }

        private void connection_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.Text;
            label1.Text = "Arduino'ya Bağlandı (" + comboBox1.Text + ")";
            serialPort1.Open();

        }

        private void send_button_Click(object sender, EventArgs e)
        {
                int MyInt = Convert.ToInt32(textBox1.Text);
                byte[] b = BitConverter.GetBytes(MyInt);
                serialPort1.Write(b, 0, 4);
           
        }
    }
}

Arayüz ile gönderilen verileri Arduino'da okumak içinde aşağıdaki gibi basit bir uygulama yapılabilir.


int LedPin = 13;
int k;
void setup() {

Serial.begin(9600);
pinMode(LedPin,OUTPUT);
}
void loop() 
{
  if(Serial.available()) 
    {
      k = Serial.read();
      if(k == 101)
      {
        digitalWrite(LedPin,HIGH);
      }
      if(k == 125)
      {
          digitalWrite(LedPin,LOW);
      }
    }
    
  }

C# üzerinden gönderilen bu tamsayı verisi serial üzerinden arduino'da çeşitli amaçlar için kullanılabilir. Örneğin bir DC motorun hız kontrolünde yada servo motorun açı değerlerini PC üzerinden gönderebilirsiniz.

İlerleyen yazılarda mouse hareketleri ile Servo motor kontrolü ve benzerleri uygulamalar da yayınlayacağım. İyi çalışmalar.

12 yorum

Click here for yorum
Unknown
admin
Mart 09, 2015 ×

Allah razı olsun ingilizce forumlarda günlerdir bulamadığım integer gönderimini burada buldum.Teşekkürler faydalı oldu.

Reply
avatar
mvaslan
admin
Mart 09, 2015 ×

Ben de çok aramıştım bir zamanlar.. :) Faydalı olduğuna sevindim.. Takipte kal çokça örnek paylaşacam burada..

Reply
avatar
Unknown
admin
Mart 09, 2015 ×

Bi sorum daha var zorlandığım mesala 56 yı gönderdik Arduino tarafında nasıl bir kodla alıcaz bu sayıyı? Bilginiz var mı?
Arduino kodu da olsaydı çok makbule geçerdi :)

Reply
avatar
mvaslan
admin
Mart 09, 2015 ×

Bekle bakalım hemen yazıyı güncelleyeyim o halde.. Başkaları da görmüş olur hem..

Reply
avatar
mvaslan
admin
Mart 09, 2015 ×

Güncellendi...

Reply
avatar
Unknown
admin
Mart 09, 2015 ×

Bu şekilde veriyi aldığımda Proteusda ledi yakamadım :( acaba başka türlü mü almak gerekiyo veriyi daha öncede bu şekilde denemiştim.

Reply
avatar
mvaslan
admin
Mart 09, 2015 ×

Onun için Proteusta COM port eklemen lazım..
http://mvaslan.blogspot.com.tr/2015/03/proteus-isis-arduino-serial-baglant.html

Reply
avatar
Unknown
admin
Nisan 28, 2016 ×

hocam, serialPort1.Write(b, 0, 4);
bu koddaki 0 ve 4 değeri ne anlama geliyor, açıklarmısınız lütfen ?

Reply
avatar
mvaslan
admin
Nisan 28, 2016 ×

Gönderebileceğin maksimum basamak sayısı oradaki 4

Reply
avatar
Aralık 03, 2016 ×

Merhaba mvaslan, C#'dan veri yolluyorum (tamsayı değeri) ama arduino'ya 0 ya da -1 olarak gidiyor nasıl yapabilirim?

Reply
avatar
mvaslan
admin
Ocak 24, 2017 ×

Merhaba Furkan. Yapmak istediğin şeyin aslında bir çok yolu var bunun temeli de C# da kullandığın bileşenin değerini belirlediğin bir int değere dönüştürmek ve göndermek.

Yukarıdaki C# kodundaki şu satır gibi;
int MyInt = Convert.ToInt32(textBox1.Text);

Textbox'ın verisini yukarıdaki gibi integer değere dönüştürüp sonrasında gönderiyor.
Sen sadece 10 ve 5 değerlerini göndereceksen bunu textboxa yazmak yerine buton ile de yapabilirsin. İki buton belirleyip buton olaylarına int MyInt=10; ve diğerine MyInt=5; yapıp direk gönderebilirsin.

Bunların dışında Trackbar bileşeni kullanıp 0 dan 10 a kadar değer gönderebilirsin trackbarın imlecini değiştirerek. Bu yazımdan örnek alabilirsin: https://mvaslan.blogspot.com.tr/2015/02/csharp-ile-arduino-servo-motor-kontrolu.html

Veriyi gönderdikten sonra yapılacak işlemleri de arduino da yazarsın. Umarım Açıklayıcı olmuştur. İhtiyaç olursa bu yorumun altına post at. Kolay gelsin.

Reply
avatar
mvaslan
admin
Ocak 24, 2017 ×

O zaman şöyle yapalım Furkan. Biraz Uzun olabilir bu yöntem. Sen Bir adet Textbox ve iki adet Buton kullan. Butonlardan biri ileri gitmesi için diğeri geri gelmesi için olsun. Textbox a yazdığın kadar ileri gitmek için İleri Butonun olayına;

serialPort1.Write("F");
// Forward anlamında F ile arduinoda ileri iişlemini tetikle. Ardından Arduinoda tekrar okuma yaptır.Ardından gelecek değeri ileri için kullansın.

int MyInt = Convert.ToInt32(textBox1.Text);
byte[] b = BitConverter.GetBytes(MyInt);
serialPort1.Write(b, 0, 4);


C# arayüzündeki geri butonuna da aşağıdaki işlemi yaptır. Textboxdaki değeri arduinodaki geri fonksiyonunu tetikleyecek şekilde önce "B" karakteri sonra değeri göndersin.

serialPort1.Write("B");
// Back anlamında B ile arduinoda geri işlemini tetikle. Ardından Arduinoda tekrar okuma yaptır.Ardından gelecek değeri geri işlemi için kullansın.

int MyInt = Convert.ToInt32(textBox1.Text);
byte[] b = BitConverter.GetBytes(MyInt);
serialPort1.Write(b, 0, 4);
F ve B için arduinoda bir değişken belirle milmetre için farklı bir integer. bunları fonksiyonlar işlemlerini yaptıktan sonra sıfırla ki farklı değerler geri için işlem yapmasın. BU ortamda zor oluyor anlaşabilmek ama elimden geldiğince.

Bu işlemi uygula tabi önce düşündüklerimi biraz kağıt kalem ile bi karala derim. Ben şimdi öyle yaptım :) Kolay gelsin.

Reply
avatar