Arduinoda Sanal I2C Pinleri Oluşturmak

Arduinoda zaten I2C desteği var, neden durduk yere “sanal I2C” pinleri oluşturalım ki dediğinizi duyar gibiyim ama bir saniye daha düşünün, ya olan I2C pinleri başka bir işlem için kullanılıyorsa? İşte tam bu sırada sanal I2C pinleri oluşturarak bu çakışmadan kurtulabiliyoruz! Örneğin Arduino UNO hakkında konuşalım, hali hazırda 6 analog pini bulunmakta. Bu pinlerin tamamını kullandığınızı düşünün, I2C pinleri ise Analog 4(SDA) ve Analog 5(SCL) pinleri ile kullanılabiliyor eğer I2C destekleyen bir iletişim yolu bağlamak isterseniz 4. ve 5. pini kullanımdan vazgeçmeniz gerekiyor fakat sanal bir I2C hattı ile bu durumu kolay bir şekilde halledebiliyoruz.

arduino sanal i2c, Arduinoda Sanal I2C Pinleri Oluşturmak

Arduinonun standart I2C kütüphanesini “wire.h” ile çağırabilirsiniz. Arduino IDEsine standarta olarak yüklü gelmekte. Çoğu zaman kullanışlı ve bütün işlemleri doğru bir şekilde yapmasına rağmen Wire kütüphanesi bazı durumlardan dolayı kullanmak istemeyebilirsiniz bunlar:

  • I2C yani A4 ve A5 pini başka bir amaçla kullanımda ise.
  • Yetersiz FLASH ve RAM kapasitesi varsa.
  • Saat hızı değişikliğiden etkilenmek istemiyorsanız(Arduino UNO 16MHz, ATtiny 1MHz).
Bu gibi durumlarda wire kütüphanesi yerine “sanal i2c” oluşturma kütüphanesini kullanmanız daha işlevsel olabilir. Aşağıdaki tabloda kütüphanelerin kullandığı bellek miktarlarını görebilirsiniz. Wire; standart olarak gelen, SoftWire; Wire’ın hafifletilmiş hali, SoftI2CMaster; sanal I2C pinleri oluşturacağamız kütüphanedir.
 WireSoftI2CMasterSoftWire
Flash Hafızası1956252712
RAM208064

Sanal I2C Kütüphanesi

SoftI2CMaster, AVR assembler ile hazırlanmış, sanal pin oluşturmak için geliştirilmiş bir kütüphanedir, Arduino ile kullanmak GitHub klasörüne buradan erişebilirsiniz.

Eğer ARM temelli bir mikroişlemci(örneğin Arduino DUE, Arduino ZERO ile kullanmak isterseniz C++ versiyonuna buradan ulaşabilirsiniz.

Kütüphanenin Özellikleri

Örnek Kullanım

//Sanal I2C hattına bağlı cihazı taramak için
#define SDA_PORT PORTC
#define SDA_PIN 2 // = #define SCL_PORT PORTC #define SCL_PIN 3 // #include <SoftI2CMaster.h> #define I2C_7BITADDR 0x68 // DS1307 #define MEMLOC 0x0A void setup(void) { Serial.begin(57600); if (!i2c_init()) // Initialize everything and check for bus lockup Serial.println("I2C init failed"); } void loop(void){ if (!i2c_start((I2C_7BITADDR<<1)|I2C_WRITE)) { // start transfer Serial.println("I2C device busy"); return; } i2c_write(MEMLOC); // send memory address i2c_rep_start((I2C_7BITADDR<<1)|I2C_READ); // restart for reading byte val = i2c_read(true); // read one byte and send NAK to terminate i2c_stop(); // send stop condition Serial.println(val); delay(1000); }