I2C Antara Arduinos

Mungkin kadangkala kita ingin berkongsi beban kerja satu Arduino dengan yang lain. Atau mungkin kita mahukan lebih banyak pin digital atau analog. Litar Antara Bersepadu atau I2C (diucapkan I Kuadrat C) adalah penyelesaian terbaik.

I2C adalah protokol yang menarik. Ia biasanya digunakan untuk berkomunikasi antara komponen pada motherboard di kamera dan dalam mana-mana sistem elektronik tertanam.

Di sini, kami akan membuat bas I2C menggunakan dua Arduinos. Kami akan memprogramkan satu Arduino tuan untuk memerintahkan Arduino hamba yang lain untuk mengedipkan LED terbina sekali atau dua kali bergantung kepada nilai yang diterima.

Untuk membina ini, kami memerlukan "ramuan" berikut:

  • 2 Arduinos
  • Kabel jumper
Ini boleh dibimbing dan banyak lagi boleh didapati di Buku Pembelajaran Arduino saya yang terdapat di sini. : D

Langkah 1: Cara Menghubungkan Mereka

Ikuti langkah ini untuk menyambungkan dua Arduino UNOs menggunakan I2C:

  1. Sambungkan pin A4 dan A5 pada satu Arduino ke pin yang sama pada yang lain.
  2. Garis GND harus biasa bagi Arduinos. Sambungkannya dengan jumper.

Kami juga mempunyai skema dan "papan papan" pelaksanaan, kedua-duanya mudah diikuti. Nasib baik, itu adalah pelaksanaan yang mudah.

Ingatlah jangan menyambungkan 5 V dan 3.3 V Arduinos bersama-sama. Ia tidak akan
menyakiti Arduino 5V, tetapi ia pasti akan mengganggu saudaranya 3.3 V!

Langkah 2: Kod

Kod berikut terbahagi dalam dua bahagian: kod induk dan kod hamba, yang dijalankan pada dua Arduinos yang berbeza. Pertama, mari kita lihat kod induk :

 // Sertakan perpustakaan Wire yang diperlukan untuk I2C 
#include int x = 0; void setup () {// Start the I2C Bus as Master Wire.begin (); } void loop () {Wire.beginTransmission (9); // hantar ke peranti # 9 Wire.write (x); // menghantar x Wire.endTransmission (); // berhenti menghantar x ++; // Kenaikan x jika (x> 5) x = 0; / / / reset x setelah mendapat 6 delay (500); }

Dan inilah kod hamba yang menafsirkan aksara yang dihantar dari tuan:

 // Sertakan perpustakaan Wire yang diperlukan untuk I2C 
#include int LED = 13; int x = 0; void setup () {// Tentukan pin LED sebagai Output pinMode (LED, OUTPUT); // Memulakan Bus I2C sebagai Hamba di alamat 9 Wire.begin (9); // Melampirkan fungsi untuk memicu apabila ada sesuatu yang diterima. Wire.onReceive (receiveEvent); } void receiveEvent (int bytes) {x = Wire.read (); // baca satu aksara dari I2C} void loop () {// Jika nilai yang diterima adalah 0 berkedip LED untuk 200 ms jika (x == '0') {digitalWrite (LED, TINGGI); kelewatan (200); digitalWrite (LED, LOW); kelewatan (200); } // Jika nilai yang diterima adalah 3 berkedip LED untuk 400 ms jika (x == '3') {digitalWrite (LED, TINGGI); kelewatan (400); digitalWrite (LED, LOW); kelewatan (400); }}

Lampiran

  • Muat turun I2C_master.ino
  • Muat turun I2C_slave.ino

Langkah 3: Pecahan Kod

Pertama, mari tengok tuan . Kita perlu memasukkan pustaka Wire.h yang diperlukan:

 #include 

