Apa itu I2C (Inter-Integrated Circuit) Konsep Dasar

Posted on

Apa itu I2C?

Pada artikel sebelumnya saya telah menjelaskan tenang ini, namun dalam bahasa yang sangat teknis. Oleh karena itu, pada artikel ini saya akan mencoba menjelaskan secara sederhana apa itu I2C dan konsep dasar cara kerjanya.

I2C (Inter-Integrated Circuit) adalah protokol komunikasi yang digunakan untuk menghubungkan perangkat-perangkat elektronik yang terdekat. Protokol ini digunakan untuk menghubungkan perangkat-perangkat seperti sensor, memori, dan perangkat-perangkat lain yang memerlukan transfer data yang cepat dan efisien. I2C digunakan dalam berbagai macam proyek elektronika, seperti robotika, sistem otomasi rumah, dan proyek-proyek IoT (Internet of Things).


Sejarah I2C

I2C (Inter-Integrated Circuit) adalah protokol komunikasi yang dikembangkan oleh Philips Semiconductors (sekarang NXP Semiconductors) pada tahun 1982. Awalnya, I2C dikembangkan untuk digunakan dalam sistem audio dan video konsumen, tetapi kemudian digunakan dalam berbagai aplikasi elektronik lainnya.

I2C awalnya diperkenalkan dengan nama “SMBus” (System Management Bus), yang merujuk pada kapabilitasnya untuk digunakan dalam sistem manajemen. Namun, karena popularitasnya yang semakin meningkat, I2C segera menjadi standar industri yang umum digunakan.

Alamat I2C

Setiap perangkat I2C memiliki alamat unik yang digunakan untuk mengidentifikasi perangkat tersebut. I2C menggunakan dua jenis alamat, yaitu alamat 7-bit dan alamat 10-bit.

Alamat 7-bit dengan nilai yang berada dalam rentang 0x00 hingga 0x7F, dapat menghandle 127 perangkat dalam satu bus

Sedangkan alamat 10-bit digunakan dalam kasus-kasus khusus, seperti ketika alamat 7-bit yang tersedia tidak cukup untuk perangkat yang ada, dapat menghandle 1028 perangkat dalam satu bus.

Alamat I2C ditentukan oleh produsen perangkat. Beberapa perangkat populer memiliki alamat yang sudah ditentukan, seperti :

  • MPU-6050 Gyroscope dan Accelerometer (Alamat: 0x68)
  • BMP180 Barometer (Alamat: 0x76)
  • BMP280 Barometer (Alamat: 0x77)
  • PCA9685 Servo Motor Controller (Alamat: 0x40)
  • DS3231 RTC (Alamat: 0x68)
  • PCF8574 I/O Expander (Alamat: 0x20 – 0x27)
  • 24Cxx EEPROM (Alamat: 0x50 – 0x57)
  • SSD1306 OLED Display (Alamat: 0x3C – 0x3D)
  • MCP23017 I/O Expander (Alamat: 0x20 – 0x27)
  • TCA9548A I2C Multiplexer (Alamat: 0x70 – 0x77)
  • AT24Cxx Serial EEPROM (Alamat: 0x50 – 0x57)
  • PCA95XX I2C Switch (Alamat: 0x70 – 0x77)
  • TMP102 Temperature Sensor (Alamat: 0x48 – 0x4F)

Alamat yang digunakan oleh perangkat-perangkat ini hanyalah alamat standar yang digunakan oleh perangkat-perangkat tertentu. Ada ratusan perangkat yang dapat digunakan dalam proyek I2C dan setiap produsen dapat menetapkan alamat yang berbeda untuk perangkat mereka.

Anda dapat menemukan daftar alamat untuk perangkat tertentu dengan mencari dokumentasi dari produsen perangkat atau dengan mencari di internet.

Sebagian besar perangkat yang tersedia saat ini dapat dikonfigurasi dengan alamat yang Anda inginkan, sehingga Anda dapat mengubah alamat perangkat sesuai kebutuhan Anda.

Jika anda memiliki perangkat I2C seperti sensor misalnya dan tidak tau alamat dari perangkat tersebut, anda dapat menggunakan kode program I2C Scanner untuk membaca alamat dari perangkat tersebut secara otomatis.

Konsep Dasar / Cara Kerja

I2C bekerja dengan cara menghubungkan perangkat-perangkat yang akan berkomunikasi melalui dua kabel utama, yaitu SDA dan SCL. Setiap perangkat yang terhubung ke bus I2C memiliki alamat unik yang digunakan untuk mengidentifikasi perangkat tersebut.

Saat perangkat ingin mengirim atau menerima data, ia harus memberitahu alamat perangkat yang ingin dihubungi. Setelah itu, perangkat yang ingin mengirim data akan mengirimkan data ke perangkat yang ingin dihubungi melalui bus SDA. SCL digunakan untuk menyinkronisasikan transfer data, sehingga perangkat yang menerima data dapat mengetahui kapan data yang diterima adalah data yang benar.

