banyak komunikasi arduino (1 master, n slave)

8

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?

nkint
sumber
Anda hanya ingin mengirim info yang persis sama ke semua budak? Apakah budak perlu merespons sama sekali?
Oli Glaser
tidak, mereka tidak perlu merespons!
nkint
seberapa jauh budaknya?
geometrikal
saya pikir tidak lebih dari 15 meter
nkint

Jawaban:

12

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.

masukkan deskripsi gambar di sini

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.

stevenvh
sumber
2
Klaim bahwa diperlukan beberapa UART atau logika eksternal tidak akurat. Komunikasi UART Bussed dilakukan setiap saat, menggunakan pengalamatan perangkat lunak. Dengan pengiriman dan penerimaan yang dibagikan, ini tidak memerlukan pin lebih dari I2C.
Chris Stratton
@ Chris - Poin bagus, saya akan memperbarui jawaban saya.
stevenvh
1
@capcom - Saya menambahkan diagram blok untuk SPI. MOSI adalah output untuk master, dan input untuk para budak. MISO adalah output untuk slave dan input untuk master. Ya, Anda membuat SS rendah untuk budak yang ingin Anda kirim data. SS tidak hanya berfungsi untuk menunjukkan awal dan akhir komunikasi, tetapi juga budak yang tidak dipilih harus membuat MISO-nya impedansi tinggi terhadap konflik bus.
stevenvh
2
@ nkint - 8 m akan memiliki kapasitansi sekitar 800 pF, dan I2C hanya memungkinkan 400 pF untuk mendapatkan kecepatan tepi yang diperlukan. Anda harus menggunakan extender bus seperti P82B715 , yang akan mendorong bus pada kabel hingga 50 m.
stevenvh
1
@stevenvh P82B715 berfungsi dengan baik dan sangat mudah dipasang!
nkint
5

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.

Oli Glaser
sumber
Anda benar, datanya berbeda untuk setiap budak. Saya disesatkan oleh nama fungsi "send_to_all", tetapi tampaknya menggunakan jalan berbeda untuk masing-masing (mereka diindeks). Saya menghapus jawaban pertama saya.
stevenvh
1

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.

Chris Stratton
sumber
1

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

Alexis Paques
sumber
0

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.

Stu
sumber