I2C (Inter-Integrated Circuit I-Squared-C) Protokolü

watch_later 1/11/2016
comment 1 Comment
Arduino, diğer Arduino veya sensörlerle haberleşmek için bazı haberleşme protokolleri kullanır. Bu protokollerden birisi de I2C'dir. I2C (Inter-Integrated Circuit), seri haberleşme türlerinden senkron haberleşmeye bir örnektir. Haberleşme için toprak hattı dışında SDA ve SCL olmak üzere iki hatta ihtiyaç duyulmaktadır. Hat sayısının fazla olması nedeniyle, uzun mesafeli haberleşmelerde tercih edilmez. Genellikle kısa mesafeli ve düşük veri aktarım hızının yeterli olduğu yerlerde kullanılır.
I2C haberleşmesinde, haberleşmeyi kontrol eden master cihazı bulunur. Her haberleşmede bir tane master bulunmalıdır. Haberleşmenin sağlanabilmesi için haberleşme hattına en az bir adet slave (köle) cihaz bağlanmalıdır. Hatta bağlanan birden fazla slave cihazlardan hangisinin veri aktaracağına, master cihaz karar verir. Böylece hat sayısında bir değişiklik olmadan birden fazla cihazla haberleşme sağlanır.


Master ve slave cihazların aynı besleme hattına bağlanmasına gerek yoktur. Fakat iletişimin sağlanması için toprak hatlarının aynı olması gerekir. Bunun yanında veri aktarımı için SDA (Serial Data Line) ve SCL (Serial Clock) olmak üzere iki adet haberleşme hattı bulunur. Bu hatlardan SDA, cihazlar arasındaki veri aktarımının sağlandığı hattır. Bu hatta çift yönlü veri aktarımı olur. Hatta aktarılan verilerin senkronizasyonu, SCL hattı tarafından gerçekleştirilir. SCL hattında master cihaz tarafından üretilen saat sinyali bulunur. SDA hattındaki haberleşme, bu sinyale göre düzenlenir.
Haberleşmenin tüm hat boyunca hatasız bir şekilde sağlanabilmesi için SDA ve SCL hatları, pull-up dirençlerle VCC hattına bağlanmalıdır.

I2C Protokolünün Çalışma Prensibi

Arduino TWI Kütüphanesi
I2C haberleşme protokolünün çalışma şeklini ve bağlantı hatlarını öğrendiğimize göre, Arduino'nun I2C haberleşmesini yapabilmesi için kullanmamız gereken fonksiyonları tanıyalım. Bu fonksiyonlar Arduino'nun "Wire.h" kütüphanesi içerisinde bulunmaktadır. Bu yüzden öncelikle bu kütüphaneyi projemize dahil etmeliyiz.

  • wire.begin(): I2C haberleşmesini başlatan fonksiyondur. Bu fonksiyon parametre olarak slave cihazın adresini alır. Eğer cihaz master olarak tanımlanacak ise bu fonksiyona herhangi bir parametre atanmaz. Örnek olarak haberleşme hattında '1' adresine sahip slave bir Arduino tanımlanmak isteniyorsa, wire.begin(1); yazılır. Eğer bu Arduino haberleşme hattının master cihazı olarak tanımlanmak istenseydi fonksiyon, wire.begin(); olarak çağırılmalıydı.
  • wire.available(): Fonksiyon hat üzerinden Arduino'ya ulaşmış veri paketlerinin sayısını döndürür. Eğer fonksiyonun değeri 0'dan büyükse Arduino'ya gelen yeni veri paketi vardır.
  • wire.beginTransmission(): Master cihazın hat üzerinde bulunan slave cihazlardan hangisiyle haberleşmek istediğini belirler. Fonksiyon, parametre olarak haberleşmeye başlayacağı cihazın adresini alır.
  • wire.endTransmission(): Hat üzerindeki veri aktarımının sonlandığını belirtir.
  • wire.read(): Veri hattından gelen verinin okunmasını sağlar.
  • wire.write(): Fonksiyona yazılan parametreyi veri hattına aktarır. Kısaca veri yollamak için kullanılır.
  • wire.onReceive(): Slave olarak tanımlanmış cihaza veri geldiğinde, cihazın yapacağı işlemi belirleyen fonksiyondur. Fonksiyon parametre olarak veri geldiğinde, çağırılacak fonksiyonun ismini alır.
  • wire.requestFrom(): Master tarafında kullanılan bu fonksiyon ile slave cihazdan veri istenir. Fonksiyonun ilk parametresi, slave cihazın adresini belirler. İkinci parametre ise slave cihazdan kaç byte'lık veri beklendiğini belirler. Üçüncü ve son parametre ise hattın istekten sonraki durumunu belirler.
  • wire.onRequest(): Slave tarafında kullanılan bu fonksiyon, master cihazdan veri isteği geldiğinde çalıştırılacak fonksiyonu belirler. Bu fonksiyon parametre olarak çalıştırılacak fonksiyonun ismini alır.       
SDA ve SCL Bağlantı Pinleri Pinout Diyagramı
    Master board'un kontrolü altındaki bir geçici anahtara her basıldığında Slave board kontrolü altındaki bir ledi yakıp söndürecek devre tasarımı:

Arduino Sketch:
/* I2C haberleşmesinde Master*/
#include 
/*
 * I2C fonksiyonlarını kullanabilmek için
 * Wire.h kütüphanesini ekledik
 */
void setup()
{
  Wire.begin();
  /* I2C haberleşmesi master olarak başlatıldı */
  Serial.begin(9600);
}

void loop()
{
  Wire.beginTransmission(1);
  /* 1 adresine sahip Slave'e veri yollanacağı bildiriliyor */
  Wire.write(digitalRead(3));
  /* herhangi bir sayı slave cihaza yollanıyor */
  Wire.endTransmission();
  /* Yollanacak verilerin bittiği bildiriliyor */
}
/* Slave (köle) görevindeki*/
#include 
/*
 * I2C fonksiyonlarını kullanabilmek için
 * Wire.h kütüphanesini projemize ekledik
 */
const int LED = 13;
void setup()
{
  Wire.begin(1);
  /* I2C haberleşmesi, haberleşme adresi 1 olan
   bir slave cihaz olarak başlatıldı */
  Wire.onReceive(veriGeldi);
  /*
  Master olan cihazdan bu Arduino'ya veri 
  geldiğinde yapılacak işlem seçildi
  */
  pinMode(LED, OUTPUT);
}
void loop()
{
  /*
  * Tüm işlemler veri isteği geldiğinde veya yeni veri geldiğinde
  * yapılacağı için loop fonksiyonunun içi boş bırakılmıştır
  */
  delay(1);
}

void veriGeldi(int veri)
{
  /* I2C hattında bu cihaz için yeni veri 
  olduğunda bu fonksiyon çalışır */
  int income;
  /* Hattaki veri okunarak gelenKarakter 
   değişkenine kaydedilir */
  while (Wire.available()) {
    income = Wire.read();
  }
  /* Eğer gelen button HIGH durumunda ise LED yakılır, 
    LOW ise LED söndürülür */
  if (income)
    digitalWrite(LED, HIGH);
  else if (!income)
    digitalWrite(LED, LOW);
}
  



I2C Fritzing Şeması





Bir sonraki yazımda görüşmek üzere...
avatar

merhaba,i2c kullanarak bağladığım 4 slave cihazıda 1 numaralı slave olarak başlatsam masterdan gönderdiğim veriyi 4 slave de aynı anda okuyabilirmiyim?

delete 2 Şubat 2019 16:51



sentiment_satisfied Emoticon