giao tiếp nhiều arduino (1 chủ, n nô)


8

Tôi muốn phát triển một mạng lưới chủ / nô lệ bao gồm:

  • 1 Master Arduino đọc các cảm biến và tạo ra các cấu hình đường dốc vận tốc dựa trên các tín hiệu cảm biến và sau đó gửi các đường dốc đó đến các nô lệ

  • 3 (hoặc nhiều hơn) Các nô lệ Arduino điều khiển vận tốc của động cơ servo 12 V theo các đường dốc được gửi bởi chủ

Một giao thức truyền thông tốt để đạt được điều này là gì? Nối tiếp (SPI)? I2C? Thứ gì khác? Nếu nó là nối tiếp, Arduino Leonardo mới là một lựa chọn tốt? Những vấn đề tôi nên xem xét trong việc lựa chọn một giao thức?

Tôi đang tưởng tượng một cái gì đó như:

Bậc thầy:

void loop() {
    update_ramps()
    for(int i=0; i< num_slaves; i++) {
        send_to_all(i, ramps[i]);
    }
}

Nô lệ 1:

const int id = 1;
int recived_id, recived_value;
void loop() {
    read_data();
    if(recived_id == id) { 
        do_motor_step(recived_value);
    }
}

Và giao tiếp nối tiếp trong đó RX / TX từ chủ được gửi đến tất cả các nô lệ.

Điều này có vẻ như là một giải pháp hợp lý?


Bạn chỉ muốn gửi chính xác cùng một thông tin cho tất cả nô lệ? Các nô lệ có cần phải đáp ứng gì không?
Oli Glaser

không, họ không cần phải trả lời!
nkint

nô lệ sẽ đi bao xa?
geometrikal

tôi nghĩ không quá 15 mét
nkint

Câu trả lời:


12

Theo tôi hiểu, bạn muốn gửi dữ liệu khác nhau đến từng nô lệ, nhưng nô lệ không phải gửi lại dữ liệu.

I2C là một xe buýt có địa chỉ, vì vậy nếu bạn chỉ định một địa chỉ I2C khác nhau cho mỗi nô lệ, bạn sẽ chỉ cần hai dây để gửi dữ liệu. Nếu cần bạn có thể yêu cầu dữ liệu trở lại là tốt. Các AVR của Arduino có một bus nối tiếp tương thích I2C. Và bạn có thể mở rộng tới hơn 3 nô lệ mà không cần thêm phần cứng, tối đa là 127.

Các UART không có địa chỉ, vì vậy bạn sẽ cần 3 UART (mà AVR không có) hoặc thêm logic bên ngoài để chuyển giữa các dòng UART (tốn tiền). Mỗi nô lệ bổ sung có nghĩa là chi phí thêm. Không được khuyến khích.
chỉnh sửa
Giống như Chris nói rằng bạn có thể sử dụng UART để tạo một xe buýt đa chiều. Và sau đó bạn sẽ phải thêm địa chỉ, điều này làm cho UART của bạn hoạt động giống như I2C, nhưng sau đó không đồng bộ và không có phần cứng phù hợp với địa chỉ như I2C có. Vì vậy, vẫn không thực sự là một lợi thế. kết thúc chỉnh sửa

×

nhập mô tả hình ảnh ở đây

Tôi nghĩ rằng I2C là giải pháp tốt nhất, đòi hỏi số lượng dây ít nhất. Giao thức phức tạp hơn một chút so với UART hoặc SPI, nhưng vì AVR có phần cứng cho nó, nên nó dễ sử dụng.


2
Khiếu nại rằng nhiều UART hoặc logic bên ngoài sẽ được yêu cầu là không chính xác. Giao tiếp UART được thực hiện mọi lúc, sử dụng địa chỉ phần mềm. Với truyền và nhận được chia sẻ, điều này không đòi hỏi nhiều chân hơn I2C.
Chris Stratton

@Chris - Điểm tốt, tôi sẽ cập nhật câu trả lời của tôi.
stevenvh

1
@capcom - Tôi đã thêm một sơ đồ khối cho SPI. MOSI là đầu ra cho chủ và đầu vào cho các nô lệ. MISO là đầu ra cho nô lệ và đầu vào cho chủ. Có, bạn đặt SS ở mức thấp cho nô lệ bạn muốn gửi dữ liệu. SS không chỉ phục vụ để chỉ ra sự bắt đầu và kết thúc giao tiếp, mà còn là một nô lệ không được chọn sẽ khiến MISO trở ngại cao đối với các xung đột xe buýt.
stevenvh

