Hadi Arduino ile İnternete Bağlanalım
|
Merhabalar..
Şimdiye kadar bütün projelerimizi local’ de yaptık. Ancak günümüz sistemler artık internete bağlanarak internet üzerinden haberleşerek çalışmakta. Hatta Google nesnelerin interneti projesi kapsamında yeni bir işletim sistemi oluşturup günlük hayatta kullandığımız sistemleri internete bağlamaya çalışmakta. Bu yüzden bende çalışmalarımı internet üzerinden gerçekleştirmeye başladım. Öğrendiklerimi ve edindiğim tecrübelerimi sizinle paylaşmak istedim.
Öncelikle basitten başlayalım. Basitten başlıyacağımız için kullanacağımız platform yine Arduino olacak. Arduino yu Enc28j60 modülü ile internete bağlıyacağız. Bu işlem için Arduino için yazılmış bir kütüphane kullanmamız gerekli. Burada dikkat edilmesi gereken nokta hangi kütüphaneyi kullanmamız gerektiği. Eğer bu örnekte benim de kullandığım gibi harici ethernet modülü (Enc28j60) kullanacaksanız kaynak kodları git-hub da bulunan ethernet-master kütüpnasini kullanacağız. Eğer arduino ethernet shield ini kullanacaksanız Arduino Ide’ si ile gelen Ethernet kütüphanesini kullanabilirsiniz. Kütüphanelerdeki işlemler birbirine yakındır, shield kullanmak isteyenler ufak ayarlamalar ile paylaşacağım kodu Shield ile de kullanabilirler. Bu farklılığın sebebi modüllerdeki entegrelerin farklı olmasındandır. Ethernet Shield W100 entegresi kullanılırken isminden de anlaşılacağı gibi diğer modülde Enc28j60 kullanılır.
Hikaye kısmımız bu kadardı. Öncelikle devre şematiğimizden başlayalım. Arduino enc28j60 ethernet modülü spi haberleşme protokolü ile haberleşir. SPI pinlerinin Arduino modeline göre farklılık gösterdiğine dikkat edilmelidir. Ben burada en çok kullanılan model olan Arduino UNO‘ ya göre çizimi göstereceğim.
Çizimde ufak bir hata bulunmaktadır. ENC28j60 modülündeki CS pini Arduino’ da 8 nolu pine bağlanmalıdır.
Arduino Uno üzerinde SPI pinleri şekildeki gibidir. Ethernet kablomuzu bağladıktan sonra Arduino’ muz internete bağlanmaya hazır gelecektir. Burda dikkat edilmesi gereken ethernet modülünün 3.3V pinine bağlanacak olmasıdır. Üzerinde 5V yazıyorsa bile siz 3.3V ile deneyin sağlıklı çalışmazsa 5V çıkarsınız. Benim şimdiye kadar kullandığım tüm modüller 3.3V ile çalışıyordu.
Bağlantımızı yaptık. Şimdi gelelim bizi kuracağımız web server’ a Hello World yazdıran basit Arduino yazılımımıza. Öncelike bağlı olduğumuz modemin bize verdiği IP yi öğrenmemiz gerekli. Bunu öğrenmenin bir kaç yolu var. En basit olanı modeme sormak. Bu sorgu işlemini Arduino ya eklediğimiz kütüphanenin testDHCP isimli sketch’ ini kullanarak yapabiliriz. Bu yazılımı Arduino’ ya attığımız zaman mac adresimiz yardımı ile modemin bize verdiği ip adresini Serial monitör’ den görmüş olacağız. Daha sonra biz web server’ ımızı bu ip üzerine kuracağız. Ben aşağıdaki yazılımda kendi gördüğüm IP adresini kullacağım, siz kendi IP adresi ile değiştirmeyi unutmayın.
#include <EtherCard.h> //mac ve ip adresleri //mac adresini modül değişmedikçe değiştirmemeniz tavsiye edilir static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; //Modemin size verdiği IP adresi static byte myip[] = { 192,168,2,84}; //intenret sayfanız için oluşturduğunuz tampon alan byte Ethernet::buffer[500]; //bu tampon alana aktarılacak veriler HTML kodlarınız BufferFiller bfill; void setup() { Serial.begin(9600); //Bağlantı başlatılamamışsa uyarı ver.. if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println(F("İnternete bağlanılamadı!")); //serveri statik olarak ip adresimiz üzerine kurduk ether.staticSetup(myip); } //tampon alana aktaracağımız anasayfamız //static olarak tanımlanması önemlidir yoksa veri kaybı yaşanır!! static word homePage() { bfill = ether.tcpOffset(); bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n" "\r\n" "<html><head><title>Arduino</title>" "</head><body><h1>HELLO WORLD!</h1></body></html>"); return bfill.position(); } //sonsuz döngüde client' ler ile serveri haberleştirdik void loop() { word len = ether.packetReceive(); word pos = ether.packetLoop(len); if (pos) // check if valid tcp data is received ether.httpServerReply(homePage()); // send web page data }
Peki ya bir web server’ dan Arduino’ ya bağlı ledi kontrol etmek istersek ne yapacağız. Artık işlemlerimiz biraz daha karmaşık hale gelecek. Adres çubuğu üzerinden ufak bir haberleşme yapmamız gerekecek. Yani biz bir butona bastığımızda adres çubuğu yardımı ile Arduino’ ya istediğimiz komutu gönderebileceğiz. Burada işin en önemli kısmını BufferFilter nesnesi yapmakta. Bu nesne sayesinde web sitesi üzerinde bir nevi C’ de kullandığımız biçim niteleyicisi yapısını internet sayfamızda kullanabileceğiz. (Format String)
Not: Bu aşamda kullanılan yazılımda üstteki şematiğe ek olarak 4. pine bağlı bir led bulunmaktadır.
buf isimli BufferFiter tipinde bir nesnemiz olsun. Bunun biçim niteleyicileri şu şekildedir:
uint16_t ddd = 123; double ttt = 1.23; uint16_t hhh = 0xa4; long lll = 123456789; char * sss; char fff[] PROGMEM = "MyMemory"; sss[0] = 'G'; sss[1] = 'P'; sss[2] = 'L'; sss[3] = 0; buf.emit_p( PSTR("ddd=$D\n"), ddd ); // "ddd=123\n" buf.emit_p( PSTR("ttt=$T\n"), ttt ); // "ttt=1.23\n" **TO CHECK** buf.emit_p( PSTR("hhh=$H\n"), hhh ); // "hhh=a4\n" buf.emit_p( PSTR("lll=$L\n"), lll ); // "lll=123456789\n" buf.emit_p( PSTR("sss=$S\n"), sss ); // "sss=GPL\n" buf.emit_p( PSTR("fff=$F\n"), fff ); // "fff=MyMemory\n"
Şimdi gelelim Arduino ‘ da adres çubuğundaki veriyi nasıl okuyacağımıza. Web’ de sunucuya bağlanan client’ ler ile haberleşmenin en makul yolu soket oluşturmaktadır. Ancak bu işlem bu aşamada bizim için biraz karışık. Bizde daha basit olan ve sürekli olarak kullandığımız adres çubuğunu kullanalım. Tarayıcı adres çubuğuna girilen adres gidip, adresteki sunucuya “/” işaretinden sonra gelen veriyi sorgulayacaktır. Bu sorgularda “?” yardımı veri aktarımı yapacağız (Bknz. Querry String). Bizim sunucumuz da Arduino olacağına göre tarayıcının adres çubuğu yardımı ile basit bi iletişim kurabiliriz. Bunun için basit bir C fonskiyonu kullanacağız, strstr.
if(strstr((char*) Ethernet :: buffer + pos, "GET /?status=ON") != 0) { Serial.println("LED AC"); ledStatus = true; }
Loop içerisinde bulunan yukarıdaki kodda client’ in adres çubuğu yardımı ile sunucuya gönderdiği veriyi strstr fonksiyonu ile okuduk. Benim BufferFilter içerisinde ayarladığım client’ ın butona bastığında Arduino’ ya göndereceği veri formatı bu şekilde /?status=$S . Bu yüzden sorgumda gelen veriyi bu şekilde sorguladım.
char *statusLabel; //labelden gelen verileri diziye atadık char *buttonLabel; //butondan gelen verileri diziye atadık static word homePage() { bfill = ether.tcpOffset(); bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n" "\r\n" "<html><head><title>Arduino</title></head>" "<body><form>Led Status: $S<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>" "</form></body></html>"), statusLabel, buttonLabel, buttonLabel); return bfill.position(); }
Bu kısım yazılımdaki client’ lerin göreceği kısmı. Yani web sayfası kısmı. Burada basit olarak daha önceki örnekte olduğu gibi HTML Header bilgileri web sayfamızın HTML kodları mevcut. HTML kodlarına dikkat ederseniz yukarıda bahsettiğimiz BufferFilter yapısının kullanımı açıkça görülmekte. Burada BufferFilter Arduino(server) ile web sayfasının(client) haberleşmesini sağlayarak Arduino tanımladığımız değişkenlerin değerini web sayfasına(client’ e) yollamamızı sağlıyor.
Peki ya bu veriler ile ledlerimizi nasıl yakıp söndüreceğiz? Çok Basit loop içerisinde okuduğumuz buton verisini kontrol edeceğiz. Butona bastığımızda eğer led kapalı ise ON verisi gönderecek. bizde bunu bi “if” yardımı ile kontrol edeceğiz.
Kodun tamamına BURADAN ulaşabilirsiniz. Yeterince kod kalabalığı sayfada olduğu için ayrı olarak paylaşmak istedim. Bu sayede değişiklikleri de zamanla aynı link üzerinden görebileceksiniz.
Teşekkürler..
iyi günler ben arduino uno ve esp8266 ya 2 adet sensör DS18B20 bağlayıp evin her odasına bu şekilde ayrı modül yapıp aynı anda bütün sıcaklığı monitörde görmek istiyorum bana yardımcı olurmusunnuz bu işe hobi amaclı yapıyorum merak sardım ilgilenirseniz sevinirim
Merhaba..
Öncelikle nereye takıldığınız hakkında bilgi verirseniz daha çok yardımcı olabilirim. Sorunuzu baser61061@gmail.com adresine atmanız daha iyi olacaktır.
İyi çalışmalar..
İyi çalışmalar..
kodun tamamını buradan görebilirsiniz demişsiniz ama 404 hatası veriyor buraya tıkla dediginiz link
Uyarınız için teşekkürler linki güncelledim..
Ardıino yu kontrol etmek için aynı modemdenmi bağlanmamız gerekiyor yoksa dünyanın her yerinden kontrol edilebilir mi
Merhaba, Arduino’ yu kontrol edebilmek için normal şartlarda Arduino’ nun bulunduğu yerel ağ içerisinde olmalısınız. Ancak modem size aitse ve kurduğunuz server’ ın kullandığı porta erişimi modem üzerinden açarsanız herhangi bir ağdan bağlantı sağlayabilirsiniz. İyi çalışmalar..
Bende si pini yok st pini var bu ayni şey mı
Merhaba, SI pini normalde SPI haberleşmedeki Slave In in kısaltmasından gelmekte. ST de aynı işe yarar mı emin değilim. Modülün datasheet’ ine bakmanızı tavsiye ederim. İyi çalışmalar..
Merhaba,Ben Mega kullanıyorum. enc28j60 ve sd kartı mosı(50),mıso(51),clk(52) pinlerine paralel atıp, cs leri ayırıyorum birini 4 birini 10 olarak atadım. Sadece ENCyi bağladığımda çalışıyor. Sadece sd kartı çalıştırdığımda da çalışıyor. ama ikisini bir bağladığımda sd karta enerji verdiğim anda servera bağlanamıyorum interneti kesiyor. Yardımcı olursanız sevinirim
Merhaba, malesef dediğiniz gibi bir sorun ile karşılaşmadım hiç. Ancak SD kart okuyucu boşken SD kart okumaya çalıyorsa veya gecikme meydana geliyorsa server düşüyor sonra tekrar bağlanıyor olabilir. Daha önce SD kart ile hiç çalışmadığımdan pek yardımcı olamayacağım. İyi çalışmalar dilerim..
Merhaba programı kendime göre buton adetini yükselterek sorunsuz şekilde hem local hemde dışarıdan bağlanarak sorunsuzca kullanıyorum.Fakat şöyle bir durum var evdeki modemin ip si değiştiğinde sürekli önce ip öğrenip öyle bağlanmam gerekiyor.İnternet sağlayıcımdan sabit ip alarak bunu aşabilirim fakat başka yöntem var mı diye sormak istedim..
Merhaba, ip değişimini algılamak için malesef ki farlı bir yöntem Arduino üzerinden bildiğim kadarı ile bulunmamakta. Ancak ağdaki bilgisayarda yada gömülü linux cihazda ip sorgusu yaparak değişimi durumunda kendinize mail atmayı deneyebilirsiniz. Ancak bu cihazın kontrol işlemini yapabilmesi için sürekli açık olması gerekmektedir.
İyi çalışmalar dilerim..
Meraba arduino ethernet shield ile hc-sr04 ile olctugum mesafeyi internet tarayicimda gormem gerekiyor. Bunun icin ethernet cliemt kodlarini mi kullanacagim? Yada nasil bir yol izleyecegim?
En kisa surede donus yapabilir misiniz?
Merhaba, bahsettiğiniz işlemi yapmak için Arduino Ethernet shiled’ i tcp client olarak kullanıp bilgisayardaki yada sunucudaki tcp server’ a rahatlıkla veri aktarabilirsiniz. Bu konu ile ilgili bağlantıda yazımıza bakabilirsiniz. İyi çalışmalar dilerim…
çok teşekkürler çok faydalı olmuş fakat ıp adresi yerine hangi ıp adresini yazacağım ?
Merhaba, bunu bulmanızın birden fazla yolu val. En kolayı eğer ev ağında iseniz modülü ethernet kablosu ile modeme bağladığınız zaman modem ethernet modülüne IP verecektir. Bu IP’ yi modem arayüzü üzerinden bulabilirsiniz. İkinci bir yöntem ise ethernet-master kütüphanesinin örneklerinde dhcp ile başlayan bir örnek bulunmakta. Bu örneği çalıştırarak Serial monitör üzerinden IP adresini görüntüleyebilirsiniz. İyi çalışmalar dilerim…
yardımınız için çok teşekkür ederim. modülü modeme bağaladım. fakat vermiş olduğunuz kodda ıp adresi yazılan yere bir kaç farklı ıp adresi yazdım. modemin üstünde yazan ıp adresi, komut isteminden ipcofig yazarak bulduğum ıp adresi ve modemi bilgisayara takıp ağ ve paylaşım merkezinden bulduğum ıp adresi. bu 3 ıp adreside birbirinden farklı. hangisini yazmalıyım.
Tekrar merhaba, bunların hiçbiri değil. Modem arayüzüne bağlanarak, ki genelde 192.168.2.1 gibi bir adresden bağlanırılır, bağlı cihazların göründüğü sayfada hangi cihazın IP’ sinin ne olduğu yazar. Ordan IP’ nizi elde etmelisiniz. Diğer sorularınızı baser61061@gmail.com adresinden gönderebilirsiniz. İyi çalışmalar dilerim.