Kemudian, dalam fungsi persediaan, kita memulakan bas I2C menggunakan fungsi Wire.begin () . Jika tiada hujah diberikan dalam fungsi, Arduino akan bermula sebagai tuan.

Akhir sekali, kami menghantar watak x, iaitu antara 0 dan 5. Kami menggunakan fungsi berikut untuk
mulakan penghantaran ke peranti dengan alamat 9, tulis aksara, dan kemudian hentikan penghantaran:

 Wire.beginTransmission (9); // hantar ke peranti # 9 Wire.write (x); // menghantar x Wire.endTransmission (); // hentikan penghantaran 

Sekarang mari kita huraikan kod hamba Arduino . Kami juga termasuk perpustakaan Wire.h sini, tetapi sekarang kita memulakan bas I2C menggunakan Wire.begin (9) . Nombor dalam hujah adalah alamat yang kami mahu gunakan untuk Arduino. Semua peranti dengan alamat 9 akan menerima penghantaran.

Sekarang kita perlu bertindak entah bagaimana apabila kita menerima penghantaran I2C. Fungsi berikut menambah fungsi pencetus setiap kali watak diterima. Lebih baik berkata, apabila Arduino menerima watak pada I2C, ia akan menjalankan fungsi yang kami beritahu untuk menjalankannya:

 Wire.onReceive (receiveEvent); 

Dan ini adalah fungsi. Di sini, kami hanya menyimpan nilai watak yang diterima:

 void receiveEvent (int bytes) {x = Wire.read (); } 

Dalam gelung (), kita hanya menafsirkan watak itu untuk mengelap LED terbina dalam pada kelajuan yang berbeza bergantung kepada watak yang diterima.

Langkah 4: Lebih lanjut mengenai I2C

Untuk secara ringkas melalui teori, I2C memerlukan dua talian digital: Talian Serial Data ( SDA ) untuk memindahkan data dan Serial Clock Line ( SCL ) untuk menjaga jam. Setiap sambungan I2C boleh mempunyai satu tuan dan berbilang budak. Seorang tuan boleh menulis kepada hamba dan meminta hamba untuk memberi data, tetapi hamba tidak boleh menulis secara langsung kepada tuan atau hamba lain. Setiap hamba mempunyai alamat yang unik di dalam bas, dan tuan perlu mengetahui alamat hamba yang mereka mahu akses.

Setiap bas I2C boleh menyokong sehingga 112 peranti . Semua peranti perlu berkongsi GND . Kelajuan adalah sekitar 100 kb / s -not sangat cepat tetapi masih dihormati dan agak boleh digunakan. Ia mungkin mempunyai lebih daripada seorang tuan di atas bas, tetapi ia sangat rumit dan tidak dapat dielakkan.

Banyak sensor menggunakan I2C untuk berkomunikasi, biasanya Unit Pengukuran Inertial, Barometer,
sensor suhu, dan beberapa Sonars. Ingat bahawa I2C tidak direka untuk panjang kabel panjang . Bergantung pada jenis kabel yang digunakan, 2 meter mungkin sudah menimbulkan masalah.

I2C adalah protokol penghantaran rumit, tetapi ia sangat berguna. Semua Arduinos melaksanakannya, dengan beberapa perbezaan dalam pemetaan pin:

Papan I2C pin

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

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

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

Langkah 5: Menghubungkan Lebih Banyak Peranti

Jika kita perlu menyambung lebih daripada dua peranti pada bas I2C, kita hanya perlu menyambungkan semua SDA dan SCL bersama-sama. Kami akan memerlukan alamat setiap hamba untuk ditangani dari tuan Arduino.

Berikut adalah video pelaksanaan peribadi menggunakan 1 tuan dan 3 budak.

Lebih banyak topik mengenai komunikasi Arduino seperti Siri Tanpa Wayar, kad SD atau Ethernet boleh didapati di Buku Panduan Pembangunan Arduino saya yang terdapat di sini. : D

Artikel Berkaitan