2
@nkint - 8 m sẽ có điện dung khoảng 800 pF và I2C chỉ cho phép 400 pF để có được tốc độ cạnh cần thiết. Bạn sẽ phải sử dụng một bộ mở rộng xe buýt như P82B715 , nó sẽ lái xe buýt trên 50 m cáp.
stevenvh

1
@stevenvh P82B715 hoạt động rất tốt và thật dễ dàng để cắm!
nkint

5

Tôi giả sử nối tiếp bạn có nghĩa là UART? Lưu ý rằng UART, SPI, I2C đều là các giao thức nối tiếp.

SPI hoặc I2C sẽ ổn cho việc này vì cả hai đều sử dụng kiến ​​trúc chính / phụ.
Không bao gồm mặt đất, đối với 3 nô lệ, SPI sẽ yêu cầu 6 chân (MOSI, MISO, CLK + 3 SS) và I2C chỉ cần hai (SDA và SCK)
Tôi có thể chọn I2C, giả sử bạn không cần truyền dữ liệu rất cao tốc độ (<400kHz)

Bạn càng thêm nhiều nô lệ, SPI càng ít thuận tiện, vì bạn cần một SS (chọn nô lệ) khác cho mỗi nô lệ mới. Với I2C, đây không phải là vấn đề vì địa chỉ là một phần của giao thức, vì vậy bạn vẫn chỉ cần 2 dòng (cộng với mặt đất).

Đối với Arduino, cần có một loạt các hướng dẫn với các thư viện I2C / SPI và mã ví dụ cho cả hai điều trên, điều này sẽ khiến cho việc chạy lên và chạy khá khó khăn.


Bạn nói đúng, dữ liệu là khác nhau cho mỗi nô lệ. Tôi đã bị nhầm lẫn bởi tên của hàm "send_to_all", nhưng dường như nó sử dụng một đoạn đường nối khác nhau cho mỗi (chúng được lập chỉ mục). Tôi đã xóa câu trả lời đầu tiên của tôi.
stevenvh

1

Cũng có thể chia sẻ các sơ đồ báo hiệu không đồng bộ tương tự như RS485.

Nếu bạn không sử dụng trình điều khiển / bộ thu (chỉ các chân ATMEGA trần), bạn phải đặt UART TX làm đầu vào khi không đến lượt bạn nói chuyện. Nếu bạn đang sử dụng trình điều khiển đường truyền, bạn cần sử dụng một mã pin bổ sung để điều khiển kích hoạt đường xoắn trên trình điều khiển đường dây khi đến lượt bạn không nói chuyện.

Ngoài ra, hãy cẩn thận rằng bạn không thể chỉ phân phối máy phát khi byte cuối cùng được chấp nhận vào thanh ghi truyền (điểm khi bạn có thể gửi một ký tự khác), thay vào đó, bạn phải đảm bảo giữ cho trình phát hoặc trình điều khiển đường truyền được bật cho đến khi từ đó được bật chuyển hoàn toàn ra ngoài.

Trong các sơ đồ mà bạn truyền và nhận trên cùng một dây (hoặc cặp vi sai) có tính đến việc bạn sẽ nghe thấy các truyền của chính mình.


1

Trong trường hợp đặc biệt bạn muốn kết nối qua UART , bạn có thể sử dụng UART RS485 MODBUS . Đây là một giao thức truyền thông với các địa chỉ phần mềm, chức năng, tổng kiểm tra.

Tôi nghĩ : Nó đáng tin cậy hơn I²C hoặc SPI do RS-485 và sử dụng ít dây hơn SPI.

LƯU Ý: Nó có thể được triển khai theo tiêu chuẩn, với một số thư viện nhưng nó có thể tốn kém vì bạn cần một mô-đun RS485 cho mọi nô lệ và một cho chủ, NHƯNG nó tương thích với một mạng hiện có. Nhưng bạn có thể làm điều đó ít tốn kém hơn bằng cách sử dụng các thành phần kế thừa và tạo ra thiết bị của riêng bạn. Các MAX 485 có thể là thành phần cơ bản để thực hiện một xe buýt Phần cứng 485 hoặc bằng cách sử dụng một RS485 phần mềm


0

Giải pháp đơn giản nhất cho các yêu cầu cụ thể sẽ là máy phát RS-422 trên đường TX trên thiết bị chính (Bộ điều khiển Bus) Điều này sẽ phát ra cho nhiều máy thu (Thiết bị đầu cuối từ xa).

Tất cả các RT sẽ nghe các tin nhắn quảng bá nhưng sẽ chỉ xác thực và thực thi các lệnh được hướng đến nó thông qua địa chỉ RT.

Nếu một giao thức bus tương tự như 1553 được sử dụng, nó sẽ dễ thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.