Saya ingin mengembangkan jaringan master / slave yang terdiri dari:
1 Arduino master yang membaca sensor dan menghasilkan profil ramp kecepatan berdasarkan sinyal sensor dan kemudian mengirim landai ke budak
3 (atau lebih) budak Arduino yang mengendalikan kecepatan motor servo 12V mengikuti jalur landai yang dikirim oleh master
Apa protokol komunikasi yang baik untuk mencapai ini? Serial (SPI)? I2C? Sesuatu yang lain Jika serial, apakah Arduino Leonardo yang baru merupakan pilihan yang baik? Masalah apa yang harus saya pertimbangkan dalam memilih protokol?
Saya membayangkan sesuatu seperti:
Menguasai:
void loop() {
update_ramps()
for(int i=0; i< num_slaves; i++) {
send_to_all(i, ramps[i]);
}
}
Budak 1:
const int id = 1;
int recived_id, recived_value;
void loop() {
read_data();
if(recived_id == id) {
do_motor_step(recived_value);
}
}
Dan komunikasi serial di mana RX / TX dari master dikirim ke semua budak.
Apakah ini tampak seperti solusi yang masuk akal?
Jawaban:
Seperti yang saya pahami, Anda ingin mengirim data yang berbeda ke masing-masing budak, tetapi budak tidak harus mengirim data kembali.
I2C adalah bus yang ditujukan, jadi jika Anda menetapkan alamat I2C yang berbeda untuk masing-masing budak, Anda hanya perlu dua kabel untuk mengirim data. Jika perlu, Anda dapat meminta data kembali juga. AVR Arduino memiliki bus serial yang kompatibel dengan I2C. Dan Anda dapat memperluas hingga lebih dari 3 budak tanpa perangkat keras tambahan, hingga maksimum 127.
UART tidak memiliki pengalamatan, sehingga Anda akan membutuhkan 3 UART (yang tidak dimiliki AVR), atau menambahkan logika eksternal untuk beralih di antara jalur UART (yang membutuhkan biaya). Setiap budak tambahan berarti biaya tambahan. Tidak direkomendasikan.
sunting
Seperti yang dikatakan Chris, Anda dapat menggunakan UART untuk membuat bus multidrop. Dan kemudian Anda harus menambahkan pengalamatan, yang membuat UART Anda bekerja sedikit seperti I2C, tetapi kemudian tidak sinkron, dan tanpa perangkat keras pencocokan alamat seperti yang dimiliki I2C. Jadi masih belum terlalu menguntungkan. akhir suntingan
SPI juga menggunakan jalur bersama untuk data: satu MOSI, dan jalur MISO terhubung. Untuk mengatasi setiap budak secara terpisah, Anda memerlukan satu baris SS (Slave Select) per slave. Jadi itu setidaknya 5 I / Os: MOSI, SCK, 3× SS, dan MISO jika Anda juga ingin membaca data dari para budak. Setiap budak tambahan menambahkan 1 I / O pin pada master.
Saya pikir I2C adalah solusi terbaik, membutuhkan paling sedikit kabel. Protokolnya sedikit lebih kompleks daripada UART atau SPI, tetapi karena AVR memiliki perangkat keras untuknya, protokol ini harus mudah digunakan.
sumber
Saya mengasumsikan dengan serial yang Anda maksud UART? Perhatikan bahwa UART, SPI, I2C adalah semua protokol serial.
SPI atau I2C akan baik-baik saja karena keduanya menggunakan arsitektur master / slave.
Tidak termasuk ground, untuk 3 budak, SPI akan membutuhkan 6 pin (MOSI, MISO, CLK + 3 pin SS) dan I2C hanya dua (SDA dan SCK)
Saya mungkin akan memilih I2C, dengan asumsi Anda tidak perlu transfer data yang sangat tinggi tarif (<400kHz)
Semakin banyak budak yang Anda tambahkan, semakin tidak nyaman SPI, karena Anda memerlukan SS (pilih budak) lainnya untuk setiap budak baru. Dengan I2C, ini bukan masalah karena pengalamatan adalah bagian dari protokol, jadi Anda masih hanya perlu 2 baris (plus ground).
Untuk Arduino, harus ada sederetan tutorial dengan pustaka I2C / SPI dan contoh kode di luar sana untuk kedua hal di atas, yang seharusnya cukup menyakitkan untuk bangun dan berjalan.
sumber
Skema pensinyalan asinkron bersama yang serupa dengan RS485 juga harus dimungkinkan.
Jika Anda tidak menggunakan driver garis / penerima (hanya pin ATMEGA telanjang) Anda harus menjadikan UART TX sebagai input saat giliran Anda tidak berbicara. Jika Anda menggunakan driver baris, Anda perlu menggunakan pin tambahan untuk mengontrol mengaktifkan tristate pada driver line ketika itu bukan giliran Anda untuk berbicara.
Berhati-hatilah juga bahwa Anda tidak dapat hanya mengatur pemancar ketika byte terakhir diterima ke register pemancar (titik di mana Anda dapat mengirim karakter lain), sebagai gantinya, Anda harus memastikan untuk mengaktifkan pemancar atau driver garis hingga kata tersebut telah diaktifkan sepenuhnya bergeser keluar.
Dalam skema di mana Anda mengirim dan menerima pada kabel yang sama (atau pasangan diferensial) memperhitungkan bahwa Anda akan mendengar transmisi Anda sendiri.
sumber
Pada kasus khusus yang ingin Anda hubungkan melalui UART , Anda dapat menggunakan UART RS485 MODBUS . Ini adalah protokol komunikasi dengan alamat perangkat lunak, fungsi, checksum.
KUPIKIR : Ini lebih dapat diandalkan daripada I²C atau SPI karena RS-485 dan menggunakan kabel lebih sedikit daripada SPI.
CATATAN: Ini dapat diimplementasikan sebagai standar, dengan beberapa perpustakaan tetapi bisa mahal karena Anda memerlukan modul RS485 untuk setiap budak dan satu untuk master, TETAPI itu kompatibel dengan jaringan yang ada. Tetapi Anda dapat melakukannya dengan lebih murah dengan menggunakan komponen lawas dan membuat perangkat Anda sendiri. The MAX 485 bisa menjadi komponen dasar untuk membuat Hardware 485 bus atau dengan menggunakan RS485 software
sumber
Solusi paling sederhana untuk persyaratan spesifik adalah pemancar RS-422 pada saluran TX pada master (Pengendali Bus) Ini akan menyebar ke beberapa penerima (Terminal Jarak Jauh).
Semua RT akan mendengar pesan siaran tetapi hanya akan mengotentikasi & menjalankan perintah yang diarahkan kepadanya melalui alamat RT.
Jika protokol bus yang mirip dengan 1553 digunakan, akan mudah diimplementasikan.
sumber