- Apa itu Protokol Komunikasi I2C?
- Bagaimana I2C Communication bekerja?
- Di mana menggunakan komunikasi I2C?
- I2C dalam bahasa Arduino
- Komponen Diperlukan
- Diagram Sirkuit
- Penjelasan Bekerja
- Pemrograman I2C dalam Arduino
- Penjelasan Pemrograman Master Arduino
- Penjelasan Pemrograman Arduino Slave
Dalam tutorial kami sebelumnya belajar tentang komunikasi SPI di Arduino. Hari ini kita akan belajar tentang Protokol Komunikasi Serial lainnya: I2C (Inter Integrated Circuits). Membandingkan I2C dengan SPI, I2C hanya memiliki dua kabel sedangkan SPI menggunakan empat kabel dan I2C dapat memiliki Multiple Master dan Slave, sedangkan SPI hanya memiliki satu master dan banyak slave. Jadi ada lebih dari satu mikrokontroler dalam suatu proyek yang perlu master maka digunakan I2C. Komunikasi I2C umumnya digunakan untuk berkomunikasi dengan Giroskop, akselerometer, sensor tekanan barometrik, tampilan LED dll.
Dalam tutorial Arduino I2C ini kita akan menggunakan komunikasi I2C antara dua papan arduino dan mengirim nilai (0 hingga 127) satu sama lain dengan menggunakan potensiometer. Nilai akan ditampilkan pada LCD 16x2 yang terhubung ke masing-masing Arduino. Di sini satu Arduino akan bertindak sebagai Tuan dan satu lagi akan bertindak sebagai Budak. Jadi mari kita mulai dengan perkenalan tentang komunikasi I2C.
Apa itu Protokol Komunikasi I2C?
Istilah IIC adalah singkatan dari " Inter Integrated Circuits ". Biasanya dilambangkan sebagai I2C atau I kuadrat C atau bahkan sebagai protokol antarmuka 2-kabel (TWI) di beberapa tempat tetapi semuanya berarti sama. I2C adalah protokol komunikasi sinkron yang berarti, kedua perangkat yang berbagi informasi harus berbagi sinyal jam yang sama. Ini hanya memiliki dua kabel untuk berbagi informasi yang satu digunakan untuk sinyal ayam dan yang lainnya digunakan untuk mengirim dan menerima data.
Bagaimana I2C Communication bekerja?
Komunikasi I2C pertama kali diperkenalkan oleh Phillips. Seperti yang dikatakan sebelumnya, ia memiliki dua kabel, kedua kabel ini akan dihubungkan di dua perangkat. Di sini satu perangkat disebut master dan perangkat lainnya disebut slave. Komunikasi harus dan akan selalu terjadi antara dua Tuan dan seorang Budak. Keuntungan dari komunikasi I2C adalah lebih dari satu slave dapat dihubungkan ke Master.
Komunikasi lengkap terjadi melalui dua kabel ini yaitu, Serial Clock (SCL) dan Serial Data (SDA).
Serial Clock (SCL): Membagikan sinyal clock yang dihasilkan oleh master dengan budak
Serial Data (SDA): Mengirim data ke dan dari antara Master dan slave.
Pada waktu tertentu, hanya master yang dapat memulai komunikasi. Karena ada lebih dari satu budak di dalam bus, majikan harus merujuk ke setiap budak menggunakan alamat yang berbeda. Ketika dialamatkan hanya budak dengan alamat tertentu yang akan membalas kembali dengan informasi sementara yang lain terus keluar. Dengan cara ini kita dapat menggunakan bus yang sama untuk berkomunikasi dengan banyak perangkat.
Tingkat tegangan I2C belum ditentukan sebelumnya. Komunikasi I2C bersifat fleksibel, artinya perangkat yang bertenaga 5v volt, dapat menggunakan 5v untuk I2C dan perangkat 3.3v dapat menggunakan 3v untuk komunikasi I2C. Tetapi bagaimana jika dua perangkat yang berjalan pada voltase berbeda, perlu berkomunikasi menggunakan I2C? Sebuah 5V I2C bus tidak dapat terhubung dengan 3.3V perangkat. Dalam hal ini pemindah tegangan digunakan untuk menyesuaikan level tegangan antara dua bus I2C.
Ada beberapa kondisi yang membingkai sebuah transaksi. Inisialisasi transmisi dimulai dengan tepi jatuh SDA, yang didefinisikan sebagai kondisi 'MULAI' dalam diagram di bawah ini di mana master meninggalkan SCL tinggi sementara SDA disetel rendah.
Seperti yang ditunjukkan pada diagram di atas di bawah ini, Tepi jatuh SDA adalah pemicu perangkat keras untuk kondisi MULAI. Setelah ini semua perangkat di bus yang sama masuk ke mode mendengarkan.
Dengan cara yang sama, tepi naik SDA menghentikan transmisi yang ditunjukkan sebagai kondisi 'BERHENTI' pada diagram di atas, di mana master meninggalkan SCL tinggi dan juga melepaskan SDA ke TINGGI. Jadi tepi naik SDA menghentikan transmisi.
Bit R / W menunjukkan arah transmisi dari byte berikut, jika TINGGI berarti budak akan mengirimkan dan jika rendah berarti master akan mengirimkan.
Setiap bit ditransmisikan pada setiap siklus clock, sehingga dibutuhkan 8 siklus clock untuk mengirimkan satu byte. Setelah setiap byte dikirim atau diterima, siklus jam kesembilan diadakan untuk ACK / NACK (diakui / tidak diakui). Bit ACK ini dihasilkan oleh slave atau master tergantung pada situasinya. Untuk bit ACK, SDA disetel ke rendah oleh master atau slave pada siklus jam ke- 9. Jadi itu rendah dianggap sebagai ACK jika tidak NACK.
Di mana menggunakan komunikasi I2C?
Komunikasi I2C hanya digunakan untuk komunikasi jarak pendek. Hal ini tentu dapat diandalkan sampai batas tertentu karena memiliki pulsa jam tersinkronisasi untuk membuatnya pintar. Protokol ini terutama digunakan untuk berkomunikasi dengan sensor atau perangkat lain yang harus mengirimkan informasi ke master. Ini sangat berguna ketika mikrokontroler harus berkomunikasi dengan banyak modul pendukung lainnya dengan menggunakan kabel minimum. Jika Anda mencari komunikasi jarak jauh, Anda harus mencoba RS232 dan jika Anda mencari komunikasi yang lebih andal, Anda harus mencoba protokol SPI.
I2C dalam bahasa Arduino
Gambar di bawah ini menunjukkan pin I2C yang ada di Arduino UNO.
Jalur I2C | Pin di Arduino |
SDA | A4 |
SCL | A5 |
Sebelum kita mulai memprogram I2C menggunakan dua Arduino. Kita perlu belajar tentang pustaka Wire yang digunakan di Arduino IDE.
The library
1. Wire.begin (alamat):
Penggunaan: Perpustakaan ini digunakan untuk melakukan komunikasi dengan perangkat I2C. Ini Memulai pustaka Wire dan bergabung dengan bus I2C sebagai master atau slave.
Alamat: Alamat budak 7-bit adalah opsional dan jika alamat tidak ditentukan, itu bergabung dengan bus sebagai master seperti ini.
2. Wire.read ():
Penggunaan: Fungsi ini digunakan untuk membaca byte yang diterima dari perangkat master atau slave, baik yang dikirim dari perangkat slave ke perangkat master setelah panggilan ke requestFrom () atau ditransmisikan dari master ke slave.
3. Wire.write ():
Penggunaan: Fungsi ini digunakan untuk menulis data ke perangkat budak atau master.
Slave to Master: Slave menulis data ke master saat Wire.RequestFrom () digunakan di master.
Master ke Slave: Untuk transmisi dari perangkat master ke slave, Wire.write () digunakan di antara panggilan ke Wire.beginTransmission () dan Wire.endTransmission ().
Wire.write () dapat ditulis sebagai:
- Wire.write (nilai)
nilai: nilai untuk dikirim sebagai satu byte.
- Wire.write (string):
string: string untuk dikirim sebagai rangkaian byte.
- Wire.write (data, panjang):
data: larik data untuk dikirim sebagai byte
length: jumlah byte untuk dikirim.
4. Wire.beginTransmission (alamat):
Penggunaan: Fungsi ini digunakan untuk memulai transmisi ke perangkat I2C dengan alamat slave yang diberikan. Selanjutnya, buat antrian byte untuk transmisi dengan fungsi write () dan kemudian mengirimkannya dengan memanggil fungsi endTransmission () . Alamat 7-bit perangkat ditransmisikan.
5. Wire.endTransmission ();
Penggunaan: Fungsi ini digunakan untuk mengakhiri transmisi ke perangkat slave yang dimulai oleh beginTransmission () dan mengirimkan byte yang antri oleh Wire.write ().
6. Wire.onRequest ();
Penggunaan: Fungsi ini dipanggil saat master meminta data menggunakan Wire.requestFrom () dari perangkat slave. Disini kita bisa menyertakan fungsi Wire.write () untuk mengirim data ke master.
7. Wire.onReceive ();Penggunaan: Fungsi ini dipanggil ketika perangkat slave menerima data dari master. Di sini kita bisa menyertakan Wire.read (); berfungsi untuk membaca data yang dikirim dari master.
8. Wire.requestFrom (alamat, jumlah);
Penggunaan: Fungsi ini digunakan di master untuk meminta byte dari perangkat slave. Fungsi Wire.read () digunakan untuk membaca data yang dikirim dari perangkat slave.
address: alamat 7-bit perangkat yang akan meminta byte
kuantitas: jumlah byte yang diminta
Komponen Diperlukan
- Arduino Uno (2-Tidak)
- Modul layar LCD 16X2
- Potensiometer 10K (4-Nos)
- Papan tempat memotong roti
- Menghubungkan Kabel
Diagram Sirkuit
Penjelasan Bekerja
Di sini untuk mendemonstrasikan komunikasi I2C di Arduino, kami menggunakan Dua Arduino UNO dengan Dua layar LCD 16X2 yang saling menempel dan menggunakan dua potensiometer pada kedua arduino untuk menentukan nilai pengiriman (0 hingga 127) dari master ke slave dan slave ke master dengan memvariasikan potensiometer.
Kami mengambil nilai analog input pada pin arduino A0 dari (0 hingga 5V) dengan menggunakan potensiometer dan mengubahnya menjadi nilai Analog ke Digital (0 hingga 1023). Kemudian nilai ADC ini selanjutnya diubah menjadi (0 hingga 127) karena kami hanya dapat mengirim data 7-bit melalui komunikasi I2C. Komunikasi I2C berlangsung melalui dua kabel pada pin A4 & A5 dari kedua arduino.
Nilai di LCD Slave Arduino akan diubah dengan memvariasikan POT di sisi master dan sebaliknya.
Pemrograman I2C dalam Arduino
Tutorial ini memiliki dua program satu untuk master Arduino dan lainnya untuk budak Arduino. Program lengkap untuk kedua sisi diberikan di akhir proyek ini dengan Video demonstrasi.
Penjelasan Pemrograman Master Arduino
1. Pertama-tama kita perlu menyertakan perpustakaan Wire untuk menggunakan fungsi komunikasi I2C dan perpustakaan LCD untuk menggunakan fungsi LCD. Tentukan juga pin LCD untuk LCD 16x2. Pelajari lebih lanjut tentang antarmuka LCD dengan Arduino di sini.
#include
2. Dalam penyiapan batal ()
- Kami Memulai Komunikasi Serial dengan Baud Rate 9600.
Serial.begin (9600);
- Selanjutnya kita mulai komunikasi I2C di pin (A4, A5)
Wire.begin (); // Memulai komunikasi I2C pada pin (A4, A5)
- Selanjutnya kita menginisialisasi modul layar LCD dalam mode 16X2 dan menampilkan pesan selamat datang dan menghapusnya setelah lima detik.
lcd.begin (16,2); // Inisiasi tampilan LCD lcd.setCursor (0,0); // Set Cursor pada baris pertama Tampilan lcd.print ("Circuit Digest"); // Mencetak CIRCUIT DIGEST di LCD lcd.setCursor (0,1); // Set Cursor pada baris kedua Tampilan lcd.print ("I2C 2 ARDUINO"); // Mencetak I2C ARDUINO dalam penundaan LCD (5000); // Tunda selama 5 detik lcd.clear (); // Menghapus tampilan LCD
3. Dalam lingkaran kosong ()
- Pertama kita perlu mendapatkan data dari Slave jadi kita menggunakan requestFrom () dengan alamat slave 8 dan kita meminta satu byte
Wire.requestFrom (8,1);
Nilai yang diterima dibaca menggunakan Wire.read ()
byte MasterReceive = Wire.read ();
- Selanjutnya kita perlu membaca nilai analog dari master arduino POT yang terpasang pada pin A0
int potvalue = analogRead (A0);
Kami mengonversi nilai itu dalam satu byte sebagai 0 hingga 127.
byte MasterSend = peta (nilai pot, 0,1023,0,127);
- Selanjutnya kita perlu mengirim nilai yang dikonversi tersebut sehingga kita memulai transmisi dengan slave arduino dengan 8 alamat
Wire.beginTransmission (8); Wire.write (MasterSend); Wire.endTransmission ();
- Selanjutnya kami menampilkan nilai yang diterima dari slave arduino dengan penundaan 500 mikrodetik dan kami terus menerima dan menampilkan nilai tersebut.
lcd.setCursor (0,0); // Set Currsor pada baris pertama LCD lcd.print (">> Master <<"); // Mencetak >> Master << di LCD lcd.setCursor (0,1); // Set Cursor pada baris dua LCD lcd.print ("SlaveVal:"); // Mencetak SlaveVal: di LCD lcd.print (MasterReceive); // Mencetak MasterReceive dalam LCD yang diterima dari Slave Serial.println ("Master Diterima Dari Slave"); // Mencetak di Serial Monitor Serial.println (MasterReceive); penundaan (500); lcd.clear ();
Penjelasan Pemrograman Arduino Slave
1. Sama seperti master, pertama-tama kita perlu menyertakan perpustakaan Wire untuk menggunakan fungsi komunikasi I2C dan perpustakaan LCD untuk menggunakan fungsi LCD. Tentukan juga pin LCD untuk LCD 16x2.
#include
2. Dalam penyiapan batal ()
- Kami Memulai Komunikasi Serial dengan Baud Rate 9600.
Serial.begin (9600);
- Selanjutnya kita memulai komunikasi I2C di pin (A4, A5) dengan alamat slave 8. Di sini penting untuk menentukan alamat slave.
Wire.begin (8);
Selanjutnya kita perlu memanggil fungsi ketika Slave menerima nilai dari master dan ketika Master meminta nilai dari Slave
Wire.onReceive (acceptEvent); Wire.onRequest (requestEvent);
- Selanjutnya kita menginisialisasi modul layar LCD dalam mode 16X2 dan menampilkan pesan selamat datang dan menghapusnya setelah lima detik.
lcd.begin (16,2); // Inisiasi tampilan LCD lcd.setCursor (0,0); // Set Cursor pada baris pertama Tampilan lcd.print ("Circuit Digest"); // Mencetak CIRCUIT DIGEST di LCD lcd.setCursor (0,1); // Set Cursor pada baris kedua Tampilan lcd.print ("I2C 2 ARDUINO"); // Mencetak I2C ARDUINO dalam penundaan LCD (5000); // Tunda selama 5 detik lcd.clear (); // Menghapus tampilan LCD
3. Selanjutnya kita memiliki dua fungsi, satu untuk acara permintaan dan satu untuk menerima acara
Untuk acara permintaan
Ketika Master meminta nilai dari slave, fungsi ini akan dijalankan. Fungsi ini mengambil nilai input dari Slave POT dan mengubahnya menjadi 7-bit dan mengirimkan nilai tersebut ke master.
void requestEvent () { int potvalue = analogRead (A0); byte SlaveSend = peta (nilai pot, 0,1023,0,127); Wire.write (SlaveSend); }
Untuk Menerima Acara
Ketika Master mengirimkan data ke slave dengan alamat slave (8) fungsi ini akan dijalankan. Fungsi ini membaca nilai yang diterima dari master dan menyimpan dalam variabel tipe byte .
void acceptEvent (int howMany { SlaveReceived = Wire.read (); }
4. Dalam loop Void ():
Kami menampilkan nilai yang diterima dari master terus menerus dalam modul layar LCD.
void loop (void) { lcd.setCursor (0,0); // Set Currsor pada baris pertama LCD lcd.print (">> Slave <<"); // Mencetak >> Slave << di LCD lcd.setCursor (0,1); // Set Cursor pada baris dua LCD lcd.print ("MasterVal:"); // Mencetak MasterVal: di LCD lcd.print (SlaveReceived); // Mencetak nilai SlaveReceived dalam LCD yang diterima dari Master Serial.println ("Slave Received From Master:"); // Mencetak di Serial Monitor Serial.println (SlaveReceived); penundaan (500); lcd.clear (); }
Dengan memutar Potensiometer di satu sisi, Anda dapat melihat nilai yang bervariasi pada LCD di sisi lain:
Jadi beginilah komunikasi I2C terjadi di Arduino, di sini kami telah menggunakan dua Arduino untuk menunjukkan tidak hanya pengiriman data tetapi juga menerima data menggunakan komunikasi I2C. Jadi sekarang Anda dapat menghubungkan sensor I2C ke Arduino.
Pengkodean lengkap untuk Master dan Slave Arduino diberikan di bawah ini dengan video demonstrasi