I2C İletişimi - İki Arduino Kartı Arasında
Not: Bu eğitimde Arduino Uno kullanacak olsak da. Ancak kavramlar ve kodlama örnekleri, Arduino Mega, nano, mikro gibi diğer Arduino kartlarında çalışacaktır.
I2C Giriş
I2C, entegre devre iletişim protokolü anlamına gelir. Kısa menzilli veri aktarım uygulamaları için 2 kablolu bir seri iletişim protokolüdür. I2C tabanlı sensörler, rakamlı ekranlar ve iletişim modülleri arasında arayüz oluşturmak için gömülü projelerde kullanılan çok popüler bir iletişim protokolüdür .
Her biri ile iletişim kurmak isteyen cihazlar bir I2C veri yolu üzerinden bağlanır. I2C veri yolu, birden çok bağımlı aygıtı ve birden çok ana aygıtı destekler.
Birçok Sensör, verilerini mikro denetleyicilere aktarmak için bu seri iletişim protokolünü kullanır veya bu protokol aracılığıyla farklı bağımlı devreler ana devrelerle iletişim kurabilir. Yalnızca kısa mesafeli veri aktarımı için geçerlidir.
I2C Pimleri
I2C'nin SPI üzerinden ayırt edici özelliği, iletişimi gerçekleştirmek için yalnızca iki kablo kullanmasıdır. Bir kablo, cihazlar arasında veri aktarımını senkronize eden SCL'dir (seri saat hattı) ve diğer kablo, iletilecek gerçek verileri taşıyan SDA'dır (seri veri). Bu hatlar açık tahliye hatlarıdır, bu da cihazların düşük aktif olması durumunda dirençleri yukarı çekmek için bağlanmaları gerektiği anlamına gelir. Veriyoluna bağlanan her bir bağımlı cihaz, benzersiz bir 8 bitlik adrese sahip olacaktır.
İki kablo kullanan belirli cihazlar arasındaki iletişim, her bir cihazın kendi benzersiz cihaz kimliğine veya adresine sahip olması ve bu adresin kullanılmasıyla sağlanır; Master, iletişim kurmak için herhangi bir belirli cihazı seçebilir.
I2C Sistemi
Bu resim, I2C veriyoluna bağlı ana ve bağımlı cihazları gösterir.Bu resimde Arduino ve Raspberry Pi bir master, MPU6050 sensör cihazları ise slave gibi davranmaktadır .
I2C veriyolu, bağımlı ve ana Bağımlı cihazlar gibi birden fazla cihazdan oluşur.
Bağlı Cihazlar
Her bağlı cihaz, veriyolundaki cihazı tanımak için kullanılan benzersiz bir adrese sahiptir. Başka bir deyişle, bağlı adres, ana cihazın veriyolu üzerindeki belirli bir bağlı cihaza bilgi göndermesine yardımcı olur .
Ana cihazlar
Master cihazlar bilgi gönderip alabilir. Slave, bir ustanın gönderdiği her şeye tepki verir. Bu sisteme bilgi gönderirken, bir seferde sadece tek bir cihaz
bilgi gönderebilir .
Kısacası, verileri aktarmak veya farklı sayıda cihazla iletişim kurmak için yalnızca iki kabloya ihtiyacımız var. Hepimizin Arduino'nun sınırlı pinlere sahip olduğunu bildiğimiz gibi, I2C aynı anda birden fazla cihazla bağlantı kurmaya izin verir. Tek eksiklik, bu protokolü uzun mesafeli veri aktarımı için kullanamayacak olmanızdır.
Bir kablo (SDA hattı) boyunca seri olarak bit veri aktarımı. Gibi SPI , I2C bit çıkış paylaşılan bir saat sinyali ile bit testine senkronize edilir, eş zamanlı olan
master-slave.
Arduino I2C iletişim Pinleri
I2C iletişimi için, Arduino'nun farklı kartlarında SDA ve SCL pinleri olarak ayrılmış farklı pinler bulunur. Aşağıdaki liste bu pin numaralarını farklı panolarda göstermektedir.
- Arduino UNO'da Pin A4 = SDA ve Pin A5 = SCL
- Arduino Mega2560 , Pin 20 = SDA ve Pin 21 = SCL
- Arduino Leonardo'da Pin 2 = SDA ve Pin 3 = SCL
- İçin Arduino Due Pin 20 = SDA ve Pin 21 = SCL, sda1, SCL1
Aşağıdaki şekil, bu yazıda kullanılacak Arduino UNO'daki SDA ve SCL pinlerini göstermektedir.
Arduino I2C Haberleşme Kütüphanesi
"Wire" kütüphanesi, Arduino'da I2C iletişimi için kullanılır. Aşağıdakiler bu kütüphanenin önemli işlevleridir.
Wire.begin (adres)
Tel kitaplığı bu komut kullanılarak başlatılır ve I2C veriyoluna ana veya bağlı olarak katılır. Adres isteğe bağlıdır. Bu adres, bağlı cihazlar için yedi bitten oluşur. Belirtilmemesi halinde; cihaz otobüse Master olarak katılır.
Wire.requestFrom (adres, miktar)
Bu komut, bir bağlı cihazdan bayt talep etmek için Ana cihaz tarafından kullanılır. Daha sonra bu baytları toplamak için "Available ()" ve "read ()" işlevleri kullanılabilir. "Adres", bir talebin yapılacağı belirli bir bağlı aygıtın adresidir ve "miktar", talep edilecek bayt sayısını belirtir.
Wire.beginTransmission (adres)
Bu komut, verilen adresin slave cihazı ile baytların iletimini başlatır. Daha sonra iletilecek baytlar write () işlevi kullanılarak sıraya alınır ve bu baytlar endTransmission () işlevi kullanılarak iletilir.
Wire.endTransmission ()
Wire.beginTransmission () işlevi kullanılarak başlatılan baytların iletimi bu komut kullanılarak sonlandırılır.
Bu işlev bir argüman kabul eder. Eğer argüman DOĞRU ise, stop komutu baytların aktarılmasından ve I2C veriyolundan ayrıldıktan sonra gönderilir.
Argüman YANLIŞ ise, baytları ilettikten sonra bir yeniden başlatma komutu gönderir ve veri yolu korunmaz ve başka bir ana aygıtın mesajlar arasında iletilmesini engeller.
Wire.Write ()
Bu komut aynı anda 2 işlevden birini gerçekleştirir.
- Master tarafından bir talep yapıldığında, bu fonksiyon slave cihazdan veri yazar.
- BeginTransmission () işlevi ile endTransmission () işlevinin çağrıları arasında, bu komut iletim için baytları kuyruğa almak için kullanılır.
Wire.read ()
RequestFrom () komutundan sonra, slave cihazdan ana cihaza veya master cihaza slave cihaza aktarılan baytlar; bu komut kullanılarak okunur.
Wire.available ()
Bu işlev, read () işlevi çağrıldıktan sonra alınabilecek bayt sayısını döndürür. Ana cihazda requestFrom () fonksiyonundan sonra, bağımlı cihazda ise onReceive () fonksiyonunda çağrılır.
Wire.onReceive (işleyici)
Bu, ana cihazdan aktarım ikincil cihaz tarafından alındığında çağrılan bir işlevi kaydeder. Çağrılan işlev, eylemci tarafından temsil edilir.
İki Arduino Kartı Arasında I2C İletişimi
Bu bölümde, I2C veri yolunu kullanarak iki Arduino kartı arasında veri aktarmak için örnek bir kod göreceğiz. Bir Arduino kartını bir I2C ana cihazı ve diğer bir Arduino kartını bir I2C slave cihazı olarak yapılandıracağız. Master, 0 - 6 arasındaki sayıları sırayla ikincil cihaza aktaracaktır. Slave cihaz tarafından alınan sayı 3'ten küçükse, slave Arduino'nun D13 pinine bağlı bir LED açık kalacaktır, aksi takdirde LED kapalı kalacaktır.
Bu programı oluşturmak için aşağıdaki bileşenlere ihtiyacımız var:
- İki Arduino (Master ve slave)
- LED-Master
- LED köle
- Teller
Şimdi önce Arduino ana cihaz kodunu tartışalım.
Arduino I2C Master Cihaz Kodu
Burada tel kitaplığı dahil edildi ve değişken x başlatıldı. Bu değişkenin değeri, bağımlı cihaza iletilecektir.
#include <Wire.h>
int x = 0;
Burada wire.begin () işlevi çağrılmıştır. Detay yukarıdaki bölümde bulunabilir. Ayrıca dahili tampon başlatıldı.
void setup()
{
Wire.begin();
Serial.begin(9600);
pinMode(LED,OUTPUT);
}
Burada iletim, bağımlı adres 9 ile başlatılmıştır. Bundan sonra, x'in değeri I2C veriyolu üzerinden iletim için kuyruğa alınmıştır. Wire.write () işlevi I2C veriyolunda 'x'in mevcut değerini iletir. Son olarak, x'in değeri iletildi ve veriyolu, endTranmission () komutu kullanılarak kurtarıldı.
Wire.beginTransmission(9);
Wire.write(x);
Wire.endTransmission();
X'in değeri, 200 milyon saniyelik bir gecikmeyle döngüde 1'lik adımlarla artırılır, eğer x değeri 6'dan büyükse, bu değer 0'a sıfırlanır ve tekrar 0'dan artırılır.
x++;
if (x > 6)
{
x = 0;
}
delay(200);
Eksiksiz Master Arduino Kodu
#include <Wire.h>
int LED=13;
int x = 0;
void setup()
{
Wire.begin();
Serial.begin(9600);
pinMode(LED,OUTPUT);
}
void loop()
{
Wire.beginTransmission(9);
Wire.write(x);
Wire.endTransmission();
x++;
if (x > 6)
{
x = 0;
}
delay(200);
}
Arduino I2C Slave Cihaz Kodu
Öncelikle Arduino'nun D13 pininin sembolik adını tanımlıyoruz. Pin D13, bir ana cihazdan alınan değere bağlı olarak açılıp kapanacaktır. Ayrıca, bir x değişkenini sıfır ile bildirir ve başlatırız. Bu x değişkeni, ana Arduino'dan alınan değeri saklamak için kullanılacaktır.
#include <Wire.h> // add i2c library
int LED = 13;
int x = 0;
Kurulum işlevinin içinde, pinMode () işlevini kullanarak LED pini çıkış pini olarak ayarlayın. Ayrıca Arduino'nun slave adresini 9 olarak ayarlayın.
pinMode(LED, OUTPUT);
Wire.begin(9);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
Bildirimler ve işlev çağrısı yukarıdaki bölümde tanımlandığı gibi gerçekleştirilmiştir. Burada ReceEvent () işlevi onReceive (işleyici) işlevi çağrılarak kaydedildi.
void receiveEvent(int bytes)
{
x = Wire.read();
}
Bu reciveEvent () işlevi burada tanımlanmıştır. Ana cihaz tarafından gönderilecek olan 1'den 6'ya kadar olan değeri okur; ve sonra bu değeri programın kurulum işlevinde bildirilen x değişkeninde saklar.
void loop()
{
if (x <= 3)
{
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}
}
Ana aygıttan alınan x değeri 3'ten küçük veya eşitse, pim 13'teki LED AÇIK olacak ve x değeri 3'ten büyükse pim 13'teki LED KAPALI olacak şekilde ayarlanır.
Eksiksiz Bağlı Cihaz Kodu
#include <Wire.h>
int LED = 13;
int x = 0;
void setup()
{
pinMode (LED, OUTPUT);
Wire.begin(9);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void receiveEvent(int bytes)
{
x = Wire.read();
}
void loop()
{
if (x <= 3)
{
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}
}
İki Arduino Kartı arasında I2C bağlantısı
Aşağıdaki şekil, iki Arduino kartı arasındaki I2C bağlantılarını gösterir. Ayrıca, Arduino'nun D13'ü ile bir LED'in bağlantısını gösterir.
- Öncelikle, bir ana Arduino üzerindeki A4 ve A5
pinlerini slave Arduino'daki benzer pinlere bağlayacağız . - Bundan sonra, jumper kabloları kullanarak her iki
Arduino kartının zeminini ortak hale getireceğiz . - Bağlantıları yaptıktan sonra, hem slave hem de master kodlarını Arduino kartlarına yükleyin.
Program Çıkışı
Master Arduino sürekli olarak I2C veriyolu üzerinden veri iletecek ve veriler 0-6 arasında olacaktır. Slave cihaz tarafından alınan verilere ve yukarıda belirtilen koşullara bağlı olarak pin 13'teki led açılır ve kapanır.
I2C İletişim Uygulamaları ve Fikirler
- Bu iletişim, monitörlerde renk dengesi, kontrast ve tonu değiştirmek için kullanılır.
- Akıllı hoparlörde, bu iletişim yöntemi kullanılarak ses seviyesi değiştirilir.
- Bilgisayarlarda fan hızı gibi teşhis sensörlerinin okunmasında kullanılır.
- Sistem bileşenlerinde güç kaynağını Açma ve Kapatma.
- Kullanıcı ayarlarını tutan gerçek zamanlı saatlere ve NVRAM yongalarına erişim.
I2C iletişiminin avantajları ve dezavantajları
Avantajları
Uyarlanabilir çünkü birden fazla ana ve birden çok bağımlı
iletişimini destekler. Yalnızca iki kablo kullanın Çok yönlüdür Farklı bağımlı aygıtların gereksinimlerine kolayca uyarlanabilir
ACK / NACK, her bir kenarın etkili bir şekilde gönderildiğini onaylar. Cihazlar
otobüste tanıtılabilir veya kaldırılabilir.
Dezavantajları
Uzun mesafeli iletişim için geçerli değildir Yalnızca iki kablo kullanın
Düşük hıza sahiptir Dirençlerin kullanımı nedeniyle daha fazla alan gerektirir
Cihaz sayısı arttıkça karmaşıktır.
Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook robotic.code
instagram @roboticcode
Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.
Hiç yorum yok:
Yorum Gönder
Yorum yazdığınız ve üye olduğunuz için Size teşekkür ederim.Burada olduğunuza göre hepimizin ilgi alanı Elektronik ve Programlama sonsuz bir dünyadayız.Hepimize Başarılar...
Not: Yalnızca bu blogun üyesi yorum gönderebilir.