Öncelikle Herkese Merhaba
Yapacağımız bazı Arduino uygulamalarını bilgisayarımızla haberleştirmemiz gerekebiliyor. Bir Windows Form uygulaması ile bunun nasıl yapılacağını anlatmak istedim.
Arduino kısmından bahsetmeyeceğim, C# kısmı şu şekilde;
C# kısmı
Öncelikle kullanacağımız kütüphaneleri ekliyoruz. Kamera görüntüsü için Aforge kütüphanesi, Haberleşme için IO kütüphanesi.
using System.IO.Ports; using AForge.Video; using AForge.Video.DirectShow;
Bluetooth cihazları ve kameralar için birer Global değişken oluşturuyoruz
FilterInfoCollection cihazlar; VideoCaptureDevice kamera;
Portlardan alınan bilgiler ile bluetooth cihazlarını ve kameralarını combobox’lara dolduruyoruz
if (serialPort1.IsOpen) serialPort1.Close(); combohizlar.Items.Clear(); comboportlar.Items.Clear(); combohizlar.Items.Add("9600"); cihazlar = new FilterInfoCollection(FilterCategory.VideoInputDevice); foreach (string portlar in SerialPort.GetPortNames()) comboportlar.Items.Add(portlar); foreach (FilterInfo cihaz in cihazlar) { cmbKamera.Items.Add(cihaz.Name); } kamera = new VideoCaptureDevice();
Şimdi seçilen portlara göre hangi cihaza bağlanacağını ayarlıyoruz. Bağlanma sağlanamazsa ekrana hata mesajı basıyoruz.
private void button6_Click_1(object sender, EventArgs e) { if (serialPort1.IsOpen) { serialPort1.Close(); // btnbaglan.Text = "Bağlan"; } try { if (!serialPort1.IsOpen) { serialPort1.PortName = comboportlar.SelectedItem.ToString(); serialPort1.BaudRate = Convert.ToInt32(combohizlar.SelectedItem); MessageBox.Show("Bağlandı!"); } } catch { } try { serialPort1.Open(); serialPort1.Write("*"); } catch { MessageBox.Show("Bağlantı Kurulmadı: \n" + serialPort1.PortName.ToString() + " " + serialPort1.BaudRate.ToString()); return; }; }
Basılan butonlara göre arduinoya gönderilecek char verilerini belirleyip port üzerinden gönderme işlemi yapıyoruz. İşlem başarısız olursa ekrana hata mesajı basıyoruz.
private void button1_Click_1(object sender, EventArgs e) { try { serialPort1.Write('w'.ToString()); lbDurum.Text = "İleri Gidiyor!"; } catch { MessageBox.Show("İleri Gitmiyor!"); } } private void button3_Click_1(object sender, EventArgs e) { try { serialPort1.Write('a'.ToString()); lbDurum.Text = "Sola Gidiyor!"; } catch { MessageBox.Show("Sola Gitmedi"); } } private void button5_Click_1(object sender, EventArgs e) { try { serialPort1.Write('x'.ToString()); lbDurum.Text = "Durdu!"; } catch { MessageBox.Show("Durmadi!"); } } private void button4_Click_1(object sender, EventArgs e) { try { serialPort1.Write('d'.ToString()); lbDurum.Text = "Sağa Gidiyor!"; } catch { MessageBox.Show("Sağa Gitmedi"); } } private void button2_Click_1(object sender, EventArgs e) { try { serialPort1.Write('s'.ToString()); lbDurum.Text = "Geri Gidiyor!"; } catch { MessageBox.Show("Geri gitmedi!"); } }
Kameraya bağlanma ve görüntü alma işlemlerini yapıyoruz
private void button7_Click_1(object sender, EventArgs e) { if (kamera.IsRunning) { kamera.Stop(); pictureBox2.Image = null; pictureBox2.Invalidate(); } else { kamera = new VideoCaptureDevice(cihazlar[cmbKamera.SelectedIndex].MonikerString); kamera.NewFrame += new NewFrameEventHandler(cam_NewFrame); kamera.Start();//kamerayı başlatıyoruz. } }
Son olarak Kameradan alınan görüntü için bir bitmap oluşturuyoruz ve görüntüyü buraya atıyoruz
private void cam_NewFrame(object sender, NewFrameEventArgs eventArgs) { Bitmap bit = (Bitmap)eventArgs.Frame.Clone(); pictureBox2.Image = bit; }
Kodun birleştirilmiş hali de şu şekilde;
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; using AForge.Video; using AForge.Video.DirectShow; namespace TankKontrol { public partial class Form1 : Form { FilterInfoCollection cihazlar; VideoCaptureDevice kamera; public Form1() { InitializeComponent(); } public delegate void AddDataDelegate(String myString); public AddDataDelegate myDelegate; private void Form1_Load(object sender, EventArgs e) { if (serialPort1.IsOpen) serialPort1.Close(); combohizlar.Items.Clear(); comboportlar.Items.Clear(); combohizlar.Items.Add("9600"); cihazlar = new FilterInfoCollection(FilterCategory.VideoInputDevice); foreach (string portlar in SerialPort.GetPortNames()) comboportlar.Items.Add(portlar); foreach (FilterInfo cihaz in cihazlar) { cmbKamera.Items.Add(cihaz.Name); } kamera = new VideoCaptureDevice(); } private void cam_NewFrame(object sender, NewFrameEventArgs eventArgs) { Bitmap bit = (Bitmap)eventArgs.Frame.Clone(); pictureBox2.Image = bit; } private void button6_Click_1(object sender, EventArgs e) { if (serialPort1.IsOpen) { serialPort1.Close(); // btnbaglan.Text = "Bağlan"; } try { if (!serialPort1.IsOpen) { serialPort1.PortName = comboportlar.SelectedItem.ToString(); serialPort1.BaudRate = Convert.ToInt32(combohizlar.SelectedItem); MessageBox.Show("Bağlandı!"); } } catch { } try { serialPort1.Open(); serialPort1.Write("*"); } catch { MessageBox.Show("Bağlantı Kurulmadı: \n" + serialPort1.PortName.ToString() + " " + serialPort1.BaudRate.ToString()); return; }; } private void button1_Click_1(object sender, EventArgs e) { try { serialPort1.Write('w'.ToString()); lbDurum.Text = "İleri Gidiyor!"; } catch { MessageBox.Show("İleri Gitmiyor!"); } } private void button3_Click_1(object sender, EventArgs e) { try { serialPort1.Write('a'.ToString()); lbDurum.Text = "Sola Gidiyor!"; } catch { MessageBox.Show("Sola Gitmedi"); } } private void button5_Click_1(object sender, EventArgs e) { try { serialPort1.Write('x'.ToString()); lbDurum.Text = "Durdu!"; } catch { MessageBox.Show("Durmadi!"); } } private void button4_Click_1(object sender, EventArgs e) { try { serialPort1.Write('d'.ToString()); lbDurum.Text = "Sağa Gidiyor!"; } catch { MessageBox.Show("Sağa Gitmedi"); } } private void button2_Click_1(object sender, EventArgs e) { try { serialPort1.Write('s'.ToString()); lbDurum.Text = "Geri Gidiyor!"; } catch { MessageBox.Show("Geri gitmedi!"); } } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.W) lbDurum.Text = "w"; } private void cmbKamera_SelectedIndexChanged(object sender, EventArgs e) { } private void button7_Click_1(object sender, EventArgs e) { if (kamera.IsRunning) { kamera.Stop(); pictureBox2.Image = null; pictureBox2.Invalidate(); } else { kamera = new VideoCaptureDevice(cihazlar[cmbKamera.SelectedIndex].MonikerString); kamera.NewFrame += new NewFrameEventHandler(cam_NewFrame); kamera.Start();//kamerayı başlatıyoruz. } } private void button8_Click_1(object sender, EventArgs e) { if (kamera.IsRunning) kamera.Stop(); else MessageBox.Show("Zaten çalışmıyor"); } } }
Görüntüler
Programın Çalışırken ki ekran görüntüsü