Arduino Ethernet Shield ile TCP İletişim

Merhaba arkadaşlar,

Bu konuda Arduino UNO ve W5100 Ethernet shield kullanarak TCP server kuracağız.  Bu server Node JS ile oluşturduğumuz bir web uygulaması ve C# ile oluşturduğumuz bir windows form ile bağlanmayı deniyeceğiz. Bu sayede internet iletişiminin platformdan bağımsız olduğunu da gözle olacağız.

Öncelikle arduino tarafında server’ ı oluşturalım. Server’ da iki led iki adet de analog sensör olsun. Led lerin durumlarını ve sensör değerlerini client’ lar üzerinden okumayı deneyelim. Bağlantımızı aşağıdaki gibi yapalım.

Resmi büyültmek için üzerine tıkla
+ Resmi büyültmek için üzerine tıkla

Analog sensörler yerine potansiyometre de bağlıyabilirsiniz maksat değişimi gözlemleyebileceğimiz analog cihazlarımızın olması. Sıra geldi yazılım kısmına. Arduino’ nun Ethernet kütüphanesini kullanacağımız için yazılım son derece basit. Bazı önemli noktalara değinelim.

IPAddress ip(169, 254, 145, 11);
IPAddress myDns(169, 254, 1, 1);
IPAddress gateway(169, 254, 1, 1);
IPAddress subnet(255, 255, 0, 0);

Bu kısımdaki IP adresi sizin cihaza atadığınız statik IP adresidir. Bu IP adresi bilgisayarın ethnernet shield’ den aldığı IP adresi ile aynı olmamalıdır.  Diğer ayarlar bu aşamada çok önemli değiller. Server kurulumu ve port atamasına bakalım.

EthernetServer server(61);

Bu satırda server 61 portuna kurmuş olduk. Yani aslında bizim tam bağlantımız 169.254.145.11:61 şeklinde olmuştur. 61 seçmemin sebebi Trabzon’ un plaka numarası olmasındadır. Yani tamamen keyfidir, siz değiştirebilirsiniz. Ancak 80 yada 8080 gibi tarayıcıların default olarak kullandığı port’ ları çok fazla kullanmamanız sizin için daha iyi olacaktır. Arduino yazılımının tamamına buradan ulaşabilirsiniz. Yazılım algoritmamız şöyle olsun:

Client’ dan:

  • a değeri alınca zaman led1′ i yakalım
  • b değeri alınca LM35′ den sıcaklık değeri alalım
  • c değeri alınca zaman led2′ yi yakalım
  • d değeri alınca LDR’ den değer alalım

Bu değerleri client gönderecek şekilde ayarlayalım. Server’ a bağlanma ve gönderme işlemi javascript ile şu şekilde halledebiliriz.

var client = new net.Socket();     //bağlantıyı oluşturduk

client.connect(61, '169.254.145.11', function() {    //ilgili IP nin ilgili portuna bağlandık
	console.log('Connected');
});

client.write('a');   //clientten b değeri gönderdik

Daha önceden Javascript ile uğraşmamış birisi için bile anlaşılması son derece basit kodlar.  Bağlantıyı gerçekleştirip a değerini gönderik. Bu kodu bir javascript dosyasına kaydedik nodejs ile çalıştırırsanız 3 nolu pine bağlı led’ in yandığını gözlemleyeceksiniz. Peki bunu bir web arayüzünden yapmak istersek o zaman işler biraz daha karışıyor. Ama sadece biraz .. :)

Bir web sitesi oluşturmak istediğimiz için bir server’ a ihtiyacımız var. Bu server’ ı nodeJs bize sağlıyor. Peki ya butona basınca server ile iletişimi nasıl sağlayacağız ki o da TCP soket yardımı ile Arduino ile haberleşsin? Burda da socket.io denen bir framework yardıma yetişiyor. Biraz karışık gelen haberleşme mimarisi şekil üzerinde aslında aşağıdaki gibi..

yapi

Olayı paint ortamında resmettiğimiz zaman son derece basit görünüyor ki bundan sonrası biraz web ile uğraşmış birisi için gerçekten basit. İlk defa uğraşacak kişiler içinse uygun bir başlangıç yeri burası olmayabilir ..  Eğer sadece veri görüntüleme yapacaksanız soldaki iki kutucuk arası haberleşme yeterli olacaktır.

Yapmamız gereken şey nodeJs sunucusu üzerinde socket.io üzerinden gelen veriyi dinlemek buna göre tcp sokete veri yazmak. Sunucu tarafında socket.io ‘ dan gelen veriyi şu şekilde kıyaslamak mümkün.

