Posted by : MC 4 Mart 2015 Çarşamba



Son günlerde sıkça gelen sorular üzerine Arduino ve c# arasında ethernet portu kullanarak basit bir led acma ve kapama devresi uygulamasını bu yazımızda ele alacagız.

Ethernet ile haberlesme bilgiyi uzak mesafelere taşımak için oldukça kullanışlı bir haberleşme metodu.Arduino ile gerçekleştirilen birçok projede ethernet shield yardımı ile internet üzerinden haberleşme sağlandığını görüyoruz.İsterseniz şimdi gelin kendi uygulamamıza geçelim.

Uygulamamızda kullandığımız materyeller

1 adet arduino uno

1 adet seed studio ethernet shield

1 adet 330 ohm direnç

2 adet kablo

1 adet ethernet kablosu




Yukarıda da görüldüğü üzere programımızda 3 adet buton tanımladık.Bağlan butonuna bastıgımızda programda yazmıs olduğumuz ethernet socketi üzerinden bilgisayarımız ve arduino arasında socket programlama sayesinde bir port açılacak.

Sonrasıda yak butonuna bastığımızda arduinomuzdaki led devremiz yanacak.Söndür butonuna bastığımızda ise arduinomuza baglı olan led devresi sönecek.

Peki bu olayı nasıl sağlayacağız ?

Arduino IDE üzerindeki örnek programlardan ethernet kütüphanesi içerisinde bulunan chat serverdan üzerinde bir kaç ufak değişiklik yaparak yararlanacağız.

Bu durumda ne olacak ?

Arduinomuz bizden veri alıp-gönderebilen bir server konumunda olacak ve bunun karşılığında bizim bilgisayarımızda çalışan program ise client özelliği taşıyacak.

Sistem nasıl çalışacak ?

Biz client tarafında arduinomuza socket üzerinden ethernet fiziksel alt yapısı ile "a" harfini mesaj olarak gönderdiğimizde arduinoda ledimiz yanacak."A" harfini gönderdiğimizde ise arduinoda ledimiz sönecek.

Gelilim arduino tarafındaki kodlarımıza:

#include <SPI.h>
#include <EthernetV2_0.h>//ethernet kutuphanemiz eklendi
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//mac adresi tanımlı
IPAddress ip(192,168,1, 177);//arduinomuzun ip si
IPAddress gateway(192,168,1, 1);//alt ağ geçidi
IPAddress subnet(255, 255, 255, 0);//alt ağ maskesi
EthernetServer server(23);//Haberleşeceğimiz port numarası
boolean alreadyConnected = false; // Client baglımı değilmi ? değişkenimiz
#define W5200_CS 10
#define SDCARD_CS 4
void setup() {
pinMode(SDCARD_CS,OUTPUT);
digitalWrite(SDCARD_CS,HIGH);
Ethernet.begin(mac, ip, gateway, subnet);// Ethernet portumuzu başlatıyoruz
server.begin();// server başlatıldı clientı bekliyoruz
pinMode(7,OUTPUT);//7 nolu pine ledimizi bağlayacağız output yaptık}
void loop() {
EthernetClient client = server.available();//Client isteği geldiğinde client adında programımız baglanacak
if (client) {// program baglandımı ?
if (!alreadyConnected) //Program önceden bağlımıydı ? bağlantı geldi ise
client.flush();
alreadyConnected = true;//Şu anda bağlı bilgisini true yap
}
if (client.available() > 0) {//Client bağlı mı ?
char thisChar = client.read();//Client bağlı ise gelen veriyi tek karakterlik değişken içine al
if(thisChar=='a')//gelen veri "a" ise
{
digitalWrite(7,HIGH);//7 nolu pine baglı olan ledi yak
}
if(thisChar=='A')// gelen veri "A" ise
{
digitalWrite(7,LOW);//7 nolu pine bağlı ledi söndür
}
}
}
}

Peki c# tarafında kodlarımız neler gelin birde onları iredeleyelim.

using System;
using System.Collections.Generic;
using System.ComponentModel;using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;//Eklediğimiz .net için socket kütüphanemiz
namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
System.Net.Sockets.TcpClient arduinom = new System.Net.Sockets.TcpClient(); //arduinom adında yeni bir tcp client tanımladık
public Form1()
{
InitializeComponent();
yak.Enabled=false;//baslangıcta hata ile basmamak icin inaktif olsun baglantı olmadan veri gondermeye kalkmayayım
sondur.Enabled=false; //baslangıcta hata ile basmamak icin inaktif olsun baglantı olmadan veri gondermeye kalkmayayım
 }
