Arduino Wire Kütüphanesi İle I2C Haberleşme

Arduino Wire kütüphanesi, I2C haberleşme yöntemiyle donanımsal olarak senkron seri haberleşme sağlayan kütüphanedir. Bu kütüphane ile bir clock hattı ve bir veri hattı kullanarak 2 ya da daha fazla cihaz ile donanımsal senkron seri haberleşme sağlanabilir. Wire kütüphanemizin çalışma mantığı, bir önceki dersimizde bahsettiğimiz shiftIn ve shiftOut fonksiyonlarımızın çalışma mantığı ile aynıdır. Ancak wire kütüphanesi donanımsal bir kütüphane olduğu için daha hızlı haberleşme sağlamaktadır. Arduino UNO kartımız için wire kütüphanesi ile haberleşme sağlayabileceğimiz pinler A4(SDA) ve A5(SCL) pinleridir. SDA pinimiz veri aktarımı için kullandığımız data hattımız, SCL pinimiz ise cihazlarımızın senkronizasyonu olarak kullanmamız gereken clock hattımızdır.

I2C haberleşme yöntemi ile birden fazla cihaz haberleşme sağlayabilir ancak, bir cihaz veri gönderirken diğer cihazlar veri yolunun boşalmasını beklemek zorundadır. Ay nı anda 2 cihaz veri gönderirse, data hattında çakışma meydana gelecektir.

I2C haberleşme bağlantısı aşağıdaki gibi olmalıdır;

Wire kütüphanemizi kullanabilmek için öncelikle #include <Wire.h> komutu ile wire kütüphanemizi projemize dahil etmeliyiz.

Wire kütüphanemizde 9 temelfonksiyonumuz bulunmaktadır

  1. begin()
  2. requestFrom()
  3. beginTransmission()
  4. endTransmission()
  5. write()
  6. available()
  7. read()
  8. onReceive()
  9. onRequest()

1. begin() Fonksiyonu

begin() fonksiyonumuz senkron seri (Wire) haberleşmesini başlatan fonksiyonumuzdur. begin() fonksiyonu setup() yapımız içerisinde yalnızca 1 kez çağrılır. Eğer fonksiyona herhangi bir parametre girilmemişse, cihazımız Master olarak çalışacak demektir. Eğer 0 ile 127 arasında bir değer girilmişse, cihazımız slave olarak çalışacak demektir ve master cihazın komutlarını uygulayacaktır. 0 ile 127 arasındaki değer slave cihazımızın kimliğini belirtecektir.

Sözdizimi: Wire.begin(adres);

adres : slave cihaz adresi (isteğe bağlı) 7 bit (kullanılmamışsa cihaz master olarak çalışacaktır)

Geriye dönüş değeri yoktur.

Kullanım:

2. beginTransmission()

beginTransmission() fonksiyonu Master cihazdan Slave cihaza veri göndermeye başlamak için cihaz adresinin set edildiği fonksiyondur. Bu fonksiyon ile veri gönderilecek cihazın adresi belirtildikten sonra veri göndermeye başlanabilir.

Sözdizimi: Wire.beginTransmission(adres);

adres : veri gönderilecek slave cihazın adresi

beginTransmission fonksiyonu geriye herhangi bir değer döndürmez.

3. endTransmission Fonksiyonu

beginTransmission fonksiyonu ile başlatılan veri iletimini sonlandırmak için kullanılır. endTransmission() fonksiyonu herhangi bir parametre almaz ve geriye değer döndürmez.

Sözdizimi: endTransmission();

4. write() Fonksiyonu

Master ve Slave cihaz için veri gönderme fonksiyonudur. write fonksiyonu master cihazdan slave cihaza ya da slave cihazdan master cihaza veri göndermek için kullanılır. write fonksiyonu Wire yöntemi ile 1 byte değerindeki veri, string ya da byte dizisi gönderilebilir.

Sözdizimi:

Wire.write(value);
Wire.write(string);
Wire.write(dizi, uzunluk);

value : 1 byte değerindeki veri (byte)
string : metin türünden karakter dizisi
dizi : gönderilecek byte dizisi
lenght : gönderilecek byte dizisi uzunluğu

Örnek olarak Master cihazdan Slave cihaza bir veri gönderelim:

5. available Fonksiyonu

available fonksiyonu, wire haberleşme yöntemi ile okunmaya hazır mevcut byte sayısını almak için kullanılır. Herhangi bir parametre almaz, geriye tampon bellekteki okunmaya hazır byte sayısının integer türü değerini döndürür.

Sözdizimi: Wire.available();

6. read() Fonksiyonu

Wire.read() fonksiyonu wire yöntemi ile gönderilen bir veriyi okumak için kullanılan fonksiyondur. read fonksiyonu herhangi bir parametre almaz. Geriye alınan 1 byte değerindeki veriyi döndürür. Eğer bir byte değerinden fazla veri alınmış ise, bir döngü yardımı ile alınan veriler diziye aktarılabilir. Hem Master cihazda hem de Slave cihazda veri okumak için kullanılır.

Sözdizimi: Wire.read();

7. onReceive() Fonksiyonu

Bu fonksiyonumuz Slave cihaz için Master cihazdan veri aldığında çalışacak fonksiyonu belirtmek için kullanılır. Yani Master cihazdan bir veri gönderdiğimizde Slave cihazda veriyi alacak olan fonksiyonu belirtmek için kullanılır.

Sözdizimi: Wire.onReceive(fonksiyonum);

fonksiyonum : Master cihazdan veri geldiğinde slave cihazda çalışacak fonksiyon

Örnek olarak yukarıda master cihazdan gönderdiğimiz veriyi aşağıdaki kodlarla slave cihazdan okuyup seri porta yazdıralım.

Slave cihaz kodları:

8. onRequest() Fonksiyonu

onRequest() fonksiyonu, Master cihaz Slave cihazdan veri talebinde bulunduğunda, slave cihazda çalışacak fonksiyonu belirtmek için kullanılır. onRequest() fonksiyonu, istek durumunda çalışacak olan fonksiyonu parametre olarak alır ve geriye değer döndürmez.

Sözdizimi: Wire.onRequest(istekFonksiyonu);

istekFonksiyonu : Master cihaz Slave cihazdan veri talep ettiğinde, slave cihazda çalışacak olan fonksiyon.

9. requestFrom() Fonksiyonu

Master cihaz tarafından, slave cihazdan byte okuma isteğinde bulunmak için kullanılmaktadır.

Sözdizimi: Wire.requestFrom(adres, miktar, durak);

adres : veri istenecek slave cihaz adresi (7 bitlik cihaz adresi)
miktar : talep edilen byte sayısı
durak : istekten sonra veri yolunun durumu (boolean – True ise istekten sonra veriyolu serbest bırakılarak stop komutu gönderilir, False ise veriyolu açık tutularak master cihazın başka bir slave cihaza istekte bulunması engellenir.

Geriye byte cinsinden Slave cihazdan gönderilen bayte sayısını döndürür.

Örnek olarak master cihaz veri isteğinde bulunduğunda A0 pininden okunan analog değerleri gönderen fonksiyonu yazalım;

Öncelikle Master cihaz için 1 saniye aralıklarla slave cihazın A0 pininden analog değeri çekip seri porta yazdıran programımızı yazalım:

Şimdi de slave cihazın okuma isteğine cevap veren yani A0 pininden değeri okuyup master cihaza gönderen programı yazalım:

Kodlarımızı yazıp kartımıza yüklüyoruz ve aşağıdaki bağlantıyı yapıp çalıştırıyoruz.

Slave cihazdaki potansiyometreyi oynadıkça 1 sn aralıklarla seri porta gelen değerin değiştiğini izleyebilirsiniz:

Yorum Yap