Можно ли связать две ардуины посредством USB кабеля?
Как осуществить передачу данных между двумя платами arduino, используя USB-кабель, и возможно ли такое?
Краткий ответ — НЕТ. It’s impossible.
Основная проблема в том, что USB-соединение не является симметричным. USB-соединения используется для подключения внешней переферии к какому-то одному устройству, называемому хостом (host).
Поэтому, если мы хотим соединить две ардуины через usb напрямую, то одна из плат ардуин должна была бы выполнять роль хоста, однако обычные платы arduino такую роль выполнять не могут.
Однако есть обходной путь решения проблемы. Можно использовать USB-хаб, к которому подключается две или больше ардуин. При этом нам потребуется специальная библиотека ArdSimUSB:
Урок 1. Двусторонняя связь между двумя Arduino с использованием I2C.
При разработке проектов на Arduino часто возникает потребность в увеличении возможности, а пинов не достаточно. Также бывает необходимость объединить несколько работающих узлов для обмена данными, т.е. реализовать двухстороннюю связь между двумя Arduino. Для реализации двусторонней связи между двумя Arduino отлично подойдёт шина I2C.
Интерфейс I 2 C (или по-другому IIC) — это достаточно широко распространённый сетевой последовательный интерфейс, придуманный фирмой Philips и завоевавший популярность относительно высокой скоростью передачи данных, дешевизной и простотой реализации.
Шина I2C синхронная, состоит из двух линий: данных (SDA) и тактов (SCL). При проектировании есть 2 типа устройств: ведущий (master) и ведомый (slave). Инициатором обмена всегда выступает ведущий, обмен между двумя ведомыми невозможен. Всего на одной двухпроводной шине может быть до 127 устройств.

Такты на линии SCL генерирует ведущий (master). Линией SDA могут управлять как мастер, так и ведомый (slave), в зависимости от направления передачи. Единицей обмена информации является пакет, обрамленный уникальными условиями на шине, именуемыми стартовым и стоповым условиями. Мастер в начале каждого пакета передает один байт, где указывает адрес ведомого и направление передачи последующих данных. Данные передаются 8-битными словами. После каждого слова передается один бит подтверждения приема приемной стороной.
Ведущее устройство инициирует связь с ведомым устройством. Для начала разговора требуется адрес ведомого устройства. Подчиненное устройство реагирует на ведущее устройство, когда к нему обращается ведущее устройство.
I 2 C используется во многих приложениях, таких как чтение RTC (часы реального времени), доступ к внешней памяти EEPROM. Он также используется в сенсорных модулях, таких как гироскоп, магнитометр и т. д.
Контакты Arduino I2C.
Выводы I2C расположены следующим образом на плате Arduino Uno.

Для других моделей плат соответствие выводов такое:
Плата
Пин SDA
Пин SCL
Урок 26.1 Соединяем две arduino по шине UART

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими Arduino.
В этом уроке мы научимся соединять две Arduino по аппаратной шине UART.
Преимущества:
- Простота реализации.
- Дуплексная связь, обе Arduino могут одновременно передавать данные друг другу.
Недостатки:
- Нет возможности «залить» скетч, при наличии устройств на аппаратной шине UART.
- Реализуется соединение только двух устройств (при отсутствии доп. модулей).
Нам понадобится:
- Arduino х 2шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 2шт.
- Trema Shield х 2шт.
- Эластичная клавиатура 4×4 х 2шт.
- Шлейф «мама-мама» (4 провода) для шины I2С х 2шт.
- Шлейф «мама-мама» (3 провода) для шины UART x 1шт.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_KB (для подключения матричных клавиатур).
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .
Видео:
Схема подключения:
Подключение LCD дисплея осуществляется к аппаратным выводам шины I2C.
Клавиатура подключается к любым цифровым выводам, в примере используются выводы 2-9.
Соединение двух arduino осуществляется по шине UART:
| Arduino 1 | Arduino 2 |
|---|---|
| TX (transmit — передать) | RX (receive — получить) |
| RX (receive — получить) | TX (transmit — передать) |
| GND (ground — земля) | GND (ground — земля) |
Код программы:
// Подключаем библиотеки: #include // подключаем библиотеку для работы с шиной I2C #include // подключаем библиотеку для работы с LCD дисплеем #include // подключаем библиотеку для работы с матричной клавиатурой // Объявляем переменные и константы: LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) iarduino_KB KB(9,8,7,6,5,4,3,2); // объявляем переменную для работы с матричной клавиатурой, указывая номера aeduino подключенные к шлейфу клавиатуры, начиная с первого вывода шлейфа void setup() < Serial.begin(9600); // открываем последовательный порт на скорости 9600 бод KB.begin(KB1); // инициируем клавиатуру (KB1 - эастичная матричная клавиатура 4х4) lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print("iArduino.ru"); // выводим текст "iArduino.ru" lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print("Received data:"); // выводим текст "Received data:" >void loop() < if(KB.check(KEY_DOWN))< // если нажимается кнопка (KEY_DOWN - нажимается, KEY_UP - отпускается, KEY_PRESS - удерживается), то . Serial.print(KB.getChar); // отправляем символ кнопки в последовательный порт (для вывода цифры кнопки используйте KB.getNum ) >if(Serial.available()>0) < // если в последовательном порту есть данные для чтения, то . lcd.setCursor(15, 1); // устанавливаем курсор в позицию: столбец 15, строка 1 lcd.print(char(Serial.read())); // выводим байт данных в виде символа, из последовательного порта на LCD дисплей >>
Настройка параметров шины UART:
Максимальная, аппаратно реализуемая частота передачи данных, может достигать 1/8 от тактовой частоты.
Настройка шины осуществляется вызовом функции begin() класса Serial, с передачей ей до двух аргументов. Первый аргумент устанавливает частоту передачи данных (в примере 9600 бод), второй (необязательный) аргумент устанавливает количество битов, наличие проверки на четность/нечетность, длину стопового бита (по умолчанию SERIAL_8N1).
Допустимые значения второго аргумента функции begin() класса Serial:
- SERIAL_5N1
- SERIAL_6N1
- SERIAL_7N1
- SERIAL_8N1
- SERIAL_5N2
- SERIAL_6N2
- SERIAL_7N2
- SERIAL_8N2
- SERIAL_5E1
- SERIAL_6E1
- SERIAL_7E1
- SERIAL_8E1
- SERIAL_5E2
- SERIAL_6E2
- SERIAL_7E2
- SERIAL_8E2
- SERIAL_5O1
- SERIAL_6O1
- SERIAL_7O1
- SERIAL_8O1
- SERIAL_5O2
- SERIAL_6O2
- SERIAL_7O2
- SERIAL_8O2
Значения отличаются последними тремя символами, которые означают следующее:
- Первая цифра: указывает количество бит в минимальной посылке (от 5 до 8).
- Буква N/E/O: E-проверка четности, O-проверка нечетности, N-без проверки.
- Последняя цифра: указывает длину стопового бита (1 или 2 битовых интервала)
Таким образом значение по умолчанию SERIAL_8N1 означает, что в минимальной посылке 8 бит (без учёта стартового и стопового битов), данные передаются без проверки на чётность/нечётность, длина стопового бита равна 1 битовому интервалу.
Настройки шины UART обеих arduino должны быть идентичны!
Ссылки:
- Код программы.
- Библиотека iarduino_KB.
- Библиотека LiquidCrystal_I2C_V112.
- Wiki — Установка библиотек в Arduino IDE .
- WiKi — Работа с символьными ЖК дисплеями.
- Wiki — Trema Shield.
Передача данных между микроконтроллерами Arduino через последовательный интерфейс

