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