многократная связь Arduino (1 ведущий, n ведомых)


8

Я хотел бы разработать сеть master / slave, которая состоит из:

  • 1 Arduino master, который считывает датчики и генерирует профили линейного изменения скорости на основе сигналов датчиков, а затем отправляет эти линейные изменения ведомым

  • 3 (или более) подчиненных Arduino, которые управляют скоростью серводвигателей 12 В в соответствии с рампами, отправленными мастером

Что такое хороший протокол связи для достижения этой цели? Серийный (SPI)? I2C? Что-то другое? Если это серийный, новый Arduino Leonardo - хороший выбор? Какие вопросы я должен учитывать при выборе протокола?

Я представляю что-то вроде:

Мастер:

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

Раб 1:

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

И последовательная связь, в которой RX / TX от ведущего отправляется всем ведомым.

Это кажется разумным решением?


Вы просто хотите отправить точно такую ​​же информацию всем рабам? Должны ли рабы отвечать вообще?
Оли Глейзер

нет, им не нужно отвечать!
nkint

как далеко будут рабы?
Геометрический

я думаю, не более 15 метров
nkint

Ответы:


12

Насколько я понимаю, вы хотите отправить разные данные каждому из ведомых, но ведомые не должны отправлять данные обратно.

I2C - это адресная шина, поэтому, если вы назначите разные адреса I2C для каждого из ведомых устройств, вам потребуется только два провода для отправки данных. При необходимости вы также можете запросить данные. AVR Arduino имеют последовательную шину, совместимую с I2C. И вы можете расширить до 3 рабов без дополнительного оборудования, максимум до 127.

У UART нет адресации, поэтому вам потребуется либо 3 UART (которых нет у AVR), либо добавить внешнюю логику для переключения между линиями UART (что стоит денег). Каждый дополнительный раб означает дополнительные расходы. Не рекомендуется.
Править
Как говорит Крис, вы можете использовать UART для создания многоточечной шины. И тогда вам придется добавить адресацию, которая делает ваш UART немного похожим на I2C, но затем асинхронным и без аппаратного согласования адресов, как у I2C. Так что до сих пор не совсем преимущество. конец редактирования

SPI также использует общие линии для данных: один MOSI и соединенные линии MISO. Для индивидуальной адресации каждого ведомого вам понадобится одна линия SS (выбор ведомого) на каждое ведомое. Так что это как минимум 5 входов / выходов: MOSI, SCK, 3×SS и MISO, если вы также хотите читать данные от рабов. Каждый дополнительный ведомый добавляет 1 I / O pin на ведущем устройстве.

введите описание изображения здесь

Я думаю, что I2C - лучшее решение, требующее наименьшего количества проводов. Протокол немного сложнее, чем UART или SPI, но, поскольку AVR имеет аппаратное обеспечение для него, он должен быть простым в использовании.


2
Утверждение, что потребуется несколько UART или внешней логики, не является точным. Шинная связь UART осуществляется постоянно с использованием программной адресации. При совместной передаче и приеме для этого требуется не больше контактов, чем в I2C.
Крис Страттон

@ Крис - Хорошо, я обновлю свой ответ.
Стивенв

1
@capcom - я добавил блок-схему для SPI. MOSI - это выход для мастера и вход для рабов. MISO - это выход для ведомых и вход для ведущего. Да, вы устанавливаете низкий уровень SS для ведомого, которому вы хотите отправить данные. SS не только служит для указания начала и конца связи, но и невыбранный ведомый должен сделать свой MISO высокоимпедансным для возникновения конфликтов шины.
Stevenvh

2
@nkint - емкость 8 м будет составлять около 800 пФ, а I2C позволяет только 400 пФ получить необходимую граничную скорость. Вам придется использовать удлинитель шины, такой как P82B715 , который будет приводить шину до 50 м кабеля.
Стивенвх

1
@ Stevenvh P82B715 прекрасно работает, и его действительно легко подключить!
nkint

5

Я предполагаю, что под серийным номером вы имеете в виду UART? Обратите внимание, что UART, SPI, I2C являются последовательными протоколами.

SPI или I2C подойдут для этого, так как они оба используют архитектуру master / slave.
Не включая заземление, для 3 подчиненных устройств SPI потребуется 6 контактов (MOSI, MISO, CLK + 3 контакта SS) и I2C всего два (SDA и SCK).
Я бы, вероятно, выбрал I2C, предполагая, что вам не требуется очень высокая скорость передачи данных. скорости (<400 кГц)

Чем больше ведомых вы добавляете, тем менее удобен SPI, так как вам нужен еще один SS (выбор ведомого) для каждого нового ведомого. С I2C это не проблема, так как адресация является частью протокола, поэтому вам все еще нужны только 2 линии (плюс земля).

Для Arduino должен быть целый ряд учебных пособий с библиотеками I2C / SPI и пример кода для обоих вышеперечисленных, что должно сделать его довольно безболезненным при запуске и запуске.


Вы правы, данные разные для каждого раба. Я был введен в заблуждение названием функции "send_to_all", но, похоже, для каждого используется своя рампа (они проиндексированы). Я удалил свой первый ответ.
Стивенв

1

Совместно используемые схемы асинхронной сигнализации, аналогичные RS485, также должны быть возможны.

Если вы не используете линейные драйверы / приемники (только голые контакты ATMEGA), вы должны сделать UART TX входом, когда не ваша очередь говорить. Если вы используете линейные драйверы, вам нужно использовать дополнительный контакт для управления включением трех состояний в линейном драйвере, когда не ваша очередь говорить.

Также имейте в виду, что вы не можете просто включить передатчик, когда последний байт принят в регистр передачи (момент, когда вы можете отправить другой символ), вместо этого вы должны убедиться, что драйвер передатчика или линейный драйвер включен, пока слово не будет полностью сдвинут.

В схемах, где вы передаете и принимаете по одному и тому же проводу (или дифференциальной паре), учитывайте, что вы услышите свои собственные передачи.


1

В особом случае, если вы хотите подключиться через UART , вы можете использовать UART RS485 MODBUS . Это протокол связи с адресами программного обеспечения, функцией, контрольной суммой.

Я ДУМАЮ : Это более надежно, чем I²C или SPI благодаря RS-485 и использует меньше проводов, чем SPI.

ПРИМЕЧАНИЕ. Он может быть реализован в качестве стандарта с некоторыми библиотеками, но может быть дорогостоящим, поскольку вам нужен модуль RS485 для каждого ведомого и один для ведущего, НО он совместим с существующей сетью. Но вы можете сделать это дешевле, используя устаревшие компоненты и создавая собственное устройство. MAX 485 может быть базовый компонент , чтобы сделать шину Аппаратные средства 485 или с помощью программного обеспечения RS485


0

Простейшим решением для конкретных требований был бы передатчик RS-422 на линии TX на ведущем устройстве (контроллер шины). Это позволило бы разветвить несколько приемников (удаленные терминалы).

Все RT будут слышать широковещательные сообщения, но будут аутентифицировать и выполнять только те команды, которые адресованы ему через адрес RT.

Если бы использовался протокол шины, подобный 1553, его было бы легко реализовать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.