25 Şubat 2015 Çarşamba

Arduino Ethernet Shield (Wiznet W5100) Client Uygulama



     Bir önceki yazımda daha kolay olduğunu düşündüğüm için Ethermet Shield ile server uygulamasından bahsetmiştim. Bu yazıda ise elimizdeki Ethernet Shield ile nasıl Client olabiliriz  , IP sini bildiğimiz bir siteye nasıl bağlanırız önce bunları sonra da Arduino ile yapılmış olan açık kaynak Akıllı Ev Otomasyonları nasıl çalışıyor , biz de benzer bir iş yapmak istesek Arduino'yu dünyanın herhangi bir yerinden nasıl kontrol edebiliriz bu konuları bulabilirsiniz. Şimdi sırası ile başlayalım;

1) Arduino Ethernet Shield ile Client Uygulaması

     Öncelikle kodu ben yazmadım onu belirteyim. Bir önceki server yazısında olduğu gibi webten çalışır durumdaki bir kod buldum. Arduino ile ilgili internette bir çok konuda bir çok kod örneği var ve bunlardan işe yarayanları alıp gerekli yerleri değiştirerek istediğim şeyi yapmak daha kolayıma geliyor. Sıfırdan yazabiliriz ama uzun sürer  , yine de tercih sizin!

     Kendi bilgisayarımızdan web tarayıcıyı açıp Google üzerinde sorgu yaptığımızı düşünelim. Burada Server  Google , Client ise bizim bilgisayarımızdır. Bunu Ethernet Shield ile yapabilmemiz için ;

* MAC adresi
* Client IP adresi (Arduino için)
* Gateway
* Subnet Mask
* Server IP adresi (Google'ın IP'si)
* Bağlanacağımız Port (Genelde 80 nolu porttur)

bilgilerini belirlemeli ve Arduino'nun kod kısmında yazmalıyız. Daha sonra 80 nolu port üzerinden bağlantı açmalıyız. Bu bağlantının başarılı olup olmadığını ise Serial Monitor kullanarak denetleyebiliriz. Aynı şekilde bağlantı varsa bağlandığımız sayfanın HTML kodlarını okuyup Serial Monitor üzerinde yazdırabiliriz. Aşağıdaki kod tam olarak Google'a Arduino sorgusu gönderiyor ve cevap olarak yönlendirildiğimiz sayfanın HTML kodlarını okuyup Serial Monitore yazdırıyor.



/*
Bu uygulama web sayfasını yazdırıyor
 */

#include 
#include 

// this must be unique
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// change to your network settings
IPAddress ip(192,168,1,21);
IPAddress gateway(192, 168, 2, 1);
IPAddress subnet(255, 255, 255, 0);

// change to your server
IPAddress server(74,125,227,16); // Google

//Change to your domain name for virtual servers
char serverName[] = "www.google.com";
// If no domain name, use the ip address above
// char serverName[] = "74.125.227.16";

// change to your server's port
int serverPort = 80;

EthernetClient client;
int totalCount = 0;
char pageAdd[64];
String bufferRequest = "";
// set this to the number of milliseconds delay
// this is 30 seconds
#define delayMillis 300UL

unsigned long thisMillis = 0;
unsigned long lastMillis = 0;

void setup() {
  Serial.begin(9600);

  // disable SD SPI
  pinMode(4,OUTPUT);
  //digitalWrite(4,HIGH);

  // Start ethernet
  Serial.println(F("Starting ethernet..."));
  Ethernet.begin(mac, ip, gateway, gateway, subnet);

  // If using dhcp, comment out the line above
  // and uncomment the next 2 lines plus the Ethernet.maintain call in loop

  // if(!Ethernet.begin(mac)) Serial.println(F("failed"));
  // else Serial.println(F("ok"));

  Serial.println(Ethernet.localIP());

  delay(200);
  Serial.println(F("Ready"));
}

void loop()
{
  // If using dhcp to get an IP, uncomment the next line
  // Ethernet.maintain();

  thisMillis = millis();

  if(thisMillis - lastMillis > delayMillis)
  {
    lastMillis = thisMillis;

    // Modify next line to load different page
    // or pass values to server
    sprintf(pageAdd,"/",totalCount);

    // sprintf(pageAdd,"/arduino.php?test=%u",totalCount);

    if(!getPage(server,serverPort,pageAdd)) Serial.print(F("Fail "));
    else Serial.print(F("Pass "));
    totalCount++;
    Serial.println(totalCount,DEC);
  }    
}

byte getPage(IPAddress ipBuf,int thisPort, char *page)
{
  int inChar;
  char outBuf[128];

  Serial.print(F("connecting..."));

  //if(client.connect(ipBuf,thisPort) == 1)
  if(client.connect(server,80) == 1)
  {
    Serial.println(F("connected"));
    int a = analogRead(0);
    
    sprintf(outBuf,"POST /#q=arduino HTTP/1.1",a,page);
    client.println(outBuf);
    sprintf(outBuf,"Host: %s",serverName);
    client.println(outBuf);
    client.println(F("Connection: close\r\n"));

  }
  else
  {
    Serial.println(F("failed"));
    return 0;
  }

  // connectLoop controls the hardware fail timeout
  int connectLoop = 0;

  while(client.connected())
  {
    while(client.available())
    {
      inChar = client.read();
      Serial.write(inChar);
      // set connectLoop to zero if a packet arrives


      connectLoop = 0;
    }
    //bufferRequest = "";
    connectLoop++;

    // if more than 10000 milliseconds since the last packet
    if(connectLoop > 10000)
    {
      // then close the connection from this end.
      Serial.println();
      Serial.println(F("Timeout"));
      client.stop();
    }
    // this is a delay for the connectLoop timing
    delay(1);
  }

  Serial.println();

  Serial.println(F("disconnecting."));
  // close client end
  client.stop();

  return 1;
}




