I2C Haberleşme ve 5 adet Arduinoyu I2C ile haberleştirme

I2C Haberleşme ve 5 adet Arduinoyu I2C ile haberleştirme

Herkese merhabalar, bu yazıda sizlerle arduino ile I2C haberleşmesi üzerinden konuşacağız. İlk olarak I2C den bahsedeceğiz sonra arduino ile uygulama yapacağız. Bu uygulamada 5 tane arduinoyu birbiriyle haberleştirceğiz.

Hadi başlayalım.

İlk olarak Arduino Nedir ?

I2C, Inter Integrated Circuits anlamına gelmektedir. I2C ile birden fazla cihaz iki adet kablo haberleşebilir. Her bir cihaz için yeni bir pin seçimine gerek yoktur ve her cihaz aynı hat ile birbirine bağlıdır. Bütün cihazların kendilerine ait bir kimlik numarası vardır ve haberleşmeyi bu numaralar üzerinden yapmaktadırlar. I2C hız olarak SPI haberleşmeden yavaştır. İlk başlarda 100kHz frekansta haberleşme yaparken, daha sonra Fast mode ile 400kHz hızına çıkmıştır. Yeni gelişen teknoloji ile birlikte High Speed modda 3.4 MHz ve ultra Fast Mod ile 5MHz hızına ulaşmış durumdadır.Bugünlerde birçok cihaz I2C haberleşmeyi desteklemektedir. Birçok sensör I2C protokolünü kullanmaktadır.
Haberleşme hattına bağlı olan cihazların bağlantılarında bir pull-up direncine sahip olması gerekmektedir. I2C hattına bağlı olan bütün cihazlar bir start sinyali le haberleşmeyi başlatır ve bir stop sinyali ile haberleşmeyi durdururlar. I2C haberleşme protokolü neredeyse sınırsız sayıda cihazı destekler fakat cihazlara ait ID numaraları en fazla 7-bit değerinde olabilir. Yani en fazla 127 adet cihaz bağlanabilir. Master cihazın bir ID bilgisine ihtiyacı yoktur.

Aşağıdaki resimde tipik olarak bir I2C bağlantı şemasını görmektesiniz:

I2C Typical Connection

I2C haberleşme hattında iki adet bağlantı bulunur. Bunlar SCL(Serial Clock) ve SDA(Serial Data).

  • SDA : Bu bağlantı ile master cihazlar ile slave cihazlar arasında veri taşınır. Veri taşıma bu hat üzerinde çift yönlüdür.
  • SCL : Bu hat üzerinden hattın haberleşme frekansı ayarlanır ve bütün cihazların senkronize kalması sağlanır.
Aşağıdaki resimde SDA ve SCL sinyallerini görebilirsiniz.. SDA and SCL Signals

I2C anlatımımız buraya kadardır. Şimdi arduino ile bir I2C örneği yapalım,

Bu örneğimizde 5 tane arduinoyu birbirine I2C hattı üzerinden bağlayıp haberleştireceğiz. Aşağıdaki resimde arduinoların bağlantılarını görebilirsiniz.

Connect Five Arduinos On Same I2C Bus
Master cihaz kodu (master.ino)

//I2C Haberleşme Master cihaz
#include <Wire.h>

//Slave cihazların ID tanımlamaları
#define DEVICE_ID_1 1
#define DEVICE_ID_2 2
#define DEVICE_ID_3 3
#define DEVICE_ID_4 4
#define DEVICE_ID_5 5

//Slave cihazlardan okunacak olan verilerin boyutlarını tanımlıyoruz
#define DEVICE_1_SIZE 5
#define DEVICE_2_SIZE 15
#define DEVICE_3_SIZE 32
#define DEVICE_4_SIZE 20
#define DEVICE_5_SIZE 5

//Slave cihazlardan alınan verileri seri portlar üzerinen göndermek için oluşturulan değişkenler
String output_1 = "";
String output_2 = "";
String output_3 = "";
String output_4 = "";
String output_5 = "";

String all_outputs = "";

