Komunikasi antar prosesor untuk lengan robot


13

Saya sedang membangun lengan robot 6-DOF hobi dan saya bertanya-tanya apa cara terbaik untuk berkomunikasi antara prosesor (3-4 AVR, pemisahan maksimum 18 inci). Saya ingin agar loop kontrol dijalankan di komputer, yang mengirimkan perintah ke mikroprosesor melalui USB-ke Atmega32u4 - ??? jembatan.

Beberapa ide yang saya pertimbangkan:

  1. RS485
    • Kelebihan: semua prosesor pada kabel yang sama, sinyal diferensial lebih kuat
    • Cons: memerlukan chip tambahan, perlu menulis (atau menemukan?) Protokol untuk mencegah prosesor mentransmisikan secara bersamaan
  2. Loop UART (yaitu, TX dari satu prosesor terhubung ke RX berikutnya)
    • Pro: firmware sederhana, prosesor memiliki UART bawaan
    • Cons: koneksi terakhir harus menempuh panjang robot, setiap prosesor harus menghabiskan siklus mengirimkan kembali pesan
  3. CANbus (Saya tahu sedikit tentang ini)

Pertimbangan utama saya adalah kompleksitas perangkat keras dan firmware, kinerja, dan harga (saya tidak bisa membeli sistem out-of-box yang mahal).

Jawaban:


13

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.


Acungan jempol untuk SPI dari saya
georgebrindeiro

2
Saya penggemar SPI juga, meskipun mungkin I2C juga layak dipertimbangkan (menghindari kebutuhan garis CS terpisah untuk setiap perangkat). Tapi BISA tidak boleh begitu mudah diberhentikan - setelah semua, itu adalah bus pilihan otomotif, jadi saya tidak akan mengesampingkannya untuk hobi robotika!
Andrew

Apakah bus SPI benar-benar membutuhkan jalur CS terpisah dari master ke masing-masing budak? Jika demikian, apa yang akan Anda sebut bus lain yang membutuhkan tepat 4 koneksi ke master, tidak peduli berapa banyak budak yang terhubung, yang disebutkan dalam artikel Wikipedia di bus SPI ?
David Cary

1
+1 Untuk respons yang besar, saya sudah tua dan saya suka 485 dan umumnya bus dengan alamat perangkat lunak, tetapi dalam hal ini, komponen kecepatan dan konsumsi sumber daya, saya akan memilih SPI. Meskipun Anda akan memiliki banyak perhatian pada jarak dan kebisingan listrik, terutama jika bus Anda coesisten IC lain, dengan kecepatan transmisi yang berbeda: kenangan, NIC, dll., Yang dapat mengalami kehilangan
warna

3
Komentar Anda pada CAN tidak akurat. CAN bukan sembarang bus 2-kawat. Saya pikir Anda bingung dengan I2C, yang memiliki kecepatan tertinggi 400kbps. Kecepatan tertinggi CAN adalah 1Mbps.
Rocketmagnet

5

Saya sangat merekomendasikan CAN untuk komunikasi antar prosesor. Kami menggunakannya dalam robot kami, dengan hingga 22 prosesor di bus yang sama. Dengan desain protokol yang baik, Anda dapat menggunakan hingga sekitar 90% dari bandwidth yang tersedia (sekitar 640kbps saat Anda memperhitungkan semua pengecekan kesalahan dan jarak antar bingkai). Kami dapat melakukan servo 10 motor pada 1000Hz pada satu bus CAN. Ini mendekati batas. Anda mungkin bisa memerasnya ke 20 motor jika Anda mengemas data dengan sangat hati-hati.

Umumnya BISA perlu memiliki satu chip transceiver untuk setiap prosesor (itu hanya perangkat 8-pin kecil). Transceiver memberi Anda sinyal diferensial yang bagus yang memancarkan sedikit gangguan, dan juga membuatnya kebal terhadap gangguan jika Anda bekerja di lingkungan yang berisik secara elektrik (motor, solenoida, dan pemancar radio).

BISA koneksi Bus

Namun, dalam keadaan terbatas, sebenarnya mungkin untuk menggunakan CAN tanpa transceiver .


Ethercat

Jika Anda pernah merasa ingin menerapkan bus dengan bandwidth serius, saya sarankan Anda mencoba EtherCAT . Ini adalah bus 100 MB, yang dapat dihubungkan ke port Ethernet PC Anda. Ada dua bagian penting ke bus:

  • Jembatan. Ini mengubah lapisan fisik Ethernet menjadi lapisan fisik LVDS yang lebih sederhana dan lebih murah, yang tidak memerlukan konektor besar, chip Phy, dan banyak komponen yang dilakukan Ethernet sendiri.
  • Simpul. Setiap node hanya membutuhkan satu chip ET1200 dan mikrokontroler.

PC dapat mengirim dan menerima potongan besar data ke dan dari node pada 1kHz atau lebih cepat. Anda dapat mengontrol banyak hal dalam satu bus EtherCAT.

Ditambahkan:

Shadow Robot Company sekarang menjual sistem Bus EtherCAT yang berguna yang disebut Ronex . Ini memungkinkan Anda menambahkan cukup banyak I / O, dan mereka akan segera memperkenalkan banyak jenis papan lainnya, seperti pengontrol motor, dan ADC berkualitas tinggi.


Apa sumber gambar itu? Ini memiliki CAN Highkabel merah dan biru.
Ian

1

Saya tahu saya sedang menggali utas lama dan ini adalah topik yang tidak umum, tetapi saya tidak berpikir Anda bisa mendapatkan chip ET1200 dari Beckhoff. Saya mengirim email kepada mereka beberapa saat yang lalu dan saya disarankan untuk bergabung dengan grup Ethercat. Untuk melakukan ini, saya harus menunjukkan bahwa saya akan berkontribusi kembali ke grup - yaitu, dengan membangun dan menjual perangkat yang menggunakan barang-barang Ethercat. Pada saat itu (dan ini), saya masih membuat prototipe perangkat saya (pengontrol motor brushless untuk aplikasi robot - saat ini menggunakan CAN) jadi saya tidak dapat menawarkan apa pun (saya tidak bisa memberikan waktu yang solid untuk penyelesaian - Saya masih bekerja pada perangkat saya sarjana). Saya menyatakan kepada mereka kekecewaan saya. Mereka bilang jangan kecewa !! Hal-hal yang cukup lucu! Saya akan benar - benaringin masuk ke Ethercat, tetapi ASIC tampaknya tidak tersentuh oleh penggemar atau mereka yang tidak memiliki perusahaan. Juga, ini adalah posting pertama saya, jadi minta maaf jika saya membuat marah para dewa dengan menggali posting lama!


Selamat datang. Menghidupkan kembali posting lama tidak masalah, jika jawabannya relevan. Dan komentar Anda sepertinya relevan bagi saya ...
Andrew

Terima kasih sobat. Ini adalah forum yang hebat! Karena ketertarikan, apakah Anda memiliki pengalaman dengan Ethercat? Apakah Anda mengetahui metode lain untuk mendapatkan perangkat budak yang cocok untuk membuat prototipe pada PCB? Saya bersedia membayar, tetapi saat ini saya tidak memenuhi persyaratan untuk bergabung dengan grup untuk membeli Bechoff ASIC. Frustrasi!
undang

Bukan EtherCat, tidak. Saya menggunakan CAN (opsi yang baik), LIN (IMHO tidak begitu baik) dan tentu saja dapat merekomendasikan SPI atau I2C
Andrew

Apakah Anda berhasil mendapatkan chip ET1100 atau ET1200? Jika Anda tidak ada pilihan lain yang tersedia sekarang: microchip LAN9252, ini kompatibel dengan ET1100 dan berfungsi dengan cukup baik. Gunakan perpustakaan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.