private void yak_Click(object sender, EventArgs e)// yak butonumuz tıklandıgında
{
NetworkStream serverStream = arduinom.GetStream();//server stream adında iletişim ağı kurduk ve arduino adındaki client ile ilişkilendirdik
byte[] gonderi = System.Text.Encoding.ASCII.GetBytes("a");//byte olarak bir gönderi oluşturduk ve encoding tipini ascii belirledik verilerimizi bu stream üzerinden yollayacağız
serverStream.Write(gonderi, 0, gonderi.Length);//outStream ile göndereceğimiz veriyi tcp üzerinden arduinoya gönderiyoruz.
serverStream.Flush();//veriyi gönderdikten sonra tcp hattımızı temizliyoruz.
}
private void sondur_Click(object sender, EventArgs e)// sondur butonumuz tıklandıgında
{
//yukarıda belirttiğimiz işlemi led "A" göndermek için tekrarlıyoruz
NetworkStream serverStream = arduinom.GetStream();
byte[] gonderi = System.Text.Encoding.ASCII.GetBytes("A");
serverStream.Write(gonderi, 0, gonderi.Length);
serverStream.Flush();
}
private void baglan_Click(object sender, EventArgs e)// baglan butonumuz tıklandıgında
{
try
{
arduinom.Connect("192.168.1.177", 23);// 23 portu üzerinde arduino ip si ile baglanmayı deniyoruz
MessageBox.Show("baglantı saglandı"); // baglantı saglanırsa ekrana baglantı saglandı bilgisi basılıyor
baglan.Enabled = false;//2 kere baglanamayacağımızdan baglan butonunu inaktif edeiyoruz
yak.Enabled=true;// baglantı var veri gonderebilirim yak aktif olsun
sondur.Enabled=true; //baglantı var veri gonderebilirim sondur aktif olsun
}
catch (Exception a)// baglantı kurulamadı ise
{
MessageBox.Show("baglantı yok tekrar baglanmayı deneyiniz");//baglantı yok tekrar baglan uyarısı ekrana bastırılıyor
yak.Enabled=false;// baglantı yok veri gonderemem yak butonu inaktif olsun
sondur.Enabled=false;//baglantı yok veri gonderemem sondur butonu inaktif olsun
baglan.Enabled = true;//baglan butonu aktif olsun tekrar baglanmayı deneyebileyim
}
}
}
}


Özetlemek gerekirse

Arduinomuz server,programımız ise client oldu.İkisi arasında arduinomun 192.168.1.177 ip sini ve 23 nolu portu kullanarak iki nokta arasında tcp bir baglantı sagladık.Sonrasında ise bu baglantı içerisinde bir stream tanımlayarak arduinomuza veri göndermek sureti ile :) 7 nolu pinimizi kontrol etmiş olduk.

Umarım yararlı bir yazı olmuştur.Bir sonraki yazımızda yeniden görüşmek dileği ile.

{ 13 Comments... read them below or Comment }

  1. Merhabalar,
    İlginizden ve emeğinizden dolayı teşekkür ederim. Uygulamayı yaptım gayet düzgün bir şekilde çalıştı. Bu uygulamadan sonra bir üst uygulamayı yapmak için uğraştım, fakat yapamadım. Uygulama şu şekilde ; Arduinonun 4.pinine bağlı ola butona her bastığımda saydırma işlemi yapıyorum. (x=x+1;) Bu sayılan x değerini C# platformunda görmek istiyorum. Yardımlarınız için şimdiden teşekkür ederim..

    YanıtlaSil
    Yanıtlar
    1. arduino tarafında arttırdıgınız degeri client.write(x); olarak ethernet uzerinden basmanız gerekir

      C# tarafında ise networkstream classın bir fonksiyonu olan beginRead(); metodunu kullanmanız gerekir

      beginRead() kullanım örneği : https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.beginread(v=vs.110).aspx

      burada dikkat etmeniz gereken sürekli olarak gelen veri paketi varmı kontrol etmek bunuda ister bir timer istersenizde multithreading metodu ile halledebilirsiniz

      Sil
    2. Merhaba;
      Öncelikle çok tşk ederim. C# deneyimim az olduğu için entegre edemedim. Rica etsem ekteki dosyada yukarıdaki örnek var. Bu örneğe uyarlıyabilirmisiniz? Tekrar tşk ederim.
      https://yadi.sk/d/__ijw9lyjSh7S

      Sil
  2. tekrar merhaba Ümit,
    iş yoğunluğum dolayısı ile malesef projene bakma fırsatı yakalayamadım

    YanıtlaSil
  3. https://drive.google.com/open?id=0B2VEZfViKgkNS0pJZ0pwVHZmd28
    hızlı bir şekilde thread tanımlayarak veri alma fonksiyonu yarattım deneme fırsatım olmadı umarım işinize yara

    YanıtlaSil
    Yanıtlar
    1. Mehmet bende bu dosyaya ulaşmaya çalıştım ama sanırım kaldırılmış rica etsem benimle de paylaşırmısnız. teşekkür ederim.

      Sil
  4. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  5. Merhaba

    Ethernet shield yerine gps -gsm shield kullanabilir miyim. Aynı bu şekilde ip adresinden bağlanmak istiyorum ama. Sms yada çağrı atarak değil. Yardımcı olursanız sevinirim

    YanıtlaSil
  6. kardesım networkstream kısmında ınvalıdexceptıon alıyorum neden olabılır?

    YanıtlaSil
  7. Selamlar; Örnek çok güzel. Malesef nadide Türkçe örneklerden. Benim yapmaya çalıştığım bir proje (kendi çapında); ben ip sini bildiğim cihaz ve/veya cihazlara bağlanmak istiyorum. Bu nedenle bağlan butonu önüne ip için girilecek bir satır bırakmak istiyorum. Buraya yazdığım ip ye bağlanmasını. Bu kolay. Ancak yapamadığım şu; bağlan dediğimde bağlanacak ama arduinodan da benim bağlandığıma dair bir bilgi gelmesini, programdada bunun ekranda görünmesini istiyorum. Mesela ekranda "bağlandı" yazabilir. Yani arduinoda bir bağlandı bilgisi istiyorum. Harf olur, karakter olur artık o her ne oursa. Birde sizin yaptığınız programda, bağlan dediğinizde program tam olarak ne yapıyor. Arduino ya ne yolluyor. Kolay gelsin.

    YanıtlaSil
  8. selam . güzel anlatım teşekkürler.

    YanıtlaSil
  9. Merhabalar,

    Uygulamayı denediğimde C# arayüz ile bağlantı hatası yaşıyorum. IP ayarlarını nasıl yapmam gerekiyor acaba

    YanıtlaSil

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger