Arduino ile geliştirdiğiniz projelerinizi networkünüze dahil ederek daha geniş kapsamlı projeler yapmak için Arduino ile uyumlu bir ethernet arabirimine ihtiyaç duyarsınız. Bu ihtiyacınızı gidermek için kullanabileceğiniz en pratik çözüm Arduino ile uyumlu bir shield kullanmak olacaktır. Piyasada Arduino ile uyumlu birçok shield var. İlk uyumlu shieldlar 10 Mbit/s hızında çalışan ENC28J60 chipsetini kullanan shieldlardı. Daha sonra 100 Mbit/s hızında çalışan Wiznet marka chipsetini kullanan yeni shiledlar piyasaya sürüldü. Shield kavramı aslında Arduino Uno/Mega uyumlu çalışabilen bir board üzerine hazırlanmış devrenin Arduino üzerine oturtularak bütünleşik olarak hem Arduino’nun tüm pinlerini ve bu takılan shieldin özelliklerini kullanmanıza yarayan kartlar olarak tanımlanabilir.
Fakat bu shieldlar tak/kullan ürünler oldukları için bir ve birkaç lokasyona konumlandımak isteyeceğiniz Arduino ve Ethernet kullanan projeleriniz için mailyeti oldukça arttırabilir. Bu durumda maliyetleri azaltmak için Arduino’yu board olarak kullanmak yerine kendi hazırlayacagınız Atmega328P mikroişlemci içeren bir baskılı devre kullanmak isteyebilirsiniz ve Arduino’yu kullanmadıgınız durumlarda shieldlara da ihtiyacınız olmayacaktır ve hatta bu shiledlar maliyetleri Arduinoya göre çok daha fazla arttıracaktır.
ENC28J60 Chipsetli Ethernet Modül
İşte bu gibi durumlarda kullanabileceğiniz ENJ28J60 chipsetini kullanan düşük maliyetli shield board olarak tasarlanmamış SPI arayüzüne sahip ayrı bir modül mevcut. Bu modül 10 Mbit/s hızında çalışabiliyor ki 8 bitlik bir işlemci için bu hız son derece yeterli bir hız bence. Mutlaka Wiznet chipsetinin ENC28J60 chipsetine üstünlükleri var fakat ENJ28J60 modülüne ödeyeceğiniz bedel ile Wiznet shielda ödeyeceğiniz bedel arasında en az 4 kat fark var 🙂 Dolayısıyla projelerinizde maliyet önemli bir unsur ise bu modülü kullanmanızı şiddetle tavsiye ediyorum.
Bu arada aşağıdaki adresten ilgili modülü temin edebilirsiniz.
Arduino Uyumlu ENC28J60 Ethernet Modül
ENC28J60 Modülü Arduino Kütüphanesi : Ethercard Library
Sanırım bir ürünün mailyetinin avantajlı olmasının yanında bir de kullandıgınız işlemci mimarisi ile uyumlu kütüphaneye sahip olması çok önemli. SPI arayüzüne sahip olan bu modülü SPI kütüphanesi ve arayüzü olan diğer tüm işlemci mimarisi ve geliştirma kartları ile kullanabilirsiniz ki Arduino’nun da SPI arayüzü var 🙂
Arduino ile kullanabileceğiniz ENC28J60 chipsetiyle uyumlu en gelişmiş özelliklere sahip kütüphane ise EtherCard kütüphanesi,
Bu kütüphaneyi https://github.com/jcw/ethercard linkinden temin edebilirsiniz.
Kütüphaneyi indirdikten sonra zipten çıkardıgınız klasoru “ethercard” olarak isimlendirin ve Arduino IDE’nizin library klasörü altına kopyalayın ve Arduino IDE açık ise kapatıp yeniden açın. Bu durumda File -> Examples sekmesi altında ethercard adında yeni bir alan göreceksiniz ve bu alanda bulunan örnekleri hemen çalıştırabiliriz. Kütüphanenin diğer bir avantajı ise artık Arduino 1.0 ile uyumlu olarak çalışıyor olması.
Ethercard Kütüphanesi Backsoon Örneği
Bu örnekler arasından Backsoon örneğini inceleyecek olursak yapmanız gereken tek şey ethernet modülünüzü Arduino’nun uygun pinlerine baglamak ve örneği IDE üzerinde derlemek ve Arduinoya yüklemek olacaktır. Bu örnekte STATIC değişkeni 1 olarak atandıgından myip[] adlı değişkeninde belirteceğiniz ip adresini alacaktır ve ağınızda aldıgı bu ip adresi ile bir web sunucu olarak yani 80 nolu porttan istek kabul edebilir bir durumda çalışmaya devam edecektir. Yani 192.168.1.200 adresini browserınızın adres çubuguna yazarak (internet explorer kullanıyorsanız http://192.168.1.200 yazmanız gerekiyor) bu sayfaya gitmek istediğinizde yandaki gibi bir sayfa ile karşılacaksınız. Kullandıgınız myip[] – Arduinonun ip adresi ve gwip[] – Gateway adresiniz yani modeminiz adresi değişkenlerindeki değerlerin kendi ağınızdaki subnete uygun olarak verildiğinden emin olmayı unutmayın.
Backsoon örneğinin çalışabilmesi ve diğer tüm örneklerinizde bu kütüphaneyi kullanabilmeniz için Arduinonun SPI pinlerini kullanmak gerekiyor ve bu haliyle varsayılan olarak kütüphane Chipselect – CS pini olarak 8 nolu pini kullanıyor ve istenirse değiştirilebiliyor.
Aşağıdaki tabloda da gördüğünüz gibi modül 3.3V gerilim değeri ile çalışmak üzere tasarlanmış. Fakat siz 3.3V gerilim degerinde regulasyona sahip olmayan bir board tasarlayarak Atmega328 kullanıyorsanız üzülmeyin çünkü birçok projede bu modülü 5V gerilim değeri ile çalıştırıyorum ve hiç bir problem yaşamadım. Biraz fazla ısınıyor sadece ama herhangi bir düzensizlik problemine sebep olmuyor. Ayrıca Arduinonun pinlerine Logic Level Dönüştürücü kullanılmadıgı sürece zaten sadece VCC degerine 3.3V uygulamış oluruz, diğer SPI ve CS pinlerine 5V gitmeye devam edecektir.
Pinleri aşağıdaki gibi bağlayarak modülünüzü kullanabilirsiniz ;
Modül Arduino UNO
VCC -> 3.3V ya da 5V
GND -> GND
SCK -> Pin 13
SO -> Pin 12
SI -> Pin 11
CS -> Pin 8
Backsoon Uygulaması
#include <EtherCard.h> #define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below) #if STATIC // ethernet interface ip address static byte myip[] = { 192,168,1,200 }; // gateway ip address static byte gwip[] = { 192,168,1,1 }; #endif // ethernet mac address - must be unique on your network static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; byte Ethernet::buffer[500]; // tcp/ip send and receive buffer char page[] PROGMEM = "HTTP/1.0 503 Service Unavailable\r\n" "Content-Type: text/html\r\n" "Retry-After: 600\r\n" "\r\n" "<html>" "<head><title>" "Service Temporarily Unavailable" "</title></head>" "<body>" "<h3>This service is currently unavailable</h3>" "<p><em>" "The main server is currently off-line.<br />" "Please try again later." "</em></p>" "</body>" "</html>" ; void setup(){ Serial.begin(57600); Serial.println("\n[backSoon]"); if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println( "Failed to access Ethernet controller"); #if STATIC ether.staticSetup(myip, gwip); #else if (!ether.dhcpSetup()) Serial.println("DHCP failed"); #endif ether.printIp("IP: ", ether.myip); ether.printIp("GW: ", ether.gwip); ether.printIp("DNS: ", ether.dnsip); } void loop(){ // DHCP expiration is a bit brutal, because all other ethernet activity and // incoming packets will be ignored until a new lease has been acquired if (!STATIC && ether.dhcpExpired()) { Serial.println("Acquiring DHCP lease again"); ether.dhcpSetup(); } // wait for an incoming TCP packet, but ignore its contents if (ether.packetLoop(ether.packetReceive())) { memcpy_P(ether.tcpOffset(), page, sizeof page); ether.httpServerReply(sizeof page - 1); } }
Evet umarım yeni ethernet modülünü siz de begenmişsinizdir, yeni bir yazı da görüşmek dileğiyle…
Kaynaklar :
http://winkleink.blogspot.co.uk/2012/01/arduino-enc28j60-ethernet-module-part-2.html
merhabalar ENC28J60 modülü hakkında biraz yardıma ihtiyacım var. Sizinle nasıl iletişime geçebilirim. Teşekkürler.
Öncelikle böyle bir blog için teşekkür ederim hocam.Ben gyro ile dc motor kontrol etmek istiyorum(ileri-geri) yardımcı olabilir misiniz? Filtrelemesini(kalman) yaptım. Kullandığım motor sürücü sabertooth.
Merhaba Hakan Bey,
Bir webserver yapmaya çalışıyorum ancak bir sorunum ve çözemiyorum.
Sd kart veya ethernet modüllerinden birini çıkarınca kod sorunsuz çalışıyor. Sd kart olmayınca internet üzerinden verileri görebiliyorum. Ethernet olmayınca da sd kart kaydı yaptırabiliyorum. Sd kart ve Ethernet modüllerinin kullanımından önce diğerini kapatarak da denedim ancak sonuca ulaşamadım. Aşağıda şuanki bağlantı pinlerimi ve kullandığım kodu gönderiyorum. Yardımcı olursanız gerçekten çok sevineceğim.
Arduino Mega 2560
Rtc module:
Clk: 24, dat: 26, rst: 28, vcc: free
Ultrasonic modül:
Trig: 34, echo: 32
Sd kart modül:
Mosi: 51, miso: 50, sck: 52, cs: 4
Lcd i2c ekran modül:
Scl: 21, sda: 20, gnd and 5v vcc
Ethernet modül:
Cs: 10, and icsp pins
my code;
#include
#include
#include //RTC kütüphanemizi ekliyoruz.
#include
#include // SD kart kütüphanesi
#include // Ethernet kütüphanesi
#define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below)
#if STATIC
// ethernet interface ip address
static byte myip[] = { 192,168,1,12 };
// gateway ip address
static byte gwip[] = { 192,168,1,1 };
#endif
// ethernet mac address – must be unique on your network
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
byte Ethernet::buffer[500]; // tcp/ip send and receive buffer
BufferFiller bfill; //???????
const char page[] PROGMEM =
“HTTP/1.0 503 Service Unavailable\r\n”
“Content-Type: text/html\r\n”
“Retry-After: 600\r\n”
“\r\n”
“”
“”
“Rain Home Automation”
“”
“”
“This service is currently unavailable”
“”
“The main server is currently off-line.”
“Please try again later.”
“”
“”
“”
;
#define ETHERNET_PIN 10
#define SD_READER_PIN 4
File dosya; // Sd kartta işlem yapılacak olan dosya us_seviye olarak belirleniyor
int sayac = 1;
LiquidCrystal_I2C_AvrI2C lcd(0x27,16,2);
virtuabotixRTC myRTC(24, 26, 28);
int trigPin = 34; //Ultrasonik sensör trig pini değişkeni
int echoPin = 32; //Ultrasonik sensör echo pini değişkeni
int sure; //Ses dalgasının gidip gelme süresi değişkeni
int seviye; //Ölçülen uzaklık değeri değişkeni
int esel; //Eşel sıfırından cihazın uzaklık değeri değişkeni
unsigned long saat = 60*1000UL;
void setup() {
lcd.begin(); //LCD ekranımızın en-boy oranını ayarlıyoruz.
lcd.clear();
pinMode(53, OUTPUT);
pinMode(ETHERNET_PIN,OUTPUT);
pinMode(SD_READER_PIN,OUTPUT);
SPI.begin();
digitalWrite(ETHERNET_PIN,HIGH);
if (!SD.begin(4)) {// SD kart başlatılıyor
lcd.print(“SD Kart Yok!”);
delay(2000);
myRTC.setDS1302Time(0, 23, 21, 7, 21, 6, 2020); //Saati saniye, dakika, saat, haftanın günü, ayın günü, ay, yıl olarak ayarlıyoruz. Ayar için dosyayı ilk yükledikten sonra bu kodun önüne slash koyup kapatacağız, tekrar yüklicez.
pinMode(trigPin, OUTPUT); //trig pinini OUTPUT olarak ayarlıyoruz.
pinMode(echoPin,INPUT); //echo pinini INPUT olarak ayarlıyoruz.
lcd.setCursor(0, 0);
lcd.print(” Ultrasonic V1″);
lcd.setCursor(0, 1);
lcd.print(” Mehmet Ali TOR”);
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(” Dsi 24.”);
lcd.setCursor(0, 1);
lcd.print(“Bolge Mudurlugu”);
delay(2000);}
else
{
lcd.print(“SD Kart Baglandi”);
delay(2000);
myRTC.setDS1302Time(0, 56, 11, 6, 13, 6, 2020); //Saati saniye, dakika, saat, haftanın günü, ayın günü, ay, yıl olarak ayarlıyoruz. Ayar için dosyayı ilk yükledikten sonra bu kodun önüne slash koyup kapatacağız, tekrar yüklicez.
pinMode(trigPin, OUTPUT); //trig pinini OUTPUT olarak ayarlıyoruz.
pinMode(echoPin,INPUT); //echo pinini INPUT olarak ayarlıyoruz.
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(” Ultrasonic V1″);
lcd.setCursor(0, 1);
lcd.print(” Mehmet Ali TOR”);
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(” Dsi 24.”);
lcd.setCursor(0, 1);
lcd.print(“Bolge Mudurlugu”);
delay(1500);
}
pinMode(SD_READER_PIN,OUTPUT);
digitalWrite(SD_READER_PIN,HIGH);
if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0)
lcd.println( “Ethernet baglanamadi”);
#if STATIC
ether.staticSetup(myip, gwip);
#else
if (!ether.dhcpSetup())
lcd.println(“DHCP failed”);
#endif
}
void loop() {
ekran(2000); // ekran fonksiyonunu 2 sn’de bir çalıştır.
kayit(10UL*1000UL); // kayıt fonksiyonunu 1 saatte bir çalıştır.
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
}
…..
…..