Web sitemize hoşgeldiniz, 21 Haziran 2025
muratdonmez.com.tr
Anasayfa » IOT » I2C ile Arduino’lar Arası Veri Aktarımı

I2C ile Arduino’lar Arası Veri Aktarımı

I2C ile Arduino’lar Arası Veri Aktarımı

I2C protokolünün çalışma mantığını ve fonksiyonlarını I2C Protokolü Nedir, Nasıl Çalışır? yazımda öğrendiğimize göre örnek bir uygulama ile I2C’nin çalışma mantığını daha iyi anlayabiliriz.

Örneğimizde 2 adet Arduino Uno kullanacağız ve Arduino Uno’lardan bir tanesini Master (Ana) diğerini de Slave (Köle) yapacağız. Örneğimizin çalışma mantığı şu şekilde olacak:

  • Master (Ana Cihaz) görevindeki Arduino Uno, Slave (Köle) görevindeki Arduino Uno’ya bağlı LED’leri kontrol edecek ve Slave olan Arduino’dan verileri alacak.
  • Slave görevindeki Arduino Uno, Master (Ana Cihaz) olan Arduino Uno’dan gelen verileri yorumlayarak, gelen veriye göre LED’leri yakıp söndürecek ve Master Arduino’ya veri gönderecek.

Gelelim kullanacağımız malzemelerin listesine ve devremizin şemasına.

  • 2 adet Arduino Uno
  • 2 adet 4,7 kΩ Direnç
  • 1 adet LED
  • 1 adet 220 Ω Direnç
  • 1 adet Breadboard
  • Bağlantılar için kablolar

 

I2C

Eğer devredeki Arduino’larda farklı besleme kaynağı kullanırsanız, besleme kaynaklarının toprak hatlarını birleştirmeyi unutmayın. Unutursanız devrenin çalışmasında sıkıntılar olacaktır. Slave’den alınan verileri görmek için Master Arduino’yu bilgisayara bağlayarak Arduino IDE üzerinden seri monitörü açmalısınız.

Master Arduino’ya yüklenecek I2C haberleşme kodumuz:

/* Master Arduino Uno ya yuklenecek kod */

#include <Wire.h>
/* 
 * I2C fonksiyonlarini kullanabilmek icin 
 * Wire.h kutuphanesini ekliyoruz.
 */
 
void setup()
{
  Wire.begin();
  /* I2C haberlesmesini master olarak baslatiyoruz */
  
  Serial.begin(9600);
  /* Bilgisayarla haberlesme icin seri haberlesmeyi baslatiyoruz. */
}

void loop()
{
  Wire.beginTransmission(1);
  /* Haberlesmeyi baslatip 1 adresine sahip Slave (kole)
   * cihazına veri yollanacagini bildiriyoruz */
  Wire.write("x");
  /* x karakterini slave cihaza yolluyoruz, x karakterini
   * Slave cihazda LED'i yakmak icin kullanacagiz. */
  Wire.endTransmission();
  /* Yollanacak verilerin bittigini bildiriyoruz. */
  
  delay(1000);
  
  Wire.beginTransmission(1);
  /* Haberlesmeyi baslatip 1 adresine sahip Slave (kole)
   * cihazına veri yollanacagini bildiriyoruz */
  Wire.write("y");
  /* y karakterini slave cihaza yolluyoruz, y karakterini
   * Slave cihazda LED'i sondurmek icin kullanacagiz. */
  Wire.endTransmission();
  /* Yollanacak verilerin bittiği bildiriliyor */
  
  delay(1000);
  
  Wire.requestFrom(1, 7);
  /*  1 adresine sahip slave (kole) cihazimizdan 7 BYTE'lik veri bekliyoruz */
  char gelenVeri;
  /* I2C hattindan gelen verileri gelenVeri degiskenine yazdiriyoruz */
  while(Wire.available()){
    /* I2C hattinda yeni veri oldugu surece donguyu devam ettiriyoruz */
    gelenVeri = Wire.read();
    /* I2C hattindan gelen verileri okuyoruz */
    Serial.print(gelenVeri);
    /* Gelen verileri ekrana yazdiriyoruz */
  }
  Serial.println();
 
  delay(1000);
}

Master Arduino’ya yüklediğimiz kodumuzu inceleyecek olursak; öncelikle I2C haberleşmeyi yapabilmek için Wire.h kütüphanesini kodumuza ekliyoruz. Daha sonra, Wire.begin() komutu ile I2C haberleşmeyi Master cihaz olarak başlatıp, bilgisayar ile haberleşerek alınan veriyi ekrana yazdırmak için de seri haberleşmeyi açıyoruz.

Loop fonksiyonun içinde ise Wire.beginTransmission(1) komutu ile hangi Slave cihaza veri göndereceğimizi belirtip, birer saniye aralıklarla Slave cihaza önce ‘x’, sonra da ‘y’ karakteri yollayarak, LED’i önce yakıp sonra da söndürüyoruz.