socket.on('connection', function(conn){
    conn.on('lm35', function(p_data){
        client.write('b');
    });

    conn.on("ldr", function(p_data){
        client.write('d');
    });

    conn.on("led1", function(p_data){
        client.write('a');
    });

    conn.on("led2", function(p_data){
        client.write('c');
    });
});

Burdaki socket sınıfı bizim tanımladığımız bir sınıf olup ‘connection’ eventi bir bağlantı gerçekleştiği zaman çalışması için ayarlanmış. Yani siz web sayfasını açtığınız anda bu event’ in callback’ i çalışacaktır. Diğer ‘lm35’, ‘ldr’ gibi eventler benim tanımladığım eventler ki socket.io’ nun en sevdiğim yanı. Bu sayede if sorguları, querry string parselemi vb. ihtyacı olmadan işleminizi halledebiliyorsunuz.

Web tarafında ise aşağıdaki fonksiyonları kullanarak iletişimi sağlamış oluyoruz.

        function lm35Function()
        {
            socket.emit('lm35', { });
        }
        //led butonunas basılmışsa _led event i gönderdik
        function ldrFunction()
        {
            socket.emit('ldr', { });
        }

        //pot butonu basılmışsa _pot event i gönderdik
        function led1Function()
        {
            socket.emit('led1', { });
        }
        //led butonunas basılmışsa _led event i gönderdik
        function led2Function()
        {
            socket.emit('led2', { });
        }

Bu fonksiyonları butonları ile kontrol ederek arduino’ dan istekde bulunabiliriz. Led yakmak için yeterli olacaktır. Ancak LM35 değerini okumak için bunun birde geri dönüşü olması gereklidir. (Yukarıdaki şekildekli sağa doğru bakan oklar) Geri dönüşü sağlamk için de Arduino’ daki yazılıma ‘b’ karakteri geldiği zaman “lm35|<deger>|” formatında veriyi geri döndürdük. Bu veriyi nodejs server’ da parseliyerek lm35 değerini web sayfasında ilgili alana yazdık. Yani Arduino şu şekilde bir yapı kullanmamız yeterli olacaktır.

      switch(thisChar)              //gelen karaktere göre işlem yapalım
      {
          case 'a':                 //a ise led yaka yada söndür
            digitalWrite(led1, !digitalRead(led1));
            sendVal = "led1|" + String(digitalRead(led1)) + "|";
            client.print(sendVal);
            break;
          case 'b':               //b ise lm35 değerini ger gönder
            sendVal = "lm35|" + String(analogRead(A0) * 0.48828) + "|";
            client.print(sendVal);
            break;
          case 'c':               //c ise led yak yana söndür
            digitalWrite(led2, !digitalRead(led2));
            sendVal = "led2|" + String(digitalRead(led2)) + "|";
            client.print(sendVal);
            break;
          case 'd':               //d ise ldr değerini geri gönder
            sendVal = "ldr|" + String(analogRead(A1)) + "|";
            client.print(sendVal);
            break;

      }

Burdan sonrası gönderirken yaptığımız işlemlerin tekrarları olduğu için çok fazla üzerinde durmayacağım. Yazılımın tamamına baktığınızda daha iyi anlayacaksınız. NodeJs ile yaptığımız uygulamanın tamamına buradan ulaşabilirsiniz. (main.js server dosyası, index.html ise web sayfasıdır). 

Aynı uygulamanın C# ile yapılanına bakalım. Bu kısım nodejs kısıma göre biraz daha kolay olacaktır.  Uygulamamızda 5 tane buton olsun. Butonlardan bir tanesi soket bağlantısını açıp kapatma işlevi görsün. Diğer 4′ ü ise aynı web uygulamasında olduğu gibi her led yakıp söndürme ve analog değer okuma işlemleri yapsın. 

asdd

Bu uygulamada çok basit bir C# uygulaması olduğundan üzerinde fazla durmayacağım. Sadece kullanılan iki adet timer belki biraz kafa karışıklığı yaratabilir. Onları sürekli okuma işlemi içn kullandıp. Chekbox lar işeretlendiği zaman ilgili timer çalıştırıp 200ms’ de bir analog değer i Server’ dan istedeik. Checkbox kaldırılınca ise bu timer’ ları durdurduk. Yazılımın tamamına buradan ulaşabilirsiniz. 

Umarım yardımcı olabilmişimdir. İyi çalışmalar dilerim..

8 Comments

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir