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.
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...