I2C Haberleşme Protokolü
|Bu yazımda I2C protokolü ile haberleşmeden bahsedeceğim.Bunu bir örnekle açıklamaya çalışalım.Örneğimiz şu şekilde olsun; İki adet Arduino Uno’yu birbiri ile haberleştirelim.
I2C Protokolü hakkında kısa bilgi:
I²C (Inter-Integrated Circuit) Philips tarafından geliştirilmiş, düşük hızlı çevre birimlerini anakart, gömülü sistem ya da cep telefonu’na bağlamak için kullanılan toprağa referanslı,çok denetleyicili bir seri veriyoludur. 1990’ların ortasından beri Siemens (sonrasında Infineon Technologies), NEC, STMicroelectronics (öncesinde SGS-Thomson), Motorola(sonrasında Freescale Semiconductor), Intersil gibi pek çok firma NXP (öncesinde Philips Semiconductor Division) I²C-sistem standartıyla tam uyumlu ürünler piyasaya sürmüşlerdir.
1 Ekim 2006 itibariyle ürünlerinde I²C protokolünü kullanmak isteyen firmalar için lisans ücreti ödeme zorunluluğu ortadan kalkmıştır, ancak NXP tarafından tahsis edilen I²C bağımlı birim adresine sahip olabilmek halen ücrete tabidir.
SMBus I²C’nin daha katı elektriksel ve protokol sınırlamaları tanımlayan bir alt kümesidir. SMBus’ın bir amacı dayanıklılık ve karşılıklı çalışabilirliği artırmaktır. Bu sebepten modern I²C sistemleri SMBus kural ve prensiplerini içermektedirler ve pratikte bu iki standart arasındaki ayrım genellikle çok belirgin değildir.
Şimdi de I2C Haberleşme protokolü için gerekli olan Wire.h Kütüphanesini inceleyelim ;
wire.begin() : Haberleşmeyi başlatır.Haberleşmeyi master olarak başlatmak istiyorsak parametre girilmez.Slave olarak başlatmak istiyorsak,slave aygıtın adresini girmemiz gerekir.
wire.available() : Veri akışının olup olmadığı kontrol edilir.Bu fonksiyon okunmayı bekleyen veri sayısını döndürür.
wire.beginTransmission(adres) : Master aygıttan adresi parametre olarak belirten slave cihaz ile haberleşmenin başlamasını sağlar.
wire.endTransmission() : Master aygıtın veri gönderimini sonlandırır.
wire.read() : Gelen veriyi okumaya yarar.
wire.write() : Parametre olarak girilen ifadeyi iletmeye yarar.
wire.onReceive(işlem) : Master’dan slave ‘ e veri geldiğinde yapılacak olan işlemleri belirleyen fonksiyondur.Parametre olarak bir fonksiyon alır.
wire.requestFrom () : Slave’lerden veri istediğimiz ifadedir. Parametre olarak üç değer alır. İlk parametre veri isteyeceğimiz slave’in adresidir. İkinci parametrede kaç byte’lık veri istediğimizi bildiririz. Son parametresi ise boolean bir değişkendir.
wire.onRequest() : Veri istendiğinde slave’in ne yapacağını belirttiğimiz ifadedir. Parametre olarak bir fonksiyon alır. Bu fonksiyonda neler yapılması gerektiğini tanımlarız.
Şimdi başta bahsettiğim örneğimize gelelim;
Malzeme listesi:
- x2 Arduino Uno
- x2 Direnç(330 ohm)
- Jumper
Bağlantı şeması:
Arduino unoda SDA pini A4 pini,SCL pini ise A5 nolu pindir.Arduino Mega’da ise SDA ve SCL pinleri, 20 ve 21 nolu pinlerdir.Yukarıdaki şematikte A4 ve A5 pinleri haricinde SDA ve SCL pini olan pinler gösterilmiştir.Arduino’nuz orjinal yada klon ürünse arduino uno’yu arka yüzüne çevirdiğinizde bu pinlerin yanında SDA ve SCL yazdığını göreceksiniz.
KOD:
Master olarak seçilen arduino kodları:
#include <Wire.h> char c; void setup() { Wire.begin(); // haberleşme master olarak başlatıldı Serial.begin(9600); } void loop() { Wire.requestFrom(1, 16); //Slave 1'den 16 byte'lık veri isteniyor while(Wire.available()){ c = Wire.read(); Serial.print(c); } Serial.println(); Wire.beginTransmission(1); // Slave 1' veri gönderiliyor Wire.write("www.elektrobot.net"); // string veri gönderiliyor Wire.endTransmission(); delay(500); }
Slave olarak seçilen Arduino kodları:
#include <Wire.h> char c; void setup() { Wire.begin(1); // haberleşme slave 1 olarak başlatıldı Wire.onRequest(requestEvent); // veri istendiğinde Wire.onReceive(receiveEvent); // veri geldiğinde Serial.begin(9600); } void loop() { delay(100); } void receiveEvent(int howMany) { while(Wire.available()){ c = Wire.read(); Serial.print(c); } Serial.println(); } void requestEvent() { Wire.write("Cevdet CIVIR"); }
Şimdi ikinci uygulamamıza geçelim.İkinci uygulamamız şu şekilde olacak; Master kartımızdan iki karakter yollayacağız bunlar ‘k’ ve ‘y’ karakterleri olacak.Master kartımıza konsoldan girdiğimiz bu karakterler Slave kartımıza bağlı olan kırmızı ve yeşil renkteki ledleri yakacak.
Malzeme Listesi:
- x2 Arduino Uno
- Jumper
- Yeşil ve Kırmızı Led
Bağlantı Şeması:
Arduino unoda SDA pini A4 pini,SCL pini ise A5 nolu pindir.Arduino Mega’da ise SDA ve SCL pinleri, 20 ve 21 nolu pinlerdir.
KOD:
Master olarak seçilen arduino kodları:
//Master Code #include<Wire.h> void setup() { Wire.begin(); Serial.begin(9600); } void loop() { Wire.beginTransmission(1); //master aygıtın veri gönderimini baslatır.parametre slave adresidir. if(Serial.available()>0){ //Konsoldan karakter girdiğimiz bölüm char c = Serial.read(); Wire.write(c); } Wire.endTransmission(); // master aygıtın veri gönderimini durdurur. }
Slave olarak seçilen Arduino kodları:
//Slave #include<Wire.h> int led1=13; int led2=12; void setup() { pinMode(led1,OUTPUT); pinMode(led2,OUTPUT); Wire.begin(1); Wire.onReceive(receiveEvent); Serial.begin(9600); } void loop() { delay(100); } void receiveEvent(int howMany) { if( Wire.available()>0) // Haberleşmenin olup olmadıgını kontrol eder { char c = Wire.read(); Serial.print(c); if(c == 'k'){digitalWrite(led1,HIGH); delay(1000); digitalWrite(led1,LOW);} if(c == 'y'){digitalWrite(led2,HIGH); delay(1000); digitalWrite(led2,LOW);} } }
Masterdan göndereceğimiz karakteri konsoldan girmemiz gerekir.Bunu arduino’nun IDE ‘sinin sağ üstünde bulunan Serial Monitor’dan yapabilirsiniz.Ayrıca kullanımı gayet basit olan “Putty” programı ile de konsoldan karakter girebilirsiniz.
Putty’i buradan indirebilirsiniz.
PUTTY kullanımı:
Putty kullanımı cok basit arayüzü de çok sade bir programdır.Ben sadece Arduino ile haberleşme kısmını anlatacağım.
Serial Line: Arduino’nun bağlı olduğu com eşleştirilir.
Speed : Serial.begin(); olarak void setup’un içine yazdığınız satırdaki hızla aynı değere sahip olmalıdır.
Connection type: Konsoldan değer girmek için Serial seçilecektir.
Not: “I2C Hakkında kısa bilgi” konu başlığı Wikipedia’dan alınmıştır.
Süper bir yazı. Ellerinize sağlık.
Yorumunuz için teşekkür ederim Hakan bey .
2. örnekteki slave arduino kodunun 24. satırında Serial.print(c) ne işe yarıyor anlayamadım. Yardımcı olursanız sevinirim iyi günler.
Merhaba, bahsettiğiniz örnekte ilgili satırdaki “Serial.print(c)” komutu, i2c hattında iletilen veriyi seri mönitör yardımı ile görebilmemiz için kullanılmıştır. Yani master’ dan gelen verileri o komut yardımı ile seri monitörde görebiliriz. iyi çalışmalar dilerim…
peki bilgilerin seri port ekranında değilde lcd ekranda görünmesini istersek ne yapabiliriz?
Merhaba, dediğiniz işlemi yapmak için Arduino ile LCD kullanımına bakmanız gerekmektedir. Bunun ile ilgili örnekler web sitemizde de mevcuttur. İyi çalışmalar dilerim…
3 yada 4 slave bağlı ise master cihaz hangi slave de veri olduğunu tek tek sormak zorundamı. mesela 2. slave de veri varsa master istemeden bu veriyi gönderemiyor mu