Belajar Arduino Dasar Komunikasi I2C Master Writer


Beberapa board Arduino dapat saling berhubungan untuk kemudian bertukar data satu sama lain. Hal tersebut akan sangat berguna dalam sebuah project besar yang menuntut lebih dari sebuah board Arduino. Sebagai contoh, dua board Arduino dapat digunakan untuk melakukan komunikasi bertukar data satu sama lain, sebagai perangkat Master Writer-Slave Receiver melalui jalur komunikasi I2C synchronous serial. Untuk itu perlu digunakan beberapa function yang ada pada library Wire Arduino untuk komunikasi I2C tersebut. Arduino pertama, digunakan sebagai perangkat master, yang akan menuliskan data untuk dikirimkan ke perangkat slave. Dengan 6 byte data dikirim melalui pengalamatan slave Arduino. Setelah data diterima, isi data tersebut dapat dilihat pada Serial Monitor Arduino IDE, yang terhubung dengan perangkat slave.
Komunikasi I2C Arduino membutuhkan dua jalur pengkabelan untuk mengirimkan dan menerima data, adalah pin serial clock (SCL) yang pada Arduino memberikan pulsa clock interval pengiriman data, dan pin serial data (SDA) yang memmuat data yang akan dikirimkan antar kedua perangkat tersebut. Setiap kali pulsa clock berubah dari low menjadi high (disebut dengan istilah rising edge of the clock), sebuah bit informasi yang memuat alamat perangkat dan perintaan untuk data, dikirimkan dari Arduino melalui I2C jalur SDA, ke perangkat lainnya yang terhubung. Pada saat pin clock berubah dari high menjadi low (disebut dengan istilah falling edge of the clock), balasan data yang diminta sebelumnya akan dikirimkan, juga melalui jalur I2C Arduino yang sama.
Karena jalur komunikasi dengan I2C mengharuskan bahwa setiap perangkat slave yang terhubung untuk memiliki alamat uniknya masing-masing, supaya perangkat master dan slave mampu tetap berkomunikasi dalam satu jalur. Bahkan perangkat master dapat berkomunikasi dengan banyak perangkat slave, dengan tetap hanya menggunakan dua buah pin Arduino saja. Selama alamat unik dari setiap perangkat slave dikenali maka komunikasi mungkin untuk dilakukan.

Wiring Diagram

<img src="arduino_master_slave_i2c.png" alt="arduino_master_slave_i2c">


Untuk menghubungkan dua board Arduino Uno dilakukan dengan cara menghubungkan pin A4 (SCL) master dengan pin A4 slave, pin A5 (SDA) master dengan pin A5 slave, serta dengan menghubungkan Ground kedua board tersebut. Untuk wiring tampak seperti pada gambar.

Source Code
Berikut ini adalah source code (sketch) Arduino untuk perangkat master yang akan mengirimkan data, untuk selanjutnya diterima oleh perangkat slave tersebut, kemudian ditampilkan di Serial Monitor Arduino IDE.

/*
Program mengirimkan data
perangkat master Arduino

Loki Lang
*/

#include <Wire.h>

void setup()
{
  Wire.begin();
}

byte x = 0;

void loop()
{
  Wire.beginTransmission(20);
  Wire.write("x is ");
  Wire.write(x); 
  Wire.endTransmission();

  x++;
  delay(500);
}


Perangkat master akan mengirimkan data ke slave di alamat nomor 20, dengan data character berukuran 6 byte. Data character yang dikirimkan oleh slave setelah diterima kemudian akan dibaca, untuk selanjutnya ditampilkan di Serial Monitor Arduino IDE. Dalam pesan data yang dikirimkan oleh perangkat master, disertakan juga pencacahan berapa kali data telah dikirimkan pada masing-masing pesan. Setelah source code (sketch) untuk perangkat master, selanjutnya perlu membuat bagian untuk perangkat slave, yakni sebagai berikut.

/*
Program menerima data dan menampilkannya
perangkat slave Arduino

Loki Lang
*/

#include <Wire.h>

void setup()
{
  Wire.begin(20);
  Wire.onReceive(receiveEvent);
  Serial.begin(9600);
}

void loop()
{
  delay(100);
}

void receiveEvent(int howMany)
{
  while(1 < Wire.available())
  {
    char c = Wire.read();
    Serial.print(c);
  }
  int x = Wire.read();
  Serial.println(x);
}


Pada perangkat slave perlu dilakukan deklarasi alamat untuk perangkat tersebut. Dalam hal ini, perangkat slave diberikan alamat nomor 20, dan telah disesuaikan dengan sorce code (sketch) pada perangkat master. Pada saat menerima data pesan dari perangkat master, perangkat slave akan menjalankan procedure receiveEvent(), yang mana akan menampilkan pesan data dari perangkat master. Pasan data dari perangkat master tersebut berisikan berapa kali telah dilakukan pengiriman data ke perangkat slave. Pesan data tersebut kemudian akan ditampilkan pada Serial Monitor Arduino IDE.

Sayangnya bila menggunakan feature I2C bus pada board Arduino Uno, sekaligus mengorbankan pin A4 dan A5. Sehinggga pin A4 dan pin A5 tidak dapat digunakan untuk membaca data analog. Saran bila mengerjakan sebuah project yang menggunakan lima buah sensor analog ditambah I2C, dengan board Arduino Uno, sebaiknya menggunakan multiplexer analog untuk pembacaan data sensor analog tersebut.
Bila ada sesuatu yang belum jelas dan ingin tahu lebih dalam seputar project Arduino, pemrograman, dan elektronika, bisa bertanya pada bagian comment.