void setup()
{
    Serial.begin(9600);  

    output_1 = "";
    output_2 = "";
    output_3 = "";
    output_4 = "";
    output_5 = "";

    all_outputs = "";
  
    //I2C haberleşmesini aktifleştiriyoruz
    Wire.begin(); 

}

void loop()
{
     read_I2C_bus();
     delay(100);
}

void read_I2C_bus(){

    output_1 = "";
    output_2 = "";
    output_3 = "";
    output_4 = "";
    output_5 = "";

    all_outputs = "";

  //Slave cihazdan beirtilen boyuttaki veri istenir. ve gelenler ilgili değişkene aktarılır.
  Wire.requestFrom(DEVICE_ID_1, DEVICE_1_SIZE);    
  while (Wire.available()) { 
    char c = Wire.read(); 
    output_1 += c;         
  }

  Wire.requestFrom(DEVICE_ID_2, DEVICE_2_SIZE);    
  while (Wire.available()) { 
    char c = Wire.read(); 
    output_2 += c;        
  }

  Wire.requestFrom(DEVICE_ID_3, DEVICE_3_SIZE);    
  while (Wire.available()) { 
    char c = Wire.read(); 
    output_3 += c;       
  }

  Wire.requestFrom(DEVICE_ID_4, DEVICE_4_SIZE);    
  while (Wire.available()) {
    char c = Wire.read(); 
    output_4 += c;       
  }

  Wire.requestFrom(DEVICE_ID_5, DEVICE_5_SIZE);    
  while (Wire.available()) {
    char c = Wire.read(); 
    output_5 += c;       
  }  

  all_outputs = output_1 + ":" + output_2 + ":" + output_3 + ":" + output_4 + ":" + output_5;     

  Serial.println(all_outputs);
  
}

Yukarıdaki master cihaz için yazdığım kod slave cihazlardan sırasıyla istek yaparak okuma yapacaktır. Şimdi sırada slave cihazların kodlarını yazmamız gerekmektedir.

Slave cihazlara yazılan kodların hepsi aynı mantıkta olacaktır. Dolayısıyla ben bir tanesi için yazacağım ve diğer cihazlara yüklerken sadece ID değerlerini değiştirerek yükleyeceğim. İlk olarak gerekli olan Wire.h kütüphanesini eklemeyi unutmadan DEVICE_ID değerini tanımlayacağım. Burada ilk cihazımda 1 olarak tanımladım ve diğerlerinide ana cihazda belirlediğim değerleri tanımlamayı unutmayın Eğer unutursanız haberleşme gerçekleşmez.

Aşağıdaki kod bloğunu inceleyiniz
slave_device_1.ino

//I2C haberleşme kütüphanesi
#include <Wire.h>
//Slave Device ID
//Bu değerin master cihaz tanımlamalarında olması gerektiğine dikkat edin.
//Bu değer diğer cihazlar için değişecek olan değerdir.
#define DEVICE_ID 1 

void setup() {
   //Seri haberleşme protokolünü başlatalım
   Serial.begin(9600);

   //I2C haberleşmeyi belirlenen DEVICE_ID değeriyle başlatalım
   Wire.begin(DEVICE_ID);  
   //I2C isteği geldiğinde çalışacak olan method.
   Wire.onRequest(requestEvent); 
}

void loop() {
   //Burada bir işleme gerek yok. Çünkü requestEvent metodunun içinde gönderim yapılacak.
}

void requestEvent()
{
   //Master cihazda birinci cihaz için 5 karakterlik bir buffer belirlenmişti.
  String data = "xxxxx";
  Serial.println(data );
  
  //Veriyi I2C hattına yazıyoruz
  Wire.write(data .c_str());  

}

Yukarıdaki kod içerisinde her bir cihaza özgü alanları değiştirerek yüklediğimizde hepsi haberleşmeye hazır olacaktır.

Bu yazımızda bu kadar.

İyi I2C haberleşmeler :)

Burak Hamdi TUFAN


Tags


Share this Post

Send with Whatsapp

Post a Comment

Success! Your comment sent to post. It will be showed after confirmation.
Error! There was an error sending your comment. Check your inputs!

Comments

  • There is no comment. Be the owner of first comment...