Как заставить Arduino взаимодействовать с тремя другими Ардуино?

Мне было интересно, как заставить 4 Arduino в общей сложности общаться друг с другом через проводное соединение. Цель состоит в том, чтобы главный Arduino отправлял число от 0 до 100 каждому из остальных Arduino.

Главным устройством будет Arduino Uno, а остальные 3 Arduino — Arduino Pro Mini.

, 👍3

Обсуждение

Есть много способов. Вам нужно будет более конкретно сформулировать свои требования., @Ignacio Vazquez-Abrams

как организовать беспроводную связь между несколькими Arduino?, @SHAUKAT ALI KHAN

@SHAUKATALIKHAN поиск NRF24L01 с помощью радионики, @Suit Boy Apps


5 ответов


Лучший ответ:

3

Вы можете использовать: U(S)ART, I²C или SPI. Вам следует проверить этот пост для получения информации об этих протоколах.

Быстрый поиск в Google дал мне следующее:

  • SPI: в основном для высоких скоростей передачи данных, тактовая частота около 25 МГц, но только шина должна иметь одинаковый уровень напряжения, одно ведущее устройство (можно реализовать с помощью программного обеспечения), арбитраж данных невозможен.
  • I2C: в основном для управления и передачи небольших объемов данных (ограничено емкостью шины и т. д.), но может быть подключен к различным уровням напряжения и среде шины с несколькими ведущими устройствами, встроенным арбитражем и т. д.
  • UART: одинарный P2P-коммуникационный порт, макс. 115 кбит/с.

http://www.edaboard.com/thread53139.ht ml

Я не совсем с этим согласен. Вы можете отправлять данные через UART на несколько устройств, но тогда вам придется заниматься адресацией в программном обеспечении. Но в остальном UART очень легко отлаживать, поскольку Arduino часто имеют USB-подключение.

"I²C довольно сложен на физическом уровне, но все эти сложности обрабатываются аппаратно (интерфейс TWI чипов AVR). На уровне пользователя он может быть самым простым в использовании". У меня пока нет большого опыта работы с этим протоколом, но если вы хотите его использовать, посмотрите другой ответ.

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

Резюме:

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

Затем попробуйте выбрать, какой из них больше всего подходит для ваших нужд, и начните с этого протокола. Они хорошо документированы, и если вы действительно не можете от него отказаться, вы можете задать другой вопрос ;D

,

2

Вы можете использовать протокол связи I2C через библиотеку wire.h. Это позволит вам использовать arduino uno как ведущее устройство, а pro minis как ведомое. Вкратце, вы используете два провода, подключенных к контактам SDA и SCL всех плат Arduino, а затем ведущее устройство для взаимодействия (то есть запроса данных и отправки данных) с ведомыми устройствами использует их адрес (который определяется пользователем в программном обеспечении ведомого устройства). Таким образом, обычная процедура в I2C выглядит следующим образом:

  1. Мастер отправляет адрес и инструкцию чтения и записи по шине.
  2. Все платы Arduino слушают, и если адрес совпадает с их внутренним адресом, они выполняют инструкцию.
  3. Если это команда записи от ведущего устройства, ведомые устройства готовятся к приему. Если это команда чтения от ведущего устройства, ведущее устройство ждет, пока ведомое устройство не отправит байт.

Более подробную информацию можно найти здесь:

Двухпроводная связь Arduino

I2C официальная таблица данных

,

2

Вы можете использовать соединение RS-485 между всеми arduino, используя последовательный порт всех. Для полудуплексного соединения для 4 arduino настройка может быть такой:

Что вам нужно:

  • 4 драйвера линии RS-485 (типа max485). По одному на каждую arduino
  • если расстояние между ардуинами небольшое (менее 1 м), то этого будет достаточно
  • Если расстояние между ардуинами большое (более 2 м), вам понадобится использовать между ними витую пару не менее 24 AWG и 2 резистора по 120 Ом. Эти резисторы будут терминаторами линии.
  • Вы можете проверить спецификацию max485, чтобы узнать, как их подключить

Настройка:

Чтобы использовать rs485 с arduino и полудуплексом, вам понадобятся 3 контакта. 2 контакта для rx и tx. 1 контакт для разрешения передачи. В полудуплексном режиме обычно все узлы находятся в режиме прослушивания. Чтобы настроить разрешение передачи, соедините контакты "разрешение привода" и "разрешение приема" драйвера rs485 вместе. Это будет наш контакт "разрешение передачи".

Подключение:

      |        |
c  RX |------->|RO     4
p  TX |------->|DI     8
u D13 |------->|TE&RE^ 5
      |        |

Программное обеспечение:

Загрузите эту библиотеку (Mertbus). Эта библиотека реализует базовый транспортный уровень. Она находится в стадии альфа, но функциональна. В ней есть пример кода, а также библиотека .net.

Логика похожа на TCP/IP. Дайте каждому узлу адрес от 0 до 126. 127 — это широковещательный идентификатор. Это означает, что если вы отправите данные на идентификатор 127, все узлы их получат. Если вы отправите данные только на один узел (например, 2 ...), их получит только целевой узел.

Пример:

#include "MertBus.h" //включить заголовок

#define TXEN 13  //контакт включения передачи
#define SELF_ID 1  //id этого узла

MertBus mb;  //класс коммуникатора

void setup() {
   Serial.begin(57600); //подготавливаем последовательный порт как обычно
   Serial.println("Begin init");
   //затем инициализируем экземпляр mertbus с портом, пином и идентификатором
   mb = MertBus(Serial,TXEN,SELF_ID); 
}

void loop() {
  if(mb.checkData()) {    //проверить, получены ли действительные данные
    // ответ отправителю char[] и длина, 26 символов
    mb.reply("Incoming Data (SendData): ",26); 
    // ответ отправителю полученных данных
    mb.reply(mb.Buffer,mb.ReceiveCount);
  } else {
    digitalWrite(13,HIGH);
    delay(400);
    digitalWrite(13,LOW);
    delay(400);
  }
}

Быть мастером, отправлять данные (не отвечая на сообщение, а начиная новое):

//буферизует данные для отправки, to_addr — адрес целевого узла
//buffer_size — размер отправляемых данных.
mb.sendData(char * buffer, uint8_t to_addr, uint8_t buffer_size)
,

2

Если они достаточно близки друг к другу, то самым простым способом будет использовать последовательную связь, поскольку вы говорите, что хотите отправить номер (но не упоминаете, что получаете что-либо).

Вы можете подключить вывод Tx на главном Arduino к выводу Rx всех остальных Arduino (плюс заземление, конечно). Затем отправляйте свои числа в свое удовольствие. Я предлагаю какой-то протокол вроде:

(42)

Где открывающиеся и закрывающиеся скобки указывают приемнику, где начинается и заканчивается номер. Если расстояние больше (скажем) 5 метров, на каждом конце может потребоваться приемопередатчик RS485, например.

RS485-подключения

Описание подобных вещей есть на моей странице коммуникаций RS485.

Вы можете «отключить» несколько трансиверов от одной и той же пары кабелей.

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

Эти трансиверы могут передавать или принимать, но не одновременно. В вашем случае у вас будет ведущий с активным Tx Enable, а у ведомых Tx Enable неактивен.

Если чипы сбрасываются с длинного кабеля, вам следует установить согласующий резистор между A и /B на конце (например, 120 Ом).

SPI может быть в порядке, но он действительно предназначен для коротких пробегов. I2C тоже может быть в порядке, но может быть излишне сложным. Однако, если вы используете I2C, у него есть режим «широковещания», который может подойти для отправки одного и того же на несколько устройств.


Ссылки

  • Связь RS485
  • RS485 — Википедия
  • I2C (провод)
  • ИПИ
  • Асинхронный последовательный
,

1

PJON — это немного замороченный последовательный протокол шины для нескольких узлов. Он может оказаться вам полезным.

PJON™ (Padded Jittering Operationative Network) — это совместимая с Arduino, многомастерная, мультимедийная коммуникационная шинная система. Она предлагает Стандарт, он разработан как фреймворк и реализует полностью Программно эмулируемый стек сетевых протоколов, который можно легко кросс-компилирован на многих архитектурах, таких как ATtiny, ATmega, ESP8266, Teensy, Raspberry Pi, Linux и Windows x86 машины. Это допустимый инструмент для быстрого и понятного построения сети устройств

,