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ı:

Adsız

 

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ı:

Adsız

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.

Adsız2

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.

7 Comments

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir