Arduino I2C Haberleşme Nedir?
Arduino'da sensörlerle veya diğer kartlarla haberleşmek için farklı protokoller vardır. Peki Wire kütüphanesi nedir? Arduino I2C haberleşme nasıl yapılır?
27.09.2021 tarihli yazı 8446 kez okunmuştur.
I2C Haberleşme
I2C, düşük hızlı 2 telli bir arabirimde kullanılan bir seri protokoldür. İlk olarak 1982'de Phillips tarafından televizyon alıcılarındaki entegre devrelerin birbirleriyle iletişim kurmasını sağlamak için geliştirilmiştir.
Zaman değişti, Phillips artık NXP ve I2C neredeyse her büyük yarı iletken üreticisi tarafından desteklenen bir iletişim standardı haline geldi.
I2C, “Inter-Integrated Circuit” ifadesinin kısaltmasıdır. Aynı zamanda “IIC” veya “I kare C” olarak da adlandırılır.
Zaman değişti, Phillips artık NXP ve I2C neredeyse her büyük yarı iletken üreticisi tarafından desteklenen bir iletişim standardı haline geldi.
I2C, “Inter-Integrated Circuit” ifadesinin kısaltmasıdır. Aynı zamanda “IIC” veya “I kare C” olarak da adlandırılır.
Kullanımlar ve Sınırlamalar
I2C, Arduino gibi mikrodenetleyicilerle ve Raspberry Pi gibi mikrobilgisayarlarla kullanılır. Birçok ekran ve sensör, I2C kullanarak ana bilgisayar denetleyicisine arabirim oluşturur. Ancak I2C'nin çeşitli sınırlamaları vardır. Amaçlanan kullanımlarının çoğu için yeterince hızlı olmasına rağmen, özellikle hızlı değildir.
I2C sadece kısa mesafelerde kullanılabilir, sonuçta aynı baskılı devre kartındaki entegre devreler arasında iletişim kurması gerekiyordu. Güvenilir iletimin maksimum mesafesi hız arttıkça azalır, en düşük hızda (100 Kbaud veya 100 KHz saat hızı) maksimum mesafe yaklaşık bir metredir.
► Fast Mode: Bu mod, maksimum 400 KHz saat hızına sahiptir.
► Hi-Speed Mode: Maksimum saat frekansı 3.4 MHz
► Ultra Fast Mode: 5 MHz'lik maksimum saat frekansı
Bir I2C veriyolunda saat hızını belirleyen ana birimdir.
İki sinyal hattı aşağıdaki gibidir:
► SDA: Bu çift yönlü veri hattıdır.
► SCL: Bu saat sinyali hattıdır.
Her bir sinyal hattına bağlı iki adet pull-up rezistörü vardır, aktif olmadığında bus'ı besleme voltajına kadar çekerler. Besleme voltajının standart olmadığını, 3,3 veya 5 volt olabileceğini unutmayın. Bazı yüksek hızlı I2C uygulamaları için daha düşük bir voltaj da olabilir. Besleme voltajlarındaki bu fark, farklı mantık seviyeleri kullanan I2C cihazları arasında arayüz oluştururken sorunlara neden olabilir.
I2C veriyoluna arabirim oluşturulabilecek iki tür cihaz vardır, Masters ve Slaves. Master cihaz veri yolunu kontrol eder ve saat sinyalini sağlar. Slave’den tek tek veri ister. Bus üzerinde birden fazla master cihaz olabilir ancak herhangi bir anda sadece bir tanesi aktif master olabilir. Master cihazların kendilerine atanmış bir adresi yoktur.
Slave cihazların bir adresi vardır ve bu adresin veri yolunda benzersiz olması gerekir. 7 bitlik bir adresleme şeması kullanırlar, bu nedenle bir I2C veriyolunda 128 adede kadar bağımlı olabilir. Gerçek hayatta bu geniş cihaz koleksiyonu asla kullanılmaz, bir veri yolunda bir düzineden fazla I2C cihazı görmek nadirdir.
Ticari I2C cihazlarına, veri yolu özelliklerini koruyan NXP tarafından I2C adresi atanır. I2C, 2006'dan beri açık kaynak olmasına rağmen, NXP'den bir slave adresi almak için ücret alınmaktadır. Ana cihazlar veya ticari üretime yönelik olmayan cihazlar için ücret talep edilmez. Bazı I2C cihazlarına birden fazla adres atanır, genellikle alt adres bitlerindeki farklılıklar. Bu cihazlar, farklı adresler için manuel olarak yapılandırılabilir ve aynı tipte birden fazla cihazın tek bir I2C veriyolunda kullanılmasına izin verir.
Wire kitaplığı uygulaması 32 baytlık bir arabellek kullanılır, bu nedenle herhangi bir iletişim bu sınır içinde olmalıdır. Bu kütüphaneyi kullanmak için:
#include <Wire.h>
Wire kitaplığında I2C ile çalışmak için birçok faydalı fonksiyon bulunur.I2C sadece kısa mesafelerde kullanılabilir, sonuçta aynı baskılı devre kartındaki entegre devreler arasında iletişim kurması gerekiyordu. Güvenilir iletimin maksimum mesafesi hız arttıkça azalır, en düşük hızda (100 Kbaud veya 100 KHz saat hızı) maksimum mesafe yaklaşık bir metredir.
I2C Hızı
Orijinal I2C veriyolunun maksimum hızı 100 KHz'dir. Sensörlerden ve basit ekranlardan veri aktarımı için oldukça yeterli olduğundan, çoğu yaygın uygulama hala bu hızı kullanır. I2C ve bazı daha yüksek hız modlarına sahiptir. Tüm I2C cihazları şu modları desteklemez:► Fast Mode: Bu mod, maksimum 400 KHz saat hızına sahiptir.
► Hi-Speed Mode: Maksimum saat frekansı 3.4 MHz
► Ultra Fast Mode: 5 MHz'lik maksimum saat frekansı
Bir I2C veriyolunda saat hızını belirleyen ana birimdir.
I2C Nasıl Çalışır
Bir I2C veriyolu, bir güç ve toprak bağlantısı ile birlikte iki sinyale sahiptir.İki sinyal hattı aşağıdaki gibidir:
► SDA: Bu çift yönlü veri hattıdır.
► SCL: Bu saat sinyali hattıdır.
Her bir sinyal hattına bağlı iki adet pull-up rezistörü vardır, aktif olmadığında bus'ı besleme voltajına kadar çekerler. Besleme voltajının standart olmadığını, 3,3 veya 5 volt olabileceğini unutmayın. Bazı yüksek hızlı I2C uygulamaları için daha düşük bir voltaj da olabilir. Besleme voltajlarındaki bu fark, farklı mantık seviyeleri kullanan I2C cihazları arasında arayüz oluştururken sorunlara neden olabilir.
I2C veriyoluna arabirim oluşturulabilecek iki tür cihaz vardır, Masters ve Slaves. Master cihaz veri yolunu kontrol eder ve saat sinyalini sağlar. Slave’den tek tek veri ister. Bus üzerinde birden fazla master cihaz olabilir ancak herhangi bir anda sadece bir tanesi aktif master olabilir. Master cihazların kendilerine atanmış bir adresi yoktur.
Slave cihazların bir adresi vardır ve bu adresin veri yolunda benzersiz olması gerekir. 7 bitlik bir adresleme şeması kullanırlar, bu nedenle bir I2C veriyolunda 128 adede kadar bağımlı olabilir. Gerçek hayatta bu geniş cihaz koleksiyonu asla kullanılmaz, bir veri yolunda bir düzineden fazla I2C cihazı görmek nadirdir.
Ticari I2C cihazlarına, veri yolu özelliklerini koruyan NXP tarafından I2C adresi atanır. I2C, 2006'dan beri açık kaynak olmasına rağmen, NXP'den bir slave adresi almak için ücret alınmaktadır. Ana cihazlar veya ticari üretime yönelik olmayan cihazlar için ücret talep edilmez. Bazı I2C cihazlarına birden fazla adres atanır, genellikle alt adres bitlerindeki farklılıklar. Bu cihazlar, farklı adresler için manuel olarak yapılandırılabilir ve aynı tipte birden fazla cihazın tek bir I2C veriyolunda kullanılmasına izin verir.
Wire Kütüphanesi
Bu kütüphane I2C/TWI cihazları ile haberleşmeyi sağlar. Arduino R3 de SDA(data line) ve SCL(clock line), AREF pinine yakın pin başlıklarında bulunur. Arduino Due, iki I2C/TWI arayüzüne sahiptir. SDA1 ve SCL1, AREF pinine yakındır ve ek bir tanesi 20 ve 21 pinlerindedir.Wire kitaplığı uygulaması 32 baytlık bir arabellek kullanılır, bu nedenle herhangi bir iletişim bu sınır içinde olmalıdır. Bu kütüphaneyi kullanmak için:
#include <Wire.h>
• begin(): Bu, kütüphaneyi başlatır ve Arduino'yu master veya slave olacak şekilde ayarlar.
• requestFrom() : Bu fonksiyon, master tarafından bir slave'den veri talep etmek için kullanılır.
• beginTransmission(): Bu fonksiyon, master tarafından belirli bir slave'e veri göndermek için kullanılır.
• endTransmission(): Bu fonksiyon, master tarafından startTransmission fonksiyonu ile başlatılan bir iletimi sonlandırmak için kullanılır.
• write(): I2C veriyoluna veri göndermek için hem master hem de slave tarafından kullanılır.
• available(): Hem master hem de slave tarafından, aldıkları verilerdeki bayt sayısını belirlemek için kullanılır.
• read(): I2C veri yolundan bir bayt veri okur.
• SetClock(): Master tarafından belirli bir saat frekansını ayarlamak için kullanılır.
• onReceive(): Slave veri istediğinde çağrılan bir fonksiyonu belirtmek için master tarafından kullanılır.
• onRequest(): Master veri istediğinde çağrılan bir fonksiyonu belirtmek için slave tarafından kullanılır.
2 Arduino Arası I2C
Arduinolardan birini Master, diğerini Slave yapıyoruz.
Devre bağlantısı:
Bu oldukça basit bir bağlantıdır, aslında sadece ground ve iki I2C pinini birbirine bağlarsınız. Dikkat edilmesi gereken bir şey, diyagramımın pull-up dirençlerinin kullanımını göstermemesidir, onlarsız her şeyin doğru çalıştığını gördüm. Ancak, özellikle hatalar veya kesintili işlem yaşıyorsanız, bunları dahil etmek isteyebilirsiniz. Bazı pull-up dirençlerini bağlamak için SDA ve SCL hatlarına birkaç 10k direnç bağlayın. Diğer ucunu Arduino'lardan birindeki 5 voltluk çıkışa takın.
Devre bağlantısı:
Bu oldukça basit bir bağlantıdır, aslında sadece ground ve iki I2C pinini birbirine bağlarsınız. Dikkat edilmesi gereken bir şey, diyagramımın pull-up dirençlerinin kullanımını göstermemesidir, onlarsız her şeyin doğru çalıştığını gördüm. Ancak, özellikle hatalar veya kesintili işlem yaşıyorsanız, bunları dahil etmek isteyebilirsiniz. Bazı pull-up dirençlerini bağlamak için SDA ve SCL hatlarına birkaç 10k direnç bağlayın. Diğer ucunu Arduino'lardan birindeki 5 voltluk çıkışa takın.
Master Uygulaması
Master olarak belirlediğiniz Arduino’ya yükleyeceğiniz kod:
/*
I2C Master Demo
i2c-master-demo.ino
Demonstrate use of I2C bus
Master sends character and gets reply from Slave
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Include Arduino Wire library for I2C
#include <Wire.h>
// Define Slave I2C Address
#define SLAVE_ADDR 9
// Define Slave answer size
#define ANSWERSIZE 5
void setup() {
// Initialize I2C communications as Master
Wire.begin();
// Setup serial monitor
Serial.begin(9600);
Serial.println("I2C Master Demonstration");
}
void loop() {
delay(50);
Serial.println("Write data to slave");
// Write a charatre to the Slave
Wire.beginTransmission(SLAVE_ADDR);
Wire.write(0);
Wire.endTransmission();
Serial.println("Receive data");
// Read response from Slave
// Read back 5 characters
Wire.requestFrom(SLAVE_ADDR,ANSWERSIZE);
// Add characters to string
String response = "";
while (Wire.available()) {
char b = Wire.read();
response += b;
}
// Print to Serial Monitor
Serial.println(response);
}
I2C Master Demo
i2c-master-demo.ino
Demonstrate use of I2C bus
Master sends character and gets reply from Slave
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Include Arduino Wire library for I2C
#include <Wire.h>
// Define Slave I2C Address
#define SLAVE_ADDR 9
// Define Slave answer size
#define ANSWERSIZE 5
void setup() {
// Initialize I2C communications as Master
Wire.begin();
// Setup serial monitor
Serial.begin(9600);
Serial.println("I2C Master Demonstration");
}
void loop() {
delay(50);
Serial.println("Write data to slave");
// Write a charatre to the Slave
Wire.beginTransmission(SLAVE_ADDR);
Wire.write(0);
Wire.endTransmission();
Serial.println("Receive data");
// Read response from Slave
// Read back 5 characters
Wire.requestFrom(SLAVE_ADDR,ANSWERSIZE);
// Add characters to string
String response = "";
while (Wire.available()) {
char b = Wire.read();
response += b;
}
// Print to Serial Monitor
Serial.println(response);
}
Tüm I2C uygulamalarında olduğu gibi, Wire kütüphanesini dahil ederek başlıyoruz. Daha sonra, slave’in I2C adresini ve ondan almayı umduğumuz veri bayt sayısını temsil edecek birkaç sabit tanımlıyoruz. Kurulumda, I2C iletişimlerini bir master olarak başlatırız. Start fonksiyonunda adres parametresi olmadığı için bunun bir master olduğunu biliyoruz. Ayrıca bir seri monitör kuruyoruz ve ona bir metin satırı yazdırıyoruz.
Döngüye küçük bir zaman gecikmesi ile başlıyoruz, çoğunlukla işleri yeterince yavaşlatmak için seri monitördeki ekranı okuyabiliyoruz. Ardından, slave'e veri göndermek için startTransmission işlevini kullanırız. Bu durumda gönderdiğimiz veriler sadece bir sıfırdır. EndTransmission işlevine bir çağrı ile göndermeyi bitiriyoruz. Ardından, requestFrom işlevini kullanarak köleden bazı verileri geri istiyoruz. Bundan sonra, slave’den her seferinde bir bayt olan verileri okuyarak bir yanıt dizesi formüle ederiz. Yaptığımız işin ve aldığımız verilerin detaylarını seri monitöre yazdırıyoruz. Sonra Döngüyü bitiriyoruz ve her şeyi baştan yapıyoruz.
Döngüye küçük bir zaman gecikmesi ile başlıyoruz, çoğunlukla işleri yeterince yavaşlatmak için seri monitördeki ekranı okuyabiliyoruz. Ardından, slave'e veri göndermek için startTransmission işlevini kullanırız. Bu durumda gönderdiğimiz veriler sadece bir sıfırdır. EndTransmission işlevine bir çağrı ile göndermeyi bitiriyoruz. Ardından, requestFrom işlevini kullanarak köleden bazı verileri geri istiyoruz. Bundan sonra, slave’den her seferinde bir bayt olan verileri okuyarak bir yanıt dizesi formüle ederiz. Yaptığımız işin ve aldığımız verilerin detaylarını seri monitöre yazdırıyoruz. Sonra Döngüyü bitiriyoruz ve her şeyi baştan yapıyoruz.
Slave Uygulaması
Slave olarak belirlediğiniz Arduino’ya yükleyeceğiniz kod:
/*
I2C Slave Demo
i2c-slave-demo.ino
Demonstrate use of I2C bus
Slave receives character from Master and responds
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Include Arduino Wire library for I2C
#include <Wire.h>
// Define Slave I2C Address
#define SLAVE_ADDR 9
// Define Slave answer size
#define ANSWERSIZE 5
// Define string with response to Master
String answer = "Hello";
void setup() {
// Initialize I2C communications as Slave
Wire.begin(SLAVE_ADDR);
// Function to run when data requested from master
Wire.onRequest(requestEvent);
// Function to run when data received from master
Wire.onReceive(receiveEvent);
// Setup Serial Monitor
Serial.begin(9600);
Serial.println("I2C Slave Demonstration");
}
void receiveEvent() {
// Read while data received
while (0 < Wire.available()) {
byte x = Wire.read();
}
// Print to Serial Monitor
Serial.println("Receive event");
}
void requestEvent() {
// Setup byte variable in the correct size
byte response[ANSWERSIZE];
// Format answer as array
for (byte i=0;i<ANSWERSIZE;i++) {
response[i] = (byte)answer.charAt(i);
}
// Send response back to Master
Wire.write(response,sizeof(response));
// Print to Serial Monitor
Serial.println("Request event");
}
void loop() {
// Time delay in loop
delay(50);
}
I2C Slave Demo
i2c-slave-demo.ino
Demonstrate use of I2C bus
Slave receives character from Master and responds
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Include Arduino Wire library for I2C
#include <Wire.h>
// Define Slave I2C Address
#define SLAVE_ADDR 9
// Define Slave answer size
#define ANSWERSIZE 5
// Define string with response to Master
String answer = "Hello";
void setup() {
// Initialize I2C communications as Slave
Wire.begin(SLAVE_ADDR);
// Function to run when data requested from master
Wire.onRequest(requestEvent);
// Function to run when data received from master
Wire.onReceive(receiveEvent);
// Setup Serial Monitor
Serial.begin(9600);
Serial.println("I2C Slave Demonstration");
}
void receiveEvent() {
// Read while data received
while (0 < Wire.available()) {
byte x = Wire.read();
}
// Print to Serial Monitor
Serial.println("Receive event");
}
void requestEvent() {
// Setup byte variable in the correct size
byte response[ANSWERSIZE];
// Format answer as array
for (byte i=0;i<ANSWERSIZE;i++) {
response[i] = (byte)answer.charAt(i);
}
// Send response back to Master
Wire.write(response,sizeof(response));
// Print to Serial Monitor
Serial.println("Request event");
}
void loop() {
// Time delay in loop
delay(50);
}
Bir kez daha Wire kütüphanesini dahil ederek başlıyoruz. Önceki uygulamada olduğu gibi, ayrıca slave için I2C adresini ve ayrıca master'a geri göndermeyi planladığımız bayt sayısını da tanımlıyoruz. Sonra master'a geri göndereceğimiz diziyi tanımlarız, bu durumda sadece "Merhaba" kelimesini. Bunu değiştirmeye karar verirseniz, her iki çizimde de ANSWERSIZE sabitini doğru olacak şekilde ayarladığınızdan emin olun.
Kurulumda, bir başlatma işleviyle I2C veriyoluna bağlantıyı başlatırız. Bunu nasıl yaptığımıza dikkat edin, bu bir köle olduğundan, kullanacağımız I2C adresini belirtiyoruz. Bunu yaparak Wire kütüphanesi bizim bağımlı modda çalışmak istediğimizi bilir.
Şimdi iki olay meydana geldiğinde çağıracağımız fonksiyonların isimlerini tanımlamamız gerekiyor – master'dan alınan bir veri talebi ve master'dan alınan veriler. Ayrıca seri monitöre ayarlayıp yazdırıyoruz. Master cihazdan veri aldığımızda receiveEvent işlevi çağrılır. Bu işlevde, veriler mevcutken verileri okur ve bir bayta atarız (unutmayın, veriler her seferinde bir bayt alınacaktır).
Master cihazdan veri talebi aldığımızda requestEvent işlevi çağrılır. “Merhaba” dizimizi ustaya geri göndermemiz gerekiyor. Verileri birer birer bayt olarak göndermemiz gerektiğinden, “Merhaba”daki karakterleri bir dizideki bireysel öğelere böler ve sonra birer birer göndeririz.
Her iki fonksiyondaki tüm ilerlememizi seri monitöre rapor ediyoruz. Bu uygulamadaki döngü, master uygulamasında kullanılanla eşleşen bir zaman gecikmesi ekler.
Kurulumda, bir başlatma işleviyle I2C veriyoluna bağlantıyı başlatırız. Bunu nasıl yaptığımıza dikkat edin, bu bir köle olduğundan, kullanacağımız I2C adresini belirtiyoruz. Bunu yaparak Wire kütüphanesi bizim bağımlı modda çalışmak istediğimizi bilir.
Şimdi iki olay meydana geldiğinde çağıracağımız fonksiyonların isimlerini tanımlamamız gerekiyor – master'dan alınan bir veri talebi ve master'dan alınan veriler. Ayrıca seri monitöre ayarlayıp yazdırıyoruz. Master cihazdan veri aldığımızda receiveEvent işlevi çağrılır. Bu işlevde, veriler mevcutken verileri okur ve bir bayta atarız (unutmayın, veriler her seferinde bir bayt alınacaktır).
Master cihazdan veri talebi aldığımızda requestEvent işlevi çağrılır. “Merhaba” dizimizi ustaya geri göndermemiz gerekiyor. Verileri birer birer bayt olarak göndermemiz gerektiğinden, “Merhaba”daki karakterleri bir dizideki bireysel öğelere böler ve sonra birer birer göndeririz.
Her iki fonksiyondaki tüm ilerlememizi seri monitöre rapor ediyoruz. Bu uygulamadaki döngü, master uygulamasında kullanılanla eşleşen bir zaman gecikmesi ekler.
Uygulamanın Çalıştırılması
Bu eskizleri çalıştırmak için her Arduino'da Seri monitörü görebilmeniz gerekir. Arduino IDE'nin kurulu olduğu iki bilgisayarınız varsa, bu onu çok daha kolay hale getirecektir.
Microsoft Windows'ta Arduino IDE'nin iki örneğini açmak mümkündür. Bu yapılırsa, her iki seri monitörü de aynı ekranda yan yana görüntüleyebilirsiniz. Alternatif olarak, bir bilgisayar kullanabilir ve ikinci Arduino'yu kendi güç kaynağı ile çalıştırabilirsiniz. Bilgisayarı ve gücü iki Arduino arasında değiştirmeniz gerekir. Bunu yaparak her iki ekranı da tek tek izleyebilirsiniz.
Kaynaklar:
►arduino.cc/en/reference/wire
►dronebotworkshop.com/i2c-arduino-arduino/
Microsoft Windows'ta Arduino IDE'nin iki örneğini açmak mümkündür. Bu yapılırsa, her iki seri monitörü de aynı ekranda yan yana görüntüleyebilirsiniz. Alternatif olarak, bir bilgisayar kullanabilir ve ikinci Arduino'yu kendi güç kaynağı ile çalıştırabilirsiniz. Bilgisayarı ve gücü iki Arduino arasında değiştirmeniz gerekir. Bunu yaparak her iki ekranı da tek tek izleyebilirsiniz.
Kaynaklar:
►arduino.cc/en/reference/wire
►dronebotworkshop.com/i2c-arduino-arduino/
YORUMLAR
Aktif etkinlik bulunmamaktadır.
- Dünyanın En Görkemli 10 Güneş Tarlası
- Dünyanın En Büyük 10 Makinesi
- 2020’nin En İyi 10 Kişisel Robotu
- Programlamaya Erken Yaşta Başlayan 7 Ünlü Bilgisayar Programcısı
- Üretimin Geleceğinde Etkili Olacak 10 Beceri
- Olağan Üstü Tasarıma Sahip 5 Köprü
- Dünyanın En İyi Bilim ve Teknoloji Müzeleri
- En İyi 5 Tıbbi Robot
- Dünyanın En Zengin 10 Mühendisi
- Üretim için 6 Fabrikasyon İşlemi
- Enerji Yönetiminde Ölçümün Rolü: Verimliliğe Giden Yol
- HVAC Sistemlerinde Kullanılan EC Fan, Sürücü ve EC+ Fan Teknolojisi
- Su İşleme, Dağıtım ve Atık Su Yönetim Tesislerinde Sürücü Kullanımı
- Röle ve Trafo Merkezi Testlerinin Temelleri | Webinar
- Chint Elektrik Temel DIN Ray Ürünleri Tanıtımı
- Sigma Termik Manyetik Şalterler ile Elektrik Devrelerinde Koruma
- Elektrik Panoları ve Üretim Teknikleri
- Teknik Servis | Megger Türkiye
- Güneş Enerji Santrallerinde Yıldırımdan Korunma ve Topraklama
- Megger Türkiye Ofisi
ANKET