Kodu çalıştırdığımızda Serial Monitor görüntüsü aşağıdaki gibi olacaktır.




2) Arduino ile Yapılmış Açık Kaynak Akıllı Ev Otomasyon Sistemleri

     Günümüzde basit bir araştırma ile bu tarz sistemlerin çok olduğunu ve gerçekten çalıştığını görebiliriz. Amaç elinde Arduino - Raspberry pi olan kişilerin bunları internet üzerinden kontrol etmelerini sağlamak . Gerçekten kullanıcı kitleleri var mı bilmiyorum ama bana göre elinde bu malzemeler olup da evde boş boş yatacağına böyle bir sisteme entegre edip kullanmak son derece mantıklı. Tabi hepsi açık kaynak değil , bazıları da ücretli hizmet sunuyor.

     Bizim ilgilendiğimiz kısım açık kaynak olanlarıdır. Sonuçta hem bu sistemleri kullanabilir hem de nasıl çalıştıklarını kolay bir şekilde saptayabiliriz. Şöyle ki açık kaynak olanlarda herkes elindeki malzemeleri kullansın mantığına göre çalıştığı için ücretsiz üyelikten sonra Arduino'ya yüklemek üzere bize kod veya kodlar verebiliyor. İşte biz elimizdeki bu kodları inceleyerek sistemin nasıl çalıştığını anlayabiliriz.

     Ben bu tarz web sitelerinden olan http://homeautomationserver.com/ üye oldum. Verdiği talimatlar doğrultusunda led , servo ve kamera kullanıp kontrol edebiliyoruz. Bunlardan sadece led kısmını denedim sorunsuz çalışıyor. Yani Arduino'yu çalışır durumda bırakırsam nerede olursam olayım internet üzerinden bana kontrol etme imkanı sağlıyor. Asıl ilgilendiğim kısımda burasıydı. Bu işi nasıl yapıyor bana verdiği Arduino kodu üzerinden görebiliyorum. Bu sistemi tasarlayan kişi de en ufak detaya kadar açıklamış. Kodu buradan vermiyorum merak edenler siteye ücretsiz üye olup kodu inceleyebilir.

     Ben sadece nasıl çalıştığını açıklayayım. Öncelikle üye olan kişilere bir ID veriyor ve bu ID'yi Arduino'nun kod kısmına ekleyip siteye öyle  bağlanmamız gerekiyor. Böylece bizim sayfamızdan yapılan değişikliği Arduino'ya aktarıyor. Bu aktarma kısmı da kısmen yukarıda anlattım aslında. Arduino sayfamıza bağlandığında sayfayı  okuyor ve gerekli yerleri ayrıştırarak işlem yapıyor. Örneğin butona bastığımızda led on durumuna geçecek. Bunu yapabilmek için butona önce bir onclick event ı ekleyip bu event içerisine de Javascript fonksiyonu yazıyor. Bu fonksiyonun temel görevi belirli bir HTML kodunun değerini değiştirmek. Arduino tarafında bu değişikliği algılıyor ve gerekli işlemi if-else ile gerçekleştiriyor.

     En kısa haliyle kontrolü böyle sağlıyor. Ben tam anlatamamış olabilirim ama siz siteye girerseniz ne demek istediğimi daha rahat anlayabilirsiniz.

3) Benzer Çalışmalar Yapabilir miyiz?

     Öncelikle bir işi bir başkası yapıyorsa bizim de yapmamız kesinlikle mümkündür , yeter ki gayret edelim. Dışarıdan zor gibi gelebilir ama işin içine girdiğiniz zaman öyle olmadığını anlamamız çok sürmeyecektir. Ben de benzer bir çalışma yapıyorum. Kısmet olurda tamamlarsam yine buradan paylaşırım. Aşağıda benzer bir çalışma yaparken dikkat etmemiz gereken hususları da yazıp bu yazıyı bitiriyorum;

* Local de bir web sitesi yapıp ağ üzerinden Arduino ile bağlantı kurmak için önce Güvenlik duvarından sunucunuza izin vermeli veya güvenlik duvarını komple kapatmalıyız.

* İlk aşamadan sonra Arduino bağlantı açmak için kullandığınız port numarasını düzeltmeliyiz. Yukarıdaki örnekte port numarası 80 ama bizim sunucumuz 8080 de çalışıyorsa port numarasını 8080 yapmalıyız.

* Arduino ile bağlantıyı açacağımız zaman  sitenin IP adresini vererek sayfaya bağlanmalıyız. Örneğin bilgisayarda URL miz şöyle olsun "localhost:8080/ArduinoWeb/anasayfa.xhtml" ise Arduino koduna bağlantı sayfasını "192.168.1.20:8080/ArduinoWeb/anasayfa.xhtml" şeklinde vermeliyiz. Buradaki IP adresini salladım. Siz kendi bilgisayarınızın IP adresini bulmak için Windows'ta komut istemi içerisine ipconfig yazarak , Linux'ta terminal içerisine ifconfig yazarak IP adresimizi öğrenebiliriz. 

     Bu 3 işlem esasında Local çalıştırdığımız Web sitesi ile Arduino arasındaki bağlantıyı kumak içindir. Bu bağlantıyı kurduğumuzda gerisi kendiliğinden gelecektir. Aşağıda bu 3 maddeye örnek olması açısından yaptığım küçük uygulamayı izleyebilirsiniz. Bu uygulamada ağ üzerinden gerçek zamanlı LDR takibini görebilirsiniz! Şimdilik bu kadar , sizlere kolay gelsin!



0 yorum:

Yorum Gönder