Komunikasi Serial Sinkron I2C/IIC/TWI dengan Arduino
|Saat melakukan eksperimen handling RTC DS3231/DS3232 pada artikel sebelumnya, kalau Anda perhatikan komunikasi yang dijalin antara RTC dan Arduino menggunakan pin A4 dan A5. Pin apakah itu? Mengapa bukan di pin 0 dan 1 (pin serial)? Jawabannya adalah : secara arsitektur, IC RTC DS3231/DS3232 didesain menggunakan komunikasi I2C/IIC/TWI, jadi perangkat apapun yang ingin mengambil data dari IC RTC tersebut harus menggunakan protokol yang sama. Sedangkan jika menggunakan Arduino, pin 0 dan 1 adalah pin serial tapi yang bertipe serial asinkron, jadi tidak dapat dihubungkan dengan RTC DS3231/DS3232. Sedangkan pin A4 dan A5 Arduino memiliki fungsi khusus sebagai pin I2C/IIC/TWI dengan A4 sebagai SDA dan A5 sebagai SCL. Untuk lebih jelasnya mengenai fungsi khusus pin A4 dan A5, silahkan dilihat pada gambar di bawah.
Catatan : I2C berasal dari kata IIC, kepanjangannya Inter-Integrated Circuit. Sedangkan TWI kepanjangannya adalah Two Wire Interface. Ketiga istilah tersebut adalah sama, merujuk pada protokol komunikasi serial sinkron dengan dua kabel yakni SDA (Serial Data) dan SCL (Serial Clock). SDA merupakan data serialnya, sedangkan SCL adalah jalur clock sinkronisasinya.
Ilustrasi cara kerja protokol komunikasi IIC/I2C/TWI adalah sebagai berikut :
Yang perlu Anda perhatikan bahwa jalur bus komunikasi I2C bersifat open drain, jadi sebenarnya membutuhkan resistor pullup. Untuk jarak pendek resistor pullup ini bisa ditiadakan, namun untuk jarak panjang atau jumlah client/slave yang banyak, resistor pullup ini wajib ada. Untuk jumlah client/slave yang dapat terhubung dalam satu jalur bus I2C ini adalah sebanyak 112. Untuk tiap client/slave wajib memiliki alamat yang unik agar tidak terjadi tabrakan data (data collision) atau data yang invalid. Sedangkan panjang kabel pada jalur bus I2C, maksimal bisa mencapai 250 m tergantung pada besaran kapasitansi, resistor pullup dan kecepatan clock sinkronisasi data.
Khusus untuk Arduino, ada library tersendiri yang didedikasikan untuk menangani protokol serial sinkron secara I2C ini. Nama library tersebut adalah ‘Wire.h’. Anda harus mendeklarasikan library ini untuk mendapatkan function-function siap pakai yang akan memudahkan Anda menangani komunikasi secara I2C. Apakah harus menggunakan library ini? Tidak juga. Anda bisa menggunakan function buatan sendiri untuk berkomunikasi menggunakan I2C. Tapi ya itu tadi, Anda harus membangun function from the scratch, artinya Anda harus memahami level hardware yang akan ditangani, mengetahui pinout Arduino dan bagaimana mengaksesnya, serta menangani data serial yang keluar masuk secara I2C. Anda dapat menyingkat waktu untuk itu semua dengan cukup mendeklarasikan library ‘Wire.h’.
Function yang ada di library ini antara lain :
– begin() ==> menginisiasi protokol I2C di arduino
– requestFrom() ==> meminta data byte dari slave
– beginTransmission() ==> memulai transmisi data ke slave I2C sesuai alamatnya
– endTransmission() ==> mengakhiri transmisi data
– write() ==> mengirim data serial
– available() ==> mengecek kesiapan device I2C
– read() ==> membaca data serial I2C
– onReceive() ==> memanggil event handler tertentu saat data mulai masuk ke Arduino
– onRequest() ==> memanggil event handler tertentu saat ada permintaan data
Untuk contoh program dapat Anda baca melalui menu File-Examples-Wire. Di sana ada ada beberapa contoh program yang dapat Anda pelajari dan praktekkan.
ajarin yang ini mas,,,
wire ini prinsip kerjanya sama kayak sensor capacitive(sentuh) ya mas..?
bukan mas, i2c/iic adl protokol komunikasi, bukan sensor
bismillah
mas aji, sy masih tahap belajar, gimn ya klo pingin komunikasikan 4 sampai 5 arduino 1 sbg master yg lainnya slave.
salah satunya bisa pakai protokol i2c ini mas, satu sbg master, yglain sbg slave
Bismillah, halo mas ! saya sedang tahap percobaan dengan i2c ini untuk sebuah sistem pada project yang melibatkan lebih dari satu arduino.
saya mau pakai konsep master-slave ini dengan prinsip kerja:
1. master memberi data variabel kepada slave
2. slave menerima data variabel dari master untuk diolah menjadi output
3. begitu juga sebaliknya (feedbacl)
yang jd pertanyaan, apakah panjang data yang bisa dikirim hanya bisa sampai 255 ? saya sudah coba mengirim integer 1000, tetapi yang keluar tidak 1000. kalau integer < 255, keluarnya sesuai. apakah ada hubungannya dengan panjang bit pada i2c ini ?
harusnya bisa mas. Coba cek sisi penerima data, kayaknya variabel buffer-nya masih tipe byte (maks 255)
bisa gak klo kita menggunakan dua sensor dengan scl dan sda yang sama pada arduino?
gimana ya caranya?
bisa mas, address sensor aja yang dibedakan
mas kalo mau menggunakan virtual terminal proteus agar tidak hanya membaca data tapi juga dapat menulis gimana caranya? yg saya buat baru sebatas instruksi ya atau tidak.
belum pernah pake proteus utk keperluan spt itu mas
Mas saya mau nanya mas bsa 2 sensor menggunakan jalur sda scl, saya udah baca alamat sensornya tetapi sensor tersebut alamatnya sama gimana cara buat programnya mas ?
bisa mas, cuma alamat sensor harus beda2. Biasanya disediakan cara oleh pembuat sensor untuk mengubah alamat I2C sensor tersebut
asssalamualaikum wr.wb.
pak aji
saya mau melanjutkan pembahasan komentar bapak. nah disini saya ada permasalahan tentang penggunaan alamat i2c yang sama pak. dimana sensor yang saya pakai yaitu RTC 1307 dan MPU-6050, 2 sensor ini memiliki alamat i2c yang sama pak.
dan saya sudah mecoba merubah salah satu alamat i2c tersebut dan berhasil tetapi nilai sensor yang diubah alamat i2cnya kurang perisisi yang diharapkan. terima kasih
wasalamuallaikum wr.wb
waalaikumsalam wr wb
kalo pembacaan sensor yg kurang presisi ngga ada hubungannya dengan perubahan alamat i2c. Jadi kemungkinannya cuman 2, alamat betul: sensor terbaca, alamat salah: hasilnya tidak akan terbaca. Kl kurang presisi itu mungkin dari rangkaian driver atau dr settingan program, atau sensornya yg (mungkin) rusak.
Maaf mas mau nanya, metode mas ganti alamat i2c-nya kyk gmn? bisa dijelaskan di sini?
Saya mau nanya, saya ingin menampilkan tulisan pada lcd karakter 16×2, sintak sudah benar semua tanpa error tapi kenapa tulisan tidak mau tampil di lcd ya?
coba cek brightness lcd mb, kadang sebenarnya lcd sudah menampilkan data, hanya ga kelihatan mata aja
Mas, saya lg ngwrjakan tugas, running text dan jam digital, dengan menggunakan Dmd p7.62 64×16 yang ternyata Pin data nya lain dengan P10 32×16, saya kesulitan koneksinya dengam arduino Uno rev3. Apakah untuk library nya bisa pakai DMD2.h? Mohon penjelasan dan infonya.
Mas kalo twi.h no such file or directoryitu kenapa ya mas? Cara benerin nya gimana? Thanks
library twi.h belum ditambahkan mas. Caranya download library twi.h dr internet kmd tambahkan ke folder library di arduino. bisa baca detailnya di sini atau lewat menu Sketch – Include Library – Manage Libraries juga bisa
Terimakasih mas ilmunya, saya ingin bertanya mas. Saya berusaha menggunakan master dan slave, dimana slave juga terdapat display 16×2 dengan modul I2C juga. Saat percobaan saya coba dan ternyata bisa jadi 1 I2Cnya, tetapi selang beberapa waktu kenapa kok hilang sendiri ya mas tulisannya di liquid crystal 16×2 ( jadi blank) . mohob pencerahannya mas terimakasih
kalau ada dua slave i2c, harus berbeda address i2c-nya ya. COba cek pakai I2C scanner
assalamualaikum gan mau tanya ada yang pernah pake sensor flow FS6122 ? terus kalo ada bagaimana yah cara pakai fitur I2C nya ?? sebelumnya terimakasih
waalaikumslm wr wb. Belum pernah pake mas. Tinggal lihat datasheetnya, kmd perhatikan alamat I2C-nya dan command untuk mendapatkan data
izin bertanya min. saya menggunakan sensor yang pinoutnya hanya vcc, grd, scl dan sda. nah ketika di uji dengan arduino jalan normal. namun ketika pakai ESP8266 data tidak masuk. setelah liat di programnya, tidak ada program yang mendeklarasikan pin sda dan scl ke pin brapa. apa harus menandai pin sda dan scl? kalo harus , apakah ada cara untuk menandai pin sda dan sclnya?