I2C Antara Arduino

Mungkin terkadang kami ingin berbagi beban kerja dari satu Arduino dengan yang lain. Atau mungkin kita menginginkan lebih banyak pin digital atau analog. Inter-Integrated Circuit atau I2C (diucapkan I kuadrat C) adalah solusi terbaik.

I2C adalah protokol yang menarik. Ini biasanya digunakan untuk berkomunikasi antar komponen pada motherboard di kamera dan dalam sistem elektronik tertanam.

Di sini, kita akan membuat bus I2C menggunakan dua Arduino. Kami akan memprogram satu master Arduino untuk memerintahkan budak lain Arduino untuk mengedipkan LED bawaan satu atau dua kali tergantung pada nilai yang diterima.

Untuk membangun ini kita perlu "bahan" berikut:

  • 2 Arduino
  • Kabel jumper
Instruksi ini dan banyak lagi dapat ditemukan di Cookbook Pengembangan Arduino saya yang tersedia di sini. : D

Langkah 1: Cara Menghubungkan Mereka

Ikuti langkah-langkah ini untuk menghubungkan dua UNO Arduino menggunakan I2C:

  1. Hubungkan pin A4 dan A5 pada satu Arduino ke pin yang sama pada yang lainnya.
  2. Garis GND harus umum untuk kedua Arduino. Hubungkan dengan jumper.

Kami juga memiliki implementasi skematis dan "papan tempat memotong roti", keduanya mudah diikuti. Untungnya, ini adalah implementasi sederhana.

Ingatlah untuk tidak menghubungkan Arduino 5 V dan 3.3 V bersamaan. Tidak akan
melukai Arduino 5V, tapi itu pasti akan mengganggu saudaranya yang 3.3 V!

Langkah 2: Kode

Kode berikut ini dibagi menjadi dua bagian: kode master dan kode slave, yang dijalankan pada dua Arduino yang berbeda. Pertama, mari kita lihat kode master :

 // Sertakan pustaka kawat yang diperlukan untuk I2C 
#sertakan int x = 0; void setup () {// Mulai I2C Bus sebagai Master Wire.begin (); } membatalkan loop () {Wire.beginTransmission (9); // kirim ke perangkat # 9 Wire.write (x); // mengirim x Wire.endTransmission (); // hentikan transmisi x ++; // Peningkatan x jika (x> 5) x = 0; // `reset x setelah mendapat 6 penundaan (500); }

Dan di sini adalah kode slave yang mengartikan karakter yang dikirim dari master:

 // Sertakan pustaka kawat yang diperlukan untuk I2C 
#sertakan int LED = 13; int x = 0; void setup () {// Tentukan pin LED sebagai Output pinMode (LED, OUTPUT); // Mulai I2C Bus sebagai Slave on address 9 Wire.begin (9); // Lampirkan fungsi untuk memicu ketika sesuatu diterima. Wire.onReceive (acceptEvent); } membatalkan acceptEvent (int byte) {x = Wire.read (); // baca satu karakter dari I2C} void loop () {// Jika nilai yang diterima adalah 0 blink LED selama 200 ms if (x == '0') {digitalWrite (LED, HIGH); keterlambatan (200); digitalWrite (LED, LOW); keterlambatan (200); } // Jika nilai yang diterima adalah 3 blink LED untuk 400 ms if (x == '3') {digitalWrite (LED, HIGH); keterlambatan (400); digitalWrite (LED, LOW); keterlambatan (400); }}

Lampiran

  • Unduh I2C_master.ino
  • Unduh I2C_slave.ino

Langkah 3: Rincian Kode

Pertama, mari kita lihat masternya . Kita perlu memasukkan pustaka Wire.h yang diperlukan:

 #termasuk 

Kemudian, dalam fungsi pengaturan, kita mulai bus I2C menggunakan fungsi Wire.begin () . Jika tidak ada argumen yang disediakan dalam fungsi, Arduino akan mulai sebagai master.

