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.
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..
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.
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..
merhabalar arduino leonardo ile aynı şeyi yapsam destekler değil mi ?
Merhaba, leonardo hiç kullanmadım ancak bildiğim kadarı ile farklı olarak sadece USB Host olarak kullanım özelliği bulunmakta. Bu yüzden bu konuda anlatılanlar onda da geçerli olması gerekir. iyi çalışmalar dilerim..
merhabalar,
Bu işlemi wificlient ile yaparken sadece ilk bağlanıldığında veri gönderiyor veya alabiliyorum bunu sürekli nasıl yaparım, c# kısmında ns.Write kısmında engellenildi hatası veriyor.
Merhaba, muhtemelen sorununuz soketin veri gönderdikten sonra kapanıyor olmasındandır. Gönderdiğiniz verinin sonunda soketi kapatacak “Socket Close Connection” vb bir ibare olmamasına dikkat edin. Eğer yoksa veri göndermeden öcne bağlı mı diye kontrol edip bağlı değilse bağlanmayı deneyebilirsiniz. İyi çalışmalar dilerim…
İlginiz için teşekkürler sorunu timer ile çözdüm sürekli aç kapa yapınca düzeldi.
Bu projeyi ethernet shield ile esp8266 arasında nasıl yapablirim yardımcı olurmusunuz??
Merhaba, iletişimi ethernet shield ve esp8266 arasında yapmak istiyorsanız, iki cihazdan birini server olarak ayarlamalısınız. Diğer cihaz ise client olarak ayarlanmalı ve server’ in IP’ sine bağlanmalıdır. Daha sonra da aynı bu örnekte olduğu gibi veri transferi gerçekleştirilebilirsiniz (ESP8266 TCP haberleşme için olan yazıya buradan ulaşabilirsiniz). Bu örnekler cihazların aynı ağda olduğu düşünülerek yapılmıştır. Cihazlar farklı ağlara bağlanırsa genel ağ iletişim kuralları uygulanmalıdır. İyi çalışmalar dilerim…
Merhaba ,
Yazınız çok başarılı ve reel uygulamaya dönük, başarılarınızın devamını dilerim.
Saygılar.