Anda ingin menggunakan USB untuk komunikasi dengan komputer. Jika Anda memiliki sejumlah mikrokontroler, Anda mungkin hanya akan menghubungkan salah satu mikrokontroler secara langsung ke komputer. Mikrokontroler lain perlu mendapatkan perintah dari mikrokontroler utama.
Komunikasi yang Anda pilih akan tergantung pada sejumlah faktor:
- bandwidth yang diperlukan (kami akan menganggap Anda menjalankannya pada 16MHz)
- kompleksitas (pengkabelan dan pengkodean)
- dua arah, atau master-slave
Hampir semua opsi memiliki dukungan bawaan pada mikrokontroler AVR. Tidak ada opsi yang lebih Anda sukai daripada opsi bawaan yang membutuhkan perangkat keras tambahan. Karena mereka memiliki dukungan bawaan, kompleksitas perangkat lunaknya hampir sama, yaitu Anda hanya mengkonfigurasi port (menggunakan register), memasukkan data untuk dikirim dalam register lain, kemudian memicu transmisi dengan mengatur sedikit pada register lain. Setiap data yang diterima ditemukan di register lain, dan interupsi dipicu sehingga Anda dapat menanganinya. Opsi mana pun yang Anda pilih, satu-satunya perbedaan adalah perubahan lokasi register, dan beberapa perubahan pada register konfigurasi.
Loop USART memiliki fitur berikut:
- Laju baud maksimum CLK / 16 = 1MHz (pada clock 16MHz) yang merupakan laju transfer sekitar 90KB / s
- komunikasi dua arah sepenuhnya (tidak ada penunjukan master atau slave)
- membutuhkan kabel terpisah antara masing-masing pasangan mikrokontroler - Atmega32u4 mendukung dua port USART secara asli, membatasi jumlah mikrokontroler yang dapat Anda sambungkan dalam jaringan dalam praktiknya (atau Anda berakhir dengan rangkaian panjang mikrokontroler - mis. terhubung dalam daftar tertaut cara)
Catatan: ini juga yang akan Anda gunakan untuk mendapatkan komunikasi RS232, kecuali bahwa karena RS232 membutuhkan 10V, itu memerlukan driver untuk mendapatkan level tegangan tersebut. Untuk komunikasi antara mikrokontroler, ini tidak berguna (hanya level tegangan yang diubah).
RS485:
- Pada dasarnya, Anda menggunakan port USART dalam mode yang berbeda - tidak ada keuntungan dalam bandwidth, dan mungkin hanya menyederhanakan kabel sedikit, tetapi juga mempersulitnya. Ini tidak disarankan.
Antarmuka dua kawat:
Ini juga disebut sebagai I2C. Ini berarti bahwa semua perangkat berbagi dua kabel yang sama.
Anda membutuhkan resistor pull-up di kedua kabel
Ini lambat (karena resistor pull-up terbatas nilainya, dan ada peningkatan kapasitansi ketika jumlah perangkat meningkat, dan panjang kawat meningkat). Untuk mikrokontroler AVR ini, kecepatannya hingga 400 kHz - lebih lambat dari USART (tetapi kecepatan ini tergantung pada membatasi kapasitansi Anda). Alasannya adalah bahwa meskipun perangkat mendorong kabel data rendah, transisi sebaliknya dilakukan dengan membiarkan kabel melayang tinggi lagi (resistor pull-up).
Bahkan lebih lambat ketika Anda menganggap bahwa SEMUA komunikasi berbagi bandwidth terbatas yang sama. Karena semua komunikasi berbagi bandwidth terbatas yang sama, mungkin ada keterlambatan dalam komunikasi di mana data harus menunggu sampai jaringan menganggur sebelum dapat dikirim. Jika data lain terus-menerus dikirim, itu juga dapat memblokir data agar tidak pernah dikirim.
Itu bergantung pada protokol master-slave, di mana master alamat seorang budak, kemudian mengirimkan perintah / permintaan, dan budak itu membalas setelah itu. Hanya satu perangkat yang dapat berkomunikasi pada satu waktu, sehingga budak harus menunggu sampai master selesai.
Perangkat apa pun dapat bertindak sebagai master dan / atau budak, membuatnya cukup fleksibel.
SPI
Inilah yang akan saya rekomendasikan / gunakan untuk komunikasi umum antara mikrokontroler.
Ini adalah kecepatan tinggi - hingga CLK / 2 = 8MHz (untuk CLK pada 16MHz), menjadikannya metode tercepat. Ini dapat dicapai karena kabelnya terpisah hanya untuk jam.
MOSI, data MISO, dan kabel clock SCK dibagikan di seluruh jaringan, yang berarti kabelnya lebih sederhana.
Ini adalah format master-slave, tetapi perangkat apa pun bisa menjadi master dan / atau slave. Namun, karena komplikasi pilihan slave, untuk kabel bersama (dalam jaringan), Anda hanya boleh menggunakannya secara hierarkis (tidak seperti antarmuka dua-kawat). YAITU. jika Anda mengatur semua perangkat menjadi pohon, perangkat seharusnya hanya menjadi induk bagi anak-anaknya, dan hanya budak bagi orang tuanya. Itu berarti bahwa dalam mode slave, perangkat akan selalu memiliki master yang sama. Juga, untuk melakukan ini dengan benar, Anda perlu menambahkan resistor ke MISO / MOSI / SCK ke master hulu, sehingga jika perangkat berkomunikasi hilir (ketika tidak dipilih sebagai budak), komunikasi tidak akan mempengaruhi komunikasi di bagian lain dari jaringan (perhatikan jumlah level yang dapat Anda lakukan menggunakan resistor terbatas, lihat di bawah untuk solusi yang lebih baik menggunakan kedua port SPI).
Mikrokontroler AVR dapat secara otomatis tri-state sinyal MOSI ketika slave-terpilih, dan beralih ke mode slave (jika dalam master).
Meskipun mungkin membutuhkan jaringan hierarkis, sebagian besar jaringan dapat diatur dengan cara seperti pohon, jadi biasanya ini bukan batasan penting
Di atas dapat sedikit rileks, karena setiap mikrokontroler AVR mendukung dua port SPI yang terpisah, sehingga setiap perangkat dapat memiliki posisi yang berbeda di dua jaringan yang berbeda.
Karena itu, jika Anda memerlukan banyak level di hierarki / pohon Anda (lebih dari 2), solusi di atas menggunakan resistor terlalu rumit untuk bekerja. Dalam hal ini, Anda harus mengubah jaringan SPI antara setiap lapisan pohon. Ini berarti setiap perangkat akan terhubung ke anak-anaknya di satu jaringan SPI, dan orang tuanya di jaringan SPI lainnya. Meskipun itu berarti Anda hanya memiliki satu pohon koneksi, keuntungannya adalah perangkat dapat berkomunikasi dengan salah satu dari anak-anak dan orang tuanya pada saat yang sama dan Anda tidak memiliki resistor fiddly (selalu sulit untuk memilih nilai yang tepat) .
Karena memiliki kabel MOSI dan MISO yang terpisah, master dan slave dapat berkomunikasi pada saat yang sama, sehingga memberikan faktor potensial dua peningkatan kecepatan. Diperlukan pin tambahan untuk slave-select untuk setiap slave tambahan, tetapi ini bukan beban besar, bahkan 10 budak berbeda hanya membutuhkan 10 pin tambahan, yang dapat dengan mudah ditampung pada mikrokontroler AVR yang khas.
CAN tidak didukung oleh mikrokontroler AVR yang telah Anda tentukan. Karena ada pilihan lain yang baik, mungkin tidak penting dalam kasus ini.
Rekomendasi adalah SPI , karena cepat, kabel tidak terlalu rumit, dan tidak memerlukan resistor pull-up fiddly. Dalam kasus yang jarang terjadi di mana SPI tidak sepenuhnya memenuhi kebutuhan Anda (mungkin di jaringan yang lebih rumit), Anda dapat menggunakan beberapa opsi (mis. Gunakan kedua port SPI, bersama dengan antarmuka dua kawat, serta memasangkan beberapa mikrokontroler menggunakan loop USART!)
Dalam kasus Anda, menggunakan SPI berarti bahwa secara alami, mikrokontroler dengan koneksi USB ke komputer dapat menjadi master, dan itu hanya dapat meneruskan perintah yang relevan dari komputer ke setiap perangkat slave. Itu juga dapat membaca pembaruan / pengukuran dari setiap budak dan mengirimkannya ke komputer.
Pada 8MHz, dan panjang kawat 0,5m, saya tidak berpikir itu akan menjadi masalah. Tetapi jika ya, cobalah lebih berhati-hati terhadap kapasitansi (jaga agar kabel ground dan sinyal terlalu dekat, dan juga berhati-hati terhadap koneksi antara konduktor yang berbeda), dan juga pemutusan sinyal. Jika hal itu tetap menjadi masalah, Anda dapat mengurangi laju jam, tapi saya pikir itu tidak perlu.