Arduino İle C# Haberleşme

Projelerinizde arduinodan aldığınız verileri bilgisayara göndermek veya bilgisayardan arduinoya göndermek istiyor olabilirsiniz. Bunun için ilk başta bizim Arduino İle C# Haberleşme nasıl gerçekleşir bunu öğrenmemiz lazım. Yazımızda sıfırdan bir anlatım yapacağız. Bu işlemi Thread ile yapacağız. Thread kullanmamızın sebebini yazımızda anlatacağım. Hadi gelin projemize başlayalım.

Projede gerekli uygulamalar ve elemanlar:

  • Arduino Uno
  • Visual Studio(Ben 2022 sürümünü kullanacağım siz istediğiniz ).
  • Arduino IDE

Programları kurduysanız hadi başlayalım.

  • Arduinoya aşağıdaki kodları yükleyelim. Arduino kodumuzda ne yapılmak istenmiş? Seri haberleşmeden veri geldiyse bunu oku ve okanan verinin arduino tarafından okunduğunu seri haberleşmeye yazdırma işlemi yapılmıştır.

void setup()
{
  //haberleşme hızımızı ayarlıyoruz.
  Serial.begin(9600);
}

void loop()
{
// gelen veri var mı kontrolü yapıyoruz ve varsa veriyi okuyup seri haberleşmeye yazıyoruz.
if(Serial.available()>0){
  String gelenveri = Serial.readString();
  Serial.println(gelenveri+" :Verisi arduino tarafindan alindi.");
}
delay(10); // 10ms bekletme yapıyoruz.
}
  • Artık arduino tarafında işimiz bitti. C# ile arayüzümüzü ve kodlarımızı yazmaya geçelim.

Arduino İle C# Haberleşme Programı Arayüz Tasarımı

  • Visual Studio da proje türümüzü seçelim
C# Proje Oluşturma
  • Daha sonra projemizi isimlendirelim.
C# Proje isimlendirme
  • Daha sonra proje arayüzümüzü aşağıdaki gibi oluşturalım.. Siz daha sonra kendinize göre arayüzü değiştirebilirsiniz.
Arduino İle C# Haberleşme Programı Arayüz Tasarımı
Arduino İle C# Haberleşme Programı Arayüz Tasarımı

Haberleşme Programının Kodlanması

  • Projemize bilgisayarın portlarını kullanabilmemiz için IO kütüphanesini ve thread kütüphanesini ekliyoruz.
using System.IO.Ports;
using System.Threading;
  • Bilgisayarımıza takılı olan arduino kartlarını bulmak için “Ara” adlı butonumuza aşağıdaki kodu yazıyoruz.
            comboBox1.Items.Clear();
            string[] ports = SerialPort.GetPortNames();


            // Display each port name to the console.
            foreach (string port in ports)
            {
                comboBox1.Items.Add(port);
            }
  • İkinci combobox’ımıza arduinonun haberleşme hızlarını yazacağız. Aşağıdaki haberleşme hızları arduino kartlarının kullanabileceği bağlantı hızları.
300
600
1200
2400
4800
9600
14400
19200
28800
31250
38400
57600
115200
  • Globale şimdi aşağıdaki değişkenleri tanımlıyoruz. Biz arduinodan gelen verileri okumak için thread kullancağız. Neden diye soracak olursanız. İnternette arduino ile c# haberleşmesini anlatan birçok kaynak var ama onlar okuma işlemini genellikle timer ile yaptırmaktadırlar. Eğer okuma zaman aralığını çok kısa tutarlar ise programımız donar ve yanıt vermez. Biz thread kullanarak programımızın aynı anda birden fazla iş yapmasını sağlayarak donmasını engelliyoruz. Form yükleme kısmına yazdığımız kod ile bizim thread işlemi ile çakışacak olan işlemleri engelleyeceğiz.
Global değişkenler ve thread çakışma engelleme

Global değişkenlerimiz:

        SerialPort portBaglanti;
        Thread thread1;
        private volatile bool ThreadDurum=false;

Thread ile çakışacakları işlemleri engellemek için aşağıdaki kodu ekliyoruz:

Control.CheckForIllegalCrossThreadCalls = false;
  • Portu açmak ve seri haberleşmeyi başlatmak için “Port Aç” adlı butona yazılacak kodlar:
            ThreadDurum = false;
            //bağlantı oluşturuyoruz
            portBaglanti = new SerialPort();
            //port ismini ayarlıyoruz
            portBaglanti.PortName = comboBox1.SelectedItem.ToString();
            //bağlantı hızını ayarlıyoruz
            portBaglanti.BaudRate = Convert.ToInt32(comboBox2.SelectedItem.ToString().Trim());
            //bağlantıyı açıyoruz
            portBaglanti.Open();
            //threadımızı oluşturup çalıştıracak fonsiyonu yazıyoruz
            thread1 = new Thread(new ThreadStart(PortAc));
            //thread1 çalıştırılır
            thread1.Start();

Burada ThreadDurum değişkeni bizim threadı durdurmamız için kullanacağımız değişken. Thread’ı başlatırken PortAc diye bir fonksiyon yazdık. Bu fonsiyon okuma işleminin yapıldığı fonksiyondur. Kodları aşağıda bulunmakta:

        private void PortAc()
        {
            try
            {
                String veri = "";
                label5.Text = "Bağlanıldı";
                if (portBaglanti.IsOpen == true)
                {
                    while (ThreadDurum == false)
                    {
                        //threadı durdurmak için ThreadDurum değişkenini kontrol ettiriyoruz
                        if (ThreadDurum == false)
                        {
                            //veriyi okuyup listboxa ekliyoruz
                            veri = portBaglanti.ReadLine();
                            listBox1.Items.Add(veri);
                            //çok fazla işlemci yememesi için biraz duraklatma yaptırıyoruz
                            System.Threading.Thread.Sleep(100);
                        }
                        else
                        {
                            thread1.Abort();
                        }

                    }

                }
            }
            catch (Exception)
            {
                label5.Text = "Bağlantı kesildi";
            }


        }
  • “Port Kapat” butonuna ise aşağıdaki kodlar ile port bağlantısını ve okuma işlemini bitiriyoruz.
            ThreadDurum = true;
            label5.Text = "Bağlantı kesildi!";
            portBaglanti.Close();
  • Gönder butonuna yazılacak kodlar:
            portBaglanti.Write(textBox1.Text);
            listBox1.Items.Add(textBox1.Text + " :verisi C# tarafından arduinoya gönderildi.");

Artık c# programımızda hazır. Şimdi programımızı açalım, port ve haberleşme hızını seçelim. Port aç diyerek haberleşmeyi başlatalım. Veri gönderdiğimizde sonuç aşağıdaki resimdeki gibi olacaktır.

Arduino İle C# Haberleşme Programı
Arduino İle C# Haberleşme Programı

Arduino kodunu ve oluşturduğumuz c# programının kodlarını aşağıdan indirebilirsiniz.