Arduino - Inter Entegre Devre

Inter-entegre devre (I2C), mikro denetleyiciler ve yeni nesil özel entegre devreler arasında seri veri alışverişi için bir sistemdir. Aralarındaki mesafe kısa olduğunda kullanılır (alıcı ve verici genellikle aynı basılı kart üzerindedir). Bağlantı iki iletken üzerinden sağlanır. Biri veri aktarımı için kullanılırken diğeri senkronizasyon için kullanılır (saat sinyali).

Aşağıdaki şekilde görüldüğü gibi, bir cihaz her zaman bir ustadır. İletişim başlamadan önce bir bağımlı çipin adreslemesini gerçekleştirir. Bu şekilde bir mikrodenetleyici 112 farklı cihazla haberleşebilir. Baud hızı genellikle 100 Kb / sn (standart mod) veya 10 Kb / sn'dir (yavaş baud hızı modu). 3.4 Mb / sn baud hızına sahip sistemler yakın zamanda ortaya çıktı. Bir I2C veriyolu üzerinden iletişim kuran cihazlar arasındaki mesafe birkaç metre ile sınırlıdır.

Yönetim Kurulu I2C Pimleri

I2C veriyolu iki sinyalden oluşur - SCL ve SDA. SCL saat sinyalidir ve SDA veri sinyalidir. Mevcut veri yolu yöneticisi her zaman saat sinyalini üretir. Bazı bağımlı cihazlar, ana birimin daha fazla veri göndermesini geciktirmek için zaman zaman saati düşük seviyeye zorlayabilir (veya ana birim veriyi dışarı atmaya çalışmadan önce verileri hazırlamak için daha fazla zaman gerektirebilir). Bu, "saat uzatma" olarak bilinir.

Aşağıdakiler farklı Arduino kartları için pimlerdir -

  • Uno, Pro Mini A4 (SDA), A5 (SCL)
  • Mega, Due 20 (SDA), 21 (SCL)
  • Leonardo, Yun 2 (SDA), 3 (SCL)

Arduino I2C

I2C kullanarak iki Arduino kartını bağlamak için iki modumuz var - ana kod ve köle kod -. Onlar -

  • Ana Verici / Bağımlı Alıcı
  • Ana Alıcı / Bağımlı Verici

Ana Verici / Bağımlı Alıcı

Şimdi ana vericinin ve ikincil alıcının ne olduğunu görelim.

Ana Verici

Wire kütüphanesini başlatmak ve I2C veriyolunu bir master veya slave olarak birleştirmek için aşağıdaki fonksiyonlar kullanılır. Bu normalde yalnızca bir kez çağrılır.

  • Wire.begin(address) - Bizim durumumuzda adres 7 bitlik slave adresidir, çünkü master belirtilmemiştir ve bir master olarak veriyoluna katılacaktır.

  • Wire.beginTransmission(address) - Verilen adresle I2C bağımlı cihaza bir iletime başlayın.

  • Wire.write(value) - Ana cihazdan bağımlı cihaza aktarım için baytları kuyruğa alır (başlangıç ​​İletimi () ve İletim sonu () için aramalar arasında).

  • Wire.endTransmission() - beginTransmission () tarafından başlatılan bir bağımlı aygıta iletimi sonlandırır ve wire.write () tarafından sıraya alınan baytları iletir.

Example

#include <Wire.h> //include wire library

void setup() //this will run only once { 
   Wire.begin(); // join i2c bus as master
} 

short age = 0; 

void loop() {   
   Wire.beginTransmission(2); 
   // transmit to device #2
   Wire.write("age is = ");
   Wire.write(age); // sends one byte
   Wire.endTransmission(); // stop transmitting
   delay(1000); 
}

Slave Alıcı

Aşağıdaki işlevler kullanılır -

  • Wire.begin(address) - Adres, 7 bitlik slave adresidir.

  • Wire.onReceive(received data handler) - Bir ikincil cihaz ana cihazdan veri aldığında çağrılacak işlev.

  • Wire.available() - Wire.read () ile geri alınabilecek bayt sayısını döndürür Bu, Wire.onReceive () işleyicisinin içinde çağrılmalıdır.

Example

#include <Wire.h> //include wire library

void setup() {  //this will run only once
   Wire.begin(2); // join i2c bus with address #2
   Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing 
   Serial.begin(9600); // start serial for output to print what we receive 
}

void loop() {   
   delay(250); 
}

//-----this function will execute whenever data is received from master-----//

void receiveEvent(int howMany) { 
   while (Wire.available()>1) // loop through all but the last {
      char c = Wire.read(); // receive byte as a character
      Serial.print(c); // print the character
   }
}

Ana Alıcı / Bağımlı Verici

Şimdi ana alıcı ve yardımcı vericinin ne olduğunu görelim.

Ana Alıcı

Master, benzersiz bir şekilde adreslenmiş Slave Arduino'dan gönderilen veri baytlarını talep etmek ve sonra okumak üzere programlanmıştır.

Aşağıdaki işlev kullanılır -

Wire.requestFrom(address,number of bytes)- Master tarafından bir slave cihazdan bayt istemek için kullanılır. Baytlar daha sonra wire.available () ve wire.read () işlevleriyle alınabilir.

Example

#include <Wire.h> //include wire library void setup() { 
   Wire.begin(); // join i2c bus (address optional for master) 
   Serial.begin(9600); // start serial for output
} 

void loop() { 
   Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
   while (Wire.available()) // slave may send less than requested {
      char c = Wire.read(); // receive a byte as character
      Serial.print(c); // print the character
   } 
   delay(500); 
}

Slave Verici

Aşağıdaki işlev kullanılır.

Wire.onRequest(handler) - Bir ana cihaz bu bağımlı cihazdan veri talep ettiğinde bir işlev çağrılır.

Example

#include <Wire.h> 

void setup() { 
   Wire.begin(2); // join i2c bus with address #2
   Wire.onRequest(requestEvent); // register event
} 

Byte x = 0;

void loop() { 
   delay(100); 
} 

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()

void requestEvent() { 
   Wire.write(x); // respond with message of 1 bytes as expected by master
   x++; 
}