Apa itu I2C (Inter-Integrated Circuit) Konsep Dasar

Resistor Pull-Up

Selain itu, I2C memerlukan resistor pull-up untuk menjaga level sinyal SDA dan SCL di tingkat logika “1” ketika tidak ada perangkat yang mengirimkan sinyal. Resistor pull-up digunakan untuk menarik level sinyal SDA dan SCL ke tingkat logika “1” ketika tidak ada perangkat yang mengirimkan sinyal. Tanpa resistor pull-up, sinyal SDA dan SCL akan fluktuatif dan tidak stabil, yang akan menyebabkan kesalahan dalam komunikasi.

Biasanya, resistor pull-up ditentukan dengan nilai 4.7k – 10k ohm. Namun beberapa percobaan yang pernah saya lakukan ada dua nilai resistor pull up yang digunakan yaitu:

  • 2K untuk kecepatan 400 kbps
  • 10K untuk kecepatan 100 kbps

Mengapa dapat demikian?

Nilai resistor pull-up yang lebih kecil, seperti 2k Ohm, akan memberikan penguatan sinyal yang lebih besar, sehingga perangkat slave dapat menerima sinyal dengan lebih baik dan stabil pada kecepatan yang lebih tinggi, seperti 400 kbps. Namun, jika nilai resistor pull-up yang digunakan terlalu kecil, sinyal yang diterima dapat menjadi terlalu kuat dan menyebabkan kesalahan dalam komunikasi.

Sedangkan Nilai resistor pull-up yang lebih besar, seperti 10k Ohm, akan memberikan penguatan sinyal yang lebih kecil, sehingga perangkat slave dapat menerima sinyal dengan lebih baik dan stabil pada kecepatan yang lebih rendah, seperti 100 kbps. Namun, jika nilai resistor pull-up yang digunakan terlalu besar, sinyal yang diterima dapat menjadi terlalu lemah dan menyebabkan kesalahan dalam komunikasi.

Berikut ini adalah kode program dasar untuk mengimplementasikan komunikasi I2C dengan Arduino, baik sebagai master maupun sebagai slave:

Kode Program Master

#include <Wire.h>

void setup() {
  Wire.begin(); // Memulai komunikasi I2C sebagai master
}

void loop() {
  Wire.beginTransmission(8); // Memulai transaksi dengan alamat 8
  Wire.write("Hello, slave!"); // Mengirim data "Hello, slave!" ke slave
  Wire.endTransmission(); // Mengakhiri transaksi
  delay(1000);
}

Kode Program Slave

#include <Wire.h>

void setup() {
  Wire.begin(8); // Memulai komunikasi I2C sebagai slave dengan alamat 8
  Wire.onReceive(receiveData); // Menentukan fungsi yang akan dipanggil saat menerima data
}

void loop() {
  // Kosong, karena semua aktivitas dilakukan dalam fungsi receiveData
}

void receiveData(int byteCount) {
  while(Wire.available()) {
    char c = Wire.read();
    Serial.print(c);
  }
  Serial.println();
}

Kemampuan

Kemampuan I2C I2C memiliki beberapa kemampuan yang membuatnya sangat populer di kalangan pengembang proyek elektronik. Beberapa di antaranya adalah:

  • Dapat menghubungkan hingga 127 perangkat pada satu bus.
  • Memiliki fitur deteksi kolision, yang memungkinkan perangkat untuk mengetahui jika ada konflik dalam transfer data.
  • Memiliki fitur “multi-master”, yang memungkinkan beberapa perangkat untuk menjadi pengontrol bus pada saat yang sama.
  • Memiliki kecepatan transfer data yang cepat, yaitu hingga 3.4 Mbps.
  • Dapat digunakan pada jarak yang relatif jauh, yaitu hingga 100 meter dengan menggunakan kabel ekstender.

Kelebihan & Kekurangan

  • Kelebihan dari I2C adalah protokol ini sangat efisien dalam hal penggunaan kabel dan sumber daya. I2C hanya memerlukan dua kabel utama untuk komunikasi, yaitu SDA (Serial Data) dan SCL (Serial Clock), sehingga membuat desain sirkuit menjadi lebih sederhana.
  • I2C juga memiliki kecepatan transfer data yang cukup tinggi, yaitu hingga 3.4 Mbps.
  • Kekurangan dari I2C adalah protokol ini hanya dapat menghubungkan perangkat-perangkat yang berada dalam jarak yang relatif dekat. Jika ingin menghubungkan perangkat-perangkat yang berada dalam jarak yang jauh, maka harus menggunakan kabel ekstender atau konverter.

Kesimpulan

Secara umum, I2C adalah protokol komunikasi yang efisien dan mudah digunakan yang digunakan untuk menghubungkan perangkat-perangkat elektronik yang terdekat. Arduino memiliki library I2C yang memudahkan untuk mengimplementasikan komunikasi I2C pada proyek-proyek Arduino.

Baca juga Daftar Semua Artikel