Как заставить Arduino взаимодействовать с тремя другими Ардуино?
Мне было интересно, как заставить 4 Arduino в общей сложности общаться друг с другом через проводное соединение. Цель состоит в том, чтобы главный Arduino отправлял число от 0 до 100 каждому из остальных Arduino.
Главным устройством будет Arduino Uno, а остальные 3 Arduino — Arduino Pro Mini.
@Suit Boy Apps, 👍3
Обсуждение5 ответов
Лучший ответ:
Вы можете использовать: 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
Вы можете использовать протокол связи I2C через библиотеку wire.h. Это позволит вам использовать arduino uno как ведущее устройство, а pro minis как ведомое. Вкратце, вы используете два провода, подключенных к контактам SDA и SCL всех плат Arduino, а затем ведущее устройство для взаимодействия (то есть запроса данных и отправки данных) с ведомыми устройствами использует их адрес (который определяется пользователем в программном обеспечении ведомого устройства). Таким образом, обычная процедура в I2C выглядит следующим образом:
- Мастер отправляет адрес и инструкцию чтения и записи по шине.
- Все платы Arduino слушают, и если адрес совпадает с их внутренним адресом, они выполняют инструкцию.
- Если это команда записи от ведущего устройства, ведомые устройства готовятся к приему. Если это команда чтения от ведущего устройства, ведущее устройство ждет, пока ведомое устройство не отправит байт.
Более подробную информацию можно найти здесь:
Двухпроводная связь Arduino
I2C официальная таблица данных
Вы можете использовать соединение 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)
Если они достаточно близки друг к другу, то самым простым способом будет использовать последовательную связь, поскольку вы говорите, что хотите отправить номер (но не упоминаете, что получаете что-либо).
Вы можете подключить вывод Tx на главном Arduino к выводу Rx всех остальных Arduino (плюс заземление, конечно). Затем отправляйте свои числа в свое удовольствие. Я предлагаю какой-то протокол вроде:
(42)
Где открывающиеся и закрывающиеся скобки указывают приемнику, где начинается и заканчивается номер. Если расстояние больше (скажем) 5 метров, на каждом конце может потребоваться приемопередатчик RS485, например.
Описание подобных вещей есть на моей странице коммуникаций RS485.
Вы можете «отключить» несколько трансиверов от одной и той же пары кабелей.
RS485 достаточно устойчив к помехам на линии, поскольку является сбалансированным протоколом.
Эти трансиверы могут передавать или принимать, но не одновременно. В вашем случае у вас будет ведущий с активным Tx Enable, а у ведомых Tx Enable неактивен.
Если чипы сбрасываются с длинного кабеля, вам следует установить согласующий резистор между A и /B на конце (например, 120 Ом).
SPI может быть в порядке, но он действительно предназначен для коротких пробегов. I2C тоже может быть в порядке, но может быть излишне сложным. Однако, если вы используете I2C, у него есть режим «широковещания», который может подойти для отправки одного и того же на несколько устройств.
Ссылки
- Связь RS485
- RS485 — Википедия
- I2C (провод)
- ИПИ
- Асинхронный последовательный
PJON — это немного замороченный последовательный протокол шины для нескольких узлов. Он может оказаться вам полезным.
PJON™ (Padded Jittering Operationative Network) — это совместимая с Arduino, многомастерная, мультимедийная коммуникационная шинная система. Она предлагает Стандарт, он разработан как фреймворк и реализует полностью Программно эмулируемый стек сетевых протоколов, который можно легко кросс-компилирован на многих архитектурах, таких как ATtiny, ATmega, ESP8266, Teensy, Raspberry Pi, Linux и Windows x86 машины. Это допустимый инструмент для быстрого и понятного построения сети устройств
- Самый компактный способ питания Arduino от розетки
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Отправка значения с одного Arduino на другой
- Связь Arduino master/slave с использованием RS485
- Клиент MQTT на Arduino + SIM900
- Ошибка инициализации GPS DFRobot [Arduino Uno, SIM808]
- Реализовать связь Visible Light с помощью Arduino
- Как автоматически сбросить nrf24l01+ с кодом?
Есть много способов. Вам нужно будет более конкретно сформулировать свои требования., @Ignacio Vazquez-Abrams
как организовать беспроводную связь между несколькими Arduino?, @SHAUKAT ALI KHAN
@SHAUKATALIKHAN поиск NRF24L01 с помощью радионики, @Suit Boy Apps