Обмен данными между двумя платами Arduino очень полезен. В больших проектах можно назначить несколько микроконтроллеров для управления техническими процессами.
Реализовать обмен данными между двумя микроконтроллерами Arduino можно с использованием последовательного интерфейса передачи данных. Для этого будут использоваться контакты RX-0 и TX-1.
Схема подключения микроконтроллеров Arduino UNO

Контакт Arduino UNO -1 RX-0 подключается к контакту TX-1 Arduino UNO -2 и на оборот контакт TX-1 Arduino UNO -1 подключается к контакту RX-0 Arduino UNO -2.
Обратите внимание, что необходимо обязательно подключить контакты GND. В противном случае обмен данными происходить не будет!
Код C++ для микроконтроллера Arduino UNO -1
Микроконтроллер Arduino UNO -1 будет отправлять целочисленные данные через последовательный интерфейс на микроконтроллер Arduino UNO -2.
// C++ code void setup() < // скорость передачи данных через последовательный интерфейс 9600 бит/сек Serial.begin(9600); >int thisByte = 33; // целочисленная переменная void loop() < // передаём значение переменной в последовательный интерфейс передачи данных Serial.write(thisByte); // если целочисленная переменная равняется 126, прекратить передачу данных if (thisByte == 126) < while (true) < continue; >> // увеличиваем значение целочисленной переменной thisByte ++; // пауза 1000 миллисекунд delay(1000); >
Код C++ для микроконтроллера Arduino UNO -2
Микроконтроллер Arduino UNO -2 будет получать целочисленные данные через последовательный интерфейс от микроконтроллера Arduino UNO -1.
// C++ code // объявляем и инициализируем целочисленную переменную int incomingByte = 0; void setup() < Serial.begin(9600); >void loop() < // если в последовательном интерфейсе присутствуют данные передать их в консоль if (Serial.available() >0) < // читаем даннные из последовательного интерфейса и присваиваем целочисленной переменнной incomingByte = Serial.read(); // выводи переменную в консоль Serial.print("Received: "); Serial.write(incomingByte); // выводим переменную в консоль в разных кодировках Serial.print(" INT: "); Serial.print(incomingByte); Serial.print(" DEC: "); Serial.print(incomingByte, DEC); Serial.print(" HEX: "); Serial.print(incomingByte, HEX); Serial.print(" OCT: "); Serial.print(incomingByte, OCT); Serial.print(" BIN: "); Serial.print(incomingByte, BIN); Serial.println(" "); >>
Результат работы в консоли микроконтроллера Arduino UNO -1

Результат работы в консоли микроконтроллера Arduino UNO -2

Более подробную инструкцию вы можете получить посмотрев видео «Связь между двумя платами Arduino».