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++;
}