Terakhir, kami mengirim karakter x, yaitu antara 0 dan 5. Kami menggunakan fungsi berikut untuk
mulai transmisi ke perangkat dengan alamat 9, tulis karakternya, dan kemudian hentikan transmisi:

 Wire.beginTransmission (9); // kirim ke perangkat # 9 Wire.write (x); // mengirim x Wire.endTransmission (); // hentikan transmisi 

Sekarang mari kita menjelajahi kode budak Arduino . Kami juga menyertakan perpustakaan Wire.h di sini, tapi sekarang kami memulai bus I2C menggunakan Wire.begin (9) . Nomor dalam argumen adalah alamat yang ingin kita gunakan untuk Arduino. Semua perangkat dengan alamat 9 akan menerima transmisi.

Sekarang kita perlu bereaksi entah bagaimana ketika kita menerima transmisi I2C. Fungsi berikut menambahkan fungsi pemicu setiap kali karakter diterima. Lebih baik dikatakan, setiap kali Arduino menerima karakter di I2C, itu akan menjalankan fungsi yang kami katakan untuk dijalankan:

 Wire.onReceive (acceptEvent); 

Dan ini fungsinya. Di sini, kami hanya menyimpan nilai karakter yang diterima:

 membatalkan acceptEvent (int byte) {x = Wire.read (); } 

Dalam loop (), kami cukup menginterpretasikan karakter tersebut untuk berkedip LED bawaan pada kecepatan yang berbeda tergantung pada karakter yang diterima.

Langkah 4: Lebih Banyak Tentang I2C

Untuk mempelajari teori secara singkat, I2C memerlukan dua jalur digital: Serial Data line ( SDA ) untuk mentransfer data dan Serial Clock Line ( SCL ) untuk menjaga jam. Setiap koneksi I2C dapat memiliki satu master dan beberapa budak. Seorang master dapat menulis ke budak dan meminta budak untuk memberikan data, tetapi tidak ada budak yang bisa langsung menulis ke master atau ke budak lain. Setiap budak memiliki alamat unik di bus, dan master perlu mengetahui alamat masing-masing budak yang ingin diakses.

Setiap bus I2C dapat mendukung hingga 112 perangkat . Semua perangkat perlu berbagi GND . Kecepatannya sekitar 100 kb / dtk — tidak terlalu cepat tetapi masih dapat dihormati dan cukup bermanfaat. Dimungkinkan untuk memiliki lebih dari satu master di dalam bus, tetapi itu benar-benar rumit dan umumnya dihindari.

Banyak sensor menggunakan I2C untuk berkomunikasi, biasanya Unit Pengukuran Inersia, barometer,
sensor suhu, dan beberapa Sonar. Ingat bahwa I2C tidak dirancang untuk panjang kabel yang panjang . Tergantung pada jenis kabel yang digunakan, 2 meter mungkin sudah menyebabkan masalah.

I2C adalah protokol transmisi yang rumit, tetapi sangat berguna. Semua Arduinos menerapkannya, dengan beberapa perbedaan dalam pemetaan pin:

Papan pin I2C

Uno, Pro Mini A4 (SDA), A5 (SCL)

Mega, Due 20 (SDA), 21 (SCL)

Leonardo, Yun 2 (SDA), 3 (SCL)

Langkah 5: Menghubungkan Lebih Banyak Perangkat

Jika kita perlu menghubungkan lebih dari dua perangkat pada bus I2C, kita hanya perlu menghubungkan semua jalur SDA dan SCL. Kami akan membutuhkan alamat setiap budak untuk dialamatkan dari master Arduino.

Ini adalah video implementasi pribadi menggunakan 1 master dan 3 budak.

Topik lainnya mengenai komunikasi Arduino seperti Wireless Serial, kartu SD atau Ethernet dapat ditemukan di Buku Masak Pengembangan Arduino saya yang tersedia di sini. : D

Artikel Terkait