Verilerimizi gönderdikten sonra da, Wire.endTransmission() komutu ile haberleşmenin sona erdiğini Slave cihazımıza bildiriyoruz.

Slave cihazımızdan veri almak için de, Wire.requestFrom(1, 7) komutunu kullanıyoruz. Bu komutla Slave cihazımıza 7 byte’lık bilgiyi Master cihaza aktaracağını anlatıyoruz. Yeni veri geldikçe ekrana yazdırmak için de While döngüsünü Wire.available() koşulu ile çalıştırıyoruz. Gelen veriyi de Wire.read() fonksiyonu ile gelenVeri değişkenine aktarıp Serial.print(gelenVeri) ile ekrana yazdırıyoruz.

Slave Arduino Uno’ya yüklenecek kodumuz:

/* Slave (kole) Arduino Uno'ya yuklenecek kodumuz */
#include <Wire.h> 
/* 
 * I2C fonksiyonlarini kullanabilmek icin 
 * Wire.h kutuphanesini ekliyoruz.
 */
 
const int LED = 13;
/* LED'i 13. pine bagladigimiz icin pin nosunu belirtiyoruz */
 
void setup()
{
  Wire.begin(1);
  /* I2C haberlesmesini, slave cihazinin haberlesme adresi 1 olacak sekilde baslatiyoruz. */
  Wire.onRequest(istekGeldiginde);
  /* 
  Master Arduino cihazimizdan geriye veri gonderme istegi geldiginde yapilacak islemleri burada yapiyoruz. 
  */
  Wire.onReceive(veriGeldiginde);
  /*
  Master Arduino cihazimizdan veri geldiginde yapilacak islemleri burada yapiyoruz.
  */
  
  pinMode(LED,OUTPUT);
  /* LED'i yakip sondurmek icin LED pinini cikis olarak ayarliyoruz */
}
 
void loop()
{
  /*
  * Tum islemler veri istegi geldiginde veya yeni veri geldiginde 
  * yapilacagi icin loop fonksiyonunun ici bos birakilmistir.
  */
  delay(1);
}
 
void veriGeldiginde(int veri)
{
  /* I2C hattindaki bu cihaz icin yeni veri geldiginde bu fonksiyon calisir */
  char gelenKarakter;
  /* Hattaki veri okunarak gelenKarakter degiskenine kaydedilir */
  while(Wire.available()){
    gelenKarakter = Wire.read();
  }
  /* Eger gelen veri 'x' ise LED'i yakiyoruz, 'y' ise LED'i sonduruyoruz. */
  if(gelenKarakter == 'x')
    digitalWrite(LED,HIGH);
  else if(gelenKarakter == 'y')
    digitalWrite(LED,LOW);
}
 
void istekGeldiginde()
{
  /* 
  * Eger master bu cihazdan veri istiyorsa herhangi bir sensor baglamadigimiz icin
  * master cihaza "Merhaba" verisi yolluyoruz. 
  */
  Wire.write("Merhaba"); 
}

Slave Arduino’ya yüklediğimiz kodumuzu inceleyecek olursak; öncelikle I2C haberleşmeyi yapabilmek için Wire.h kütüphanesini kodumuza ekliyoruz. Daha sonra, Wire.begin(1) komutu ile I2C haberleşmeyi 1 nolu slave cihaz olarak başlatıyoruz.

Master cihazdan gelen komutları algılamak ve uygulamak için Wire.onReceive(veriGeldiginde) fonksiyonunu kullanıyoruz. Bu fonksiyon ile veriGeldiginde() fonksiyonunu çağırıp gelen komut ‘x’ ise LED’i yakıyor, ‘y’ ise LED’i söndürüyoruz.

Master cihazdan gelen veri isteklerini algılamak ve veri göndermek için de Wire.onRequest(istekGeldiginde) fonksiyonunu kullanıyoruz. Bu fonksiyon ile istekGeldiginde() fonksiyonunu çağırıp geriye ‘Merhaba’ mesajı gönderiyoruz. Eğer Slave Arduino’ya sensör bağlı olsaydı, Master Arduino’ya sensörden okuduğumuz verileri gönderiyor olacaktık.

Bu yazımda I2C ile haberleşmenin nasıl yapılacağını gösteren bir örnekle, I2C haberleşme konusunu detaylı olarak öğrenmiş olduk. I2C sadece mikrodenetleyiciler arasında haberleşmek için değil I2C protokolünü destekleyen sensörlerden veri almak için de kullanılır. Böylelikle az sayıda kablo ile kablo karmaşası olmadan birden fazla sensör kontrol edilebilir.

Etiketler:

BU KONUYU SOSYAL MEDYA HESAPLARINDA PAYLAŞ
Yorumlar

Henüz yorum yapılmamış.

Yorum Yaz