- Apa itu Protokol Komunikasi I2C?
- Bagaimana Komunikasi I2C berfungsi?
- Di mana menggunakan komunikasi I2C?
- I2C di Arduino
- Komponen Diperlukan
- Rajah Litar
- Penjelasan Kerja
- Pengaturcaraan I2C di Arduino
- Penjelasan Pengaturcaraan Master Arduino
- Penjelasan Pengaturcaraan Slave Arduino
Dalam tutorial sebelumnya kami belajar mengenai komunikasi SPI di Arduino. Hari ini kita akan belajar mengenai satu lagi Protokol Komunikasi Bersiri: I2C (Inter Integrated Circuits). Membandingkan I2C dengan SPI, I2C hanya mempunyai dua wayar sementara SPI menggunakan empat dan I2C boleh mempunyai Multiple Master dan Slave, sementara SPI hanya boleh mempunyai satu master dan beberapa hamba. Oleh itu, terdapat lebih daripada satu mikrokontroler dalam projek yang perlu menjadi master maka I2C digunakan. Komunikasi I2C umumnya digunakan untuk berkomunikasi dengan Giroskop, akselerometer, sensor tekanan barometrik, paparan LED dll.
Dalam tutorial Arduino I2C ini kita akan menggunakan komunikasi I2C antara dua papan arduino dan saling mengirim (0 hingga 127) nilai dengan menggunakan potensiometer. Nilai akan dipaparkan pada LCD 16x2 yang disambungkan ke setiap Arduino. Di sini satu Arduino akan bertindak sebagai Guru dan yang lain akan bertindak sebagai Hamba. Oleh itu mari kita mulakan dengan pengenalan mengenai komunikasi I2C.
Apa itu Protokol Komunikasi I2C?
Istilah IIC bermaksud " Inter Integrated Circuits ". Biasanya dilambangkan sebagai I2C atau I kuadrat C atau bahkan sebagai protokol antara muka 2-wayar (TWI) di beberapa tempat tetapi semuanya bererti sama. I2C adalah makna protokol komunikasi segerak, kedua-dua peranti yang berkongsi maklumat mesti berkongsi isyarat jam yang sama. Ia hanya mempunyai dua wayar untuk berkongsi maklumat yang mana satu digunakan untuk isyarat ayam dan yang lain digunakan untuk menghantar dan menerima data.
Bagaimana Komunikasi I2C berfungsi?
Komunikasi I2C pertama kali diperkenalkan oleh Phillips. Seperti yang dinyatakan sebelumnya, ia mempunyai dua wayar, kedua-dua wayar ini akan disambungkan di dua peranti. Di sini satu peranti dipanggil master dan peranti lain dipanggil sebagai hamba. Komunikasi harus dan akan selalu berlaku antara dua Tuan dan Budak. Kelebihan komunikasi I2C adalah lebih daripada satu hamba dapat dihubungkan dengan Master.
Komunikasi lengkap berlaku melalui dua wayar ini iaitu, Serial Clock (SCL) dan Serial Data (SDA).
Serial Clock (SCL): Berkongsi isyarat jam yang dihasilkan oleh tuan dengan hamba
Data Bersiri (SDA): Menghantar data ke dan dari antara Tuan dan hamba.
Pada masa tertentu hanya tuan yang dapat memulakan komunikasi. Oleh kerana terdapat lebih dari satu hamba di dalam bas, tuan harus merujuk kepada setiap hamba menggunakan alamat yang berbeza. Apabila dialamatkan hanya hamba dengan alamat tertentu yang akan membalas dengan maklumat sementara yang lain terus berhenti. Dengan cara ini kita dapat menggunakan bas yang sama untuk berkomunikasi dengan pelbagai peranti.
Tahap voltan I2C tidak ditentukan sebelumnya. Komunikasi I2C fleksibel, bermaksud peranti yang dikuasakan oleh volt 5v, dapat menggunakan 5v untuk I2C dan peranti 3.3v dapat menggunakan 3v untuk komunikasi I2C. Tetapi bagaimana jika dua peranti yang berjalan pada voltan yang berbeza, perlu berkomunikasi menggunakan I2C? A bas 5V I2C tidak boleh dihubungkan dengan 3.3V peranti. Dalam kes ini, pemindah voltan digunakan untuk memadankan tahap voltan antara dua bas I2C.
Terdapat beberapa syarat yang merangkumi transaksi. Permulaan penghantaran bermula dengan kelebihan SDA yang jatuh, yang ditakrifkan sebagai keadaan 'MULAI' dalam rajah di bawah di mana induk meninggalkan SCL tinggi semasa menetapkan SDA rendah.
Seperti yang ditunjukkan dalam rajah di bawah, Tepi SDA yang jatuh adalah pencetus perkakasan untuk keadaan MULAI. Selepas ini semua peranti pada bas yang sama masuk ke mod mendengar.
Dengan cara yang sama, kelebihan SDA yang berhenti menghentikan transmisi yang ditunjukkan sebagai keadaan 'STOP' dalam rajah di atas, di mana master meninggalkan SCL tinggi dan juga melepaskan SDA untuk pergi TINGGI. Oleh itu, peningkatan SDA menghentikan penghantarannya.
R / W bit menunjukkan arah penghantaran bait berikut, jika TINGGI berarti hamba akan menghantar dan jika rendah bermaksud tuan akan menghantar.
Setiap bit dihantar pada setiap kitaran jam, jadi diperlukan 8 pusingan jam untuk mengirimkan bait. Selepas setiap bait dihantar atau diterima, kitaran jam kesembilan diadakan untuk ACK / NACK (diakui / tidak diakui). Bit ACK ini dihasilkan oleh hamba atau tuan bergantung kepada keadaan. Untuk bit ACK, SDA ditetapkan ke rendah oleh tuan atau hamba pada pusingan jam ke- 9. Jadi rendah ia dianggap sebagai ACK sebaliknya NACK.
Di mana menggunakan komunikasi I2C?
Komunikasi I2C hanya digunakan untuk komunikasi jarak dekat. Ia semestinya boleh dipercayai sehingga mempunyai denyut jam yang disegerakkan untuk menjadikannya pintar. Protokol ini digunakan terutamanya untuk berkomunikasi dengan sensor atau peranti lain yang harus menghantar maklumat kepada master. Sangat berguna apabila mikrokontroler harus berkomunikasi dengan banyak modul hamba lain dengan menggunakan wayar minimum. Sekiranya anda mencari komunikasi jarak jauh, anda harus mencuba RS232 dan jika anda mencari komunikasi yang lebih dipercayai, anda harus mencuba protokol SPI.
I2C di Arduino
Gambar di bawah menunjukkan pin I2C yang terdapat di Arduino UNO.
Garisan I2C | Sematkan di Arduino |
SDA | A4 |
SCL | A5 |
Sebelum kita memulakan pengaturcaraan I2C menggunakan dua Arduino. Kita perlu belajar mengenai perpustakaan Wire yang digunakan di Arduino IDE.
The perpustakaan
1. Wire.begin (alamat):
Penggunaan: Perpustakaan ini digunakan untuk membuat komunikasi dengan peranti I2C. Ini Memulakan perpustakaan Wire dan bergabung dengan bas I2C sebagai tuan atau hamba.
Alamat: Alamat hamba 7-bit adalah pilihan dan jika alamatnya tidak ditentukan, ia akan bergabung dengan bas sebagai tuan seperti ini.
2. Wire.read ():
Gunakan: Fungsi ini digunakan untuk membaca bait yang diterima dari perangkat induk atau budak, baik yang dikirimkan dari perangkat budak ke perangkat induk setelah panggilan untuk meminta Dari () atau dikirimkan dari master ke budak.
3. Wire.write ():
Gunakan: Fungsi ini digunakan untuk menulis data ke hamba atau perangkat induk.
Slave to Master: Slave menulis data kepada master ketika Wire.RequestFrom () digunakan dalam master.
Master to Slave: Untuk penghantaran dari master ke peranti hamba Wire.write () digunakan di antara panggilan ke Wire.beginTransmission () dan Wire.endTransmission ().
Wire.write () boleh ditulis sebagai:
- Wire.write (nilai)
nilai: nilai untuk dihantar sebagai bait tunggal.
- Wire.write (rentetan):
string: rentetan untuk dihantar sebagai satu siri bait.
- Wire.write (data, panjang):
data: pelbagai data untuk dihantar sebagai bait
panjang: bilangan bait untuk dihantar.
4. Penghantaran Wire.begin (alamat):
Gunakan: Fungsi ini digunakan untuk memulai transmisi ke perangkat I2C dengan alamat budak yang diberikan. Selepas itu, bina antrian bait untuk penghantaran dengan fungsi tulis () dan kemudian hantar dengan memanggil fungsi endTransmission () . Alamat 7-bit peranti dihantar.
5. Wire.endTransmission ();
Gunakan: Fungsi ini digunakan untuk mengakhiri transmisi ke perangkat budak yang dimulakan oleh beginTransmission () dan mengirimkan bait yang di antrian oleh Wire.write ().
6. Wire.onRequest ();
Gunakan: Fungsi ini dipanggil ketika master meminta data menggunakan Wire.requestFrom () dari peranti hamba. Di sini kita boleh memasukkan fungsi Wire.write () untuk menghantar data kepada master.
7. Wire.onReceive ();Gunakan: Fungsi ini dipanggil ketika peranti hamba menerima data dari master. Di sini kita boleh memasukkan Wire.read (); berfungsi membaca data yang dihantar dari master.
8. Wire.requestFrom (alamat, kuantiti);
Gunakan: Fungsi ini digunakan di master untuk meminta bait dari peranti hamba. Fungsi Wire.read () digunakan untuk membaca data yang dihantar dari peranti hamba.
alamat: alamat 7-bit peranti untuk meminta bait dari
kuantiti: bilangan bait yang diminta
Komponen Diperlukan
- Arduino Uno (2-Nos)
- Modul paparan LCD 16X2
- Potensiometer 10K (4-Nos)
- Papan roti
- Wayar Penyambung
Rajah Litar
Penjelasan Kerja
Di sini untuk menunjukkan komunikasi I2C di Arduino, kami menggunakan Two Arduino UNO dengan paparan LCD Two 16X2 yang saling melekat dan menggunakan dua potensiometer pada kedua arduino untuk menentukan nilai pengiriman (0 hingga 127) dari master ke slave dan slave to master dengan mengubah potensiometer.
Kami mengambil nilai analog input pada arduino pin A0 dari (0 hingga 5V) dengan menggunakan potensiometer dan mengubahnya menjadi nilai Analog ke Digital (0 hingga 1023). Kemudian nilai-nilai ADC ini kemudian ditukar menjadi (0 hingga 127) kerana kami hanya dapat mengirim data 7-bit melalui komunikasi I2C. Komunikasi I2C berlaku melalui dua wayar pada pin A4 & A5 dari kedua arduino.
Nilai pada LCD Slave Arduino akan diubah dengan memvariasikan POT di sisi induk dan sebaliknya.
Pengaturcaraan I2C di Arduino
Tutorial ini mempunyai dua program satu untuk master Arduino dan satu lagi untuk hamba Arduino. Program lengkap untuk kedua-dua belah pihak diberikan pada akhir projek ini dengan Video demonstrasi.
Penjelasan Pengaturcaraan Master Arduino
1. Pertama sekali kita perlu memasukkan perpustakaan Wire untuk menggunakan fungsi komunikasi I2C dan perpustakaan LCD untuk menggunakan fungsi LCD. Tentukan juga pin LCD untuk LCD 16x2. Ketahui lebih lanjut mengenai menghubungkan LCD dengan Arduino di sini.
#sertakan
2. Dalam persediaan tidak sah ()
- Kami Memulakan Komunikasi Bersiri pada Baud Rate 9600.
Serial.begin (9600);
- Seterusnya kita mulakan komunikasi I2C di pin (A4, A5)
Wire.begin (); // Memulakan komunikasi I2C di pin (A4, A5)
- Seterusnya kami menginisialisasi modul paparan LCD dalam mod 16X2 dan memaparkan mesej selamat datang dan bersihkan setelah lima saat.
lcd.begin (16,2); // Memanfaatkan paparan LCD lcd.setCursor (0,0); // Tetapkan Kursor pada baris pertama Paparan lcd.print ("Circuit Digest"); // Mencetak CIRCUIT DIGEST dalam LCD lcd.setCursor (0,1); // Tetapkan Kursor pada baris kedua Paparan lcd.print ("I2C 2 ARDUINO"); // Mencetak I2C ARDUINO dalam kelewatan LCD (5000); // Kelewatan selama 5 saat lcd.clear (); // Membersihkan paparan LCD
3. Dalam gelung kosong ()
- Mula-mula kita perlu mendapatkan data dari Slave sehingga kita menggunakan requestFrom () dengan alamat hamba 8 dan kami meminta satu bait
Wire.requestDari (8,1);
Nilai yang diterima dibaca menggunakan Wire.read ()
bait MasterReceive = Wire.read ();
- Seterusnya kita perlu membaca nilai analog dari POT arduino induk yang dilekatkan pada pin A0
int potvalue = analogRead (A0);
Kami menukar nilai itu dari satu bait 0 hingga 127.
byte MasterSend = peta (nilai pot, 0,1023,0,127);
- Selanjutnya kita perlu menghantar nilai-nilai yang ditukar sehingga kita memulakan penghantaran dengan slave arduino dengan 8 alamat
Wire.beginTransmission (8); Wire.write (MasterSend); Wire.endTransmission ();
- Seterusnya kami memaparkan nilai yang diterima dari hamba arduino dengan penundaan 500 mikrodetik dan kami terus menerus menerima dan memaparkan nilai tersebut.
lcd.setCursor (0,0); // Tetapkan Currsor pada baris pertama LCD lcd.print (">> Master <<"); // Cetakan >> Master << di LCD lcd.setCursor (0,1); // Tetapkan Kursor pada baris kedua LCD lcd.print ("SlaveVal:"); // Mencetak SlaveVal: dalam lcd.print LCD (MasterReceive); // Cetakan MasterReceive dalam LCD yang diterima dari Slave Serial.println ("Master Diterima Dari Slave"); // Cetakan dalam Serial Monitor Serial.println (MasterReceive); kelewatan (500); lcd.clear ();
Penjelasan Pengaturcaraan Slave Arduino
1. Sama seperti master, pertama sekali kita perlu memasukkan perpustakaan Wire untuk menggunakan fungsi komunikasi I2C dan perpustakaan LCD untuk menggunakan fungsi LCD. Tentukan juga pin LCD untuk LCD 16x2.
#sertakan
2. Dalam persediaan tidak sah ()
- Kami Memulakan Komunikasi Bersiri pada Baud Rate 9600.
Serial.begin (9600);
- Seterusnya kita mulakan komunikasi I2C di pin (A4, A5) dengan alamat hamba sebagai 8. Di sini penting untuk menentukan alamat hamba.
Wire.begin (8);
Seterusnya kita perlu memanggil fungsi ketika Slave menerima nilai dari master dan ketika nilai permintaan Master dari Slave
Wire.onReceive (menerimaEvent); Wire.onRequest (requestEvent);
- Seterusnya kami menginisialisasi modul paparan LCD dalam mod 16X2 dan memaparkan mesej selamat datang dan bersihkan setelah lima saat.
lcd.begin (16,2); // Memanfaatkan paparan LCD lcd.setCursor (0,0); // Tetapkan Kursor pada baris pertama Paparan lcd.print ("Circuit Digest"); // Mencetak CIRCUIT DIGEST dalam LCD lcd.setCursor (0,1); // Tetapkan Kursor pada baris kedua Paparan lcd.print ("I2C 2 ARDUINO"); // Mencetak I2C ARDUINO dalam kelewatan LCD (5000); // Kelewatan selama 5 saat lcd.clear (); // Membersihkan paparan LCD
3. Seterusnya kita mempunyai dua fungsi satu untuk acara permintaan dan satu untuk acara terima
Untuk permintaan Acara
Apabila nilai permintaan Master dari hamba fungsi ini akan dijalankan. Fungsi ini memang mengambil nilai input dari Slave POT dan menukarnya dalam bentuk 7-bit dan menghantar nilai tersebut ke induk.
batal requestEvent () { int potvalue = analogRead (A0); byte SlaveSend = peta (nilai pot, 0,1023,0,127); Wire.write (SlaveSend); }
Untuk Acara Terima
Apabila Master mengirim data ke hamba dengan alamat budak (8) fungsi ini akan dijalankan. Fungsi ini membaca nilai yang diterima dari induk dan menyimpan dalam pemboleh ubah jenis byte .
batal menerimaEvent (int howMany { SlaveReceived = Wire.read (); }
4. Dalam gelung Void ():
Kami memaparkan nilai yang diterima dari master secara berterusan dalam modul paparan LCD.
gelung void (kekosongan) { lcd.setCursor (0,0); // Tetapkan Currsor pada baris pertama LCD lcd.print (">> Slave <<"); // Cetakan >> Budak << di LCD lcd.setCursor (0,1); // Tetapkan Kursor pada baris kedua LCD lcd.print ("MasterVal:"); // Mencetak MasterVal: dalam lcd.print LCD (SlaveReceived); // Mencetak nilai SlaveReceived dalam LCD yang diterima dari Master Serial.println ("Slave Received From Master:"); // Cetakan dalam Serial Monitor Serial.println (SlaveReceived); kelewatan (500); lcd.clear (); }
Dengan memutar Potensiometer di satu sisi, anda dapat melihat pelbagai nilai pada LCD di sisi lain:
Jadi ini adalah bagaimana komunikasi I2C berlaku 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 boleh menghubungkan antara sensor I2C ke Arduino.
Pengekodan lengkap untuk Master dan Slave Arduino diberikan di bawah dengan video demonstrasi