
Соединение двух плат Arduino открывает возможности для распределённой обработки данных, расширения количества входов и выходов, а также реализации сложных проектов с несколькими устройствами. На практике выбор способа соединения зависит от скорости передачи, расстояния между платами и количества линий данных.
Последовательный порт (UART) позволяет обмениваться данными на скоростях до 115200 бит/с при прямом подключении TX к RX и RX к TX. Этот метод подходит для простых команд и небольших массивов данных без сложной синхронизации.
I2C обеспечивает обмен информацией по двум проводам: SDA и SCL. Одна плата выступает мастером, а остальные – ведомыми. Протокол поддерживает до 127 устройств на одной шине и позволяет передавать данные до 400 кГц при стандартной конфигурации, что делает его удобным для сенсорных массивов и периферийных модулей.
SPI обеспечивает высокую скорость передачи до нескольких Мбит/с и подходит для синхронного обмена данными между платами на коротких расстояниях. Используется четыре линии: MOSI, MISO, SCK и CS, что требует точного подключения и управления выбором ведомого устройства.
Беспроводные методы, такие как NRF24L01, HC-05/HC-06 Bluetooth и ESP8266/ESP32, позволяют обмениваться данными на расстоянии до нескольких десятков метров. NRF24L01 обеспечивает передачу пакетов до 2 Мбит/с, Bluetooth-модули удобны для мобильных устройств, а Wi-Fi модули позволяют интегрировать платы в локальную сеть и передавать данные через интернет.
Соединение через последовательный порт (UART) для обмена данными

UART использует два сигнальных провода: TX одной платы подключается к RX другой и наоборот. Для обмена данными между двумя Arduino стандартно используют скорость передачи 9600 или 115200 бит/с, которую задают функцией Serial.begin(скорость). Для стабильного соединения рекомендуется подключать общую землю (GND) между платами.
Передача данных осуществляется побайтово. На одной плате используется Serial.write() для отправки и Serial.read() для приёма. Для обработки потоков данных с обеих плат можно использовать буфер, который хранит входящие байты до их обработки. Это снижает вероятность потери информации при высокой скорости обмена.
Для избежания конфликтов при двусторонней передаче стоит применять протокол обмена, например: первая плата отправляет команду и ждёт подтверждения, затем вторая отвечает. При организации нескольких устройств на одной линии UART используют дополнительные программные последовательные порты через SoftwareSerial, назначая свободные цифровые пины для передачи и приёма.
Короткие соединения до 30 см не требуют дополнительных компонентов, для длинных линий более 1 метра рекомендуется использовать резисторы 100–220 Ом на линиях TX/RX или дифференциальные трансиверы для снижения помех и искажений сигнала.
Использование I2C для передачи команд и данных между платами

I2C использует две линии: SDA для данных и SCL для тактового сигнала. Одна плата назначается мастером, остальные – ведомыми. Каждое устройство имеет уникальный адрес (от 0x08 до 0x77). Скорость передачи обычно 100 кГц (стандарт) или 400 кГц (Fast mode).
Для подключения двух плат Arduino достаточно соединить SDA и SCL вместе и подключить общую землю. При необходимости можно использовать подтягивающие резисторы 4,7–10 кОм на линии SDA и SCL для стабильного сигнала при длине соединения более 20 см.
Передача данных осуществляется через команды Wire.write() на ведомой и Wire.read() на мастере. Для синхронизации используют функции Wire.requestFrom() и Wire.onReceive(). Ниже указана примерная таблица команд между мастер-платой и ведомой:
| Действие | Команда мастера | Ответ ведомой платы |
|---|---|---|
| Запрос температуры | Wire.requestFrom(0x10, 2) | 2 байта с текущим значением |
| Включение светодиода | Wire.beginTransmission(0x10); Wire.write(0x01); Wire.endTransmission() | Подтверждение включения (0x01) |
| Сброс счетчика | Wire.beginTransmission(0x10); Wire.write(0x02); Wire.endTransmission() | Подтверждение сброса (0x02) |
Для передачи больших массивов данных рекомендуют разбивать их на пакеты по 32 байта, так как буфер I2C на Arduino ограничен этим размером. Это предотвращает потерю информации и зависания линии.
Подключение через SPI для быстрого обмена информацией
SPI использует четыре линии: MOSI (Master Out Slave In), MISO (Master In Slave Out), SCK (тактовый сигнал) и CS (выбор ведомого). Мастер инициирует передачу данных, ведомая плата отвечает на каждый такт. Максимальная стабильная скорость на Arduino Uno составляет около 8 МГц, на Mega – до 16 МГц.
Для соединения двух плат Arduino подключают MOSI к MOSI, MISO к MISO, SCK к SCK и используют один пин CS для выбора ведомой платы. Общую землю (GND) обязательно подключают. Для нескольких ведомых плат каждому выделяют отдельный CS-пин.
На мастере используют SPI.begin() и SPI.transfer(), на ведомой – SPI.attachInterrupt() для обработки входящих байтов. Рекомендуется заранее определить протокол обмена, например, первый байт – команда, последующие – данные.
Для длинных соединений более 50 см применяют резисторы 10–22 Ом на линиях MOSI, MISO и SCK для уменьшения отражений и помех. Линию CS следует держать высоко, когда плата не выбрана, чтобы избежать ложных срабатываний.
Синхронизация с помощью цифровых пинов и сигнала CLOCK
Синхронизация двух плат Arduino через цифровые пины позволяет передавать данные без стандартных протоколов, используя один пин для передачи сигнала CLOCK и один или несколько пинов для данных. CLOCK формирует тактовые импульсы, на каждый из которых принимающая плата считывает состояние пинов данных.
Для реализации подключают CLOCK к выбранному цифровому пину ведомой платы и назначают отдельные пины для передачи битов. Скорость передачи зависит от частоты импульсов CLOCK и задержек в коде, обычно ограничивается 1–2 МГц для стабильной работы на стандартных платах.
Передача данных осуществляется побитово. Мастер выставляет состояние пинов данных и формирует импульс CLOCK. Ведомая плата с помощью digitalRead() считывает значение на каждом такте. Рекомендуется использовать буферизацию: данные собираются в массив до полного байта, после чего обрабатываются.
Для минимизации помех линии данных и CLOCK можно подключить резисторы 100–220 Ом последовательно, а при длине проводов более 50 см использовать экранированные кабели или дифференциальную пару для CLOCK. Синхронизация через цифровые пины удобна для передачи нестандартных протоколов и сигналов управления.
Передача данных по беспроводному модулю NRF24L01

NRF24L01 работает в диапазоне 2,4 ГГц и обеспечивает передачу данных до 2 Мбит/с. Для соединения двух плат Arduino используются линии SPI: MOSI, MISO, SCK, CSN и CE, а также общая земля и питание 3,3 В.
Настройка соединения включает следующие шаги:
- Подключение модулей к платам Arduino по SPI.
- Инициализация с помощью библиотеки RF24 и указание адресов для передачи и приёма.
- Настройка режима работы: TX для отправляющей платы и RX для принимающей.
- Выбор канала связи (0–125) и скорости передачи (250 кбит/с, 1 Мбит/с или 2 Мбит/с).
Передача данных выполняется функцией radio.write(), приём – radio.read(). Для подтверждения успешной передачи рекомендуется включить функцию autoAck, которая автоматически отправляет подтверждение от принимающей платы.
Рекомендации по стабильности связи:
- Держать питание модуля стабильным, используя конденсатор 10 µF между VCC и GND.
- Размещать платы на расстоянии не более 30 м без прямой видимости при стандартной антенне, или использовать внешние антенны для увеличения дальности.
- Разделять линии питания и данных, избегать длинных проводов SPI без экранирования.
- Разбивать большие массивы данных на пакеты до 32 байт, чтобы не превышать размер буфера NRF24L01.
Обмен информацией через Bluetooth-модули HC-05/HC-06

HC-05 и HC-06 работают в диапазоне 2,4 ГГц и поддерживают скорость передачи до 115200 бит/с. Модули подключаются к Arduino через UART: TX модуля к RX платы, RX модуля к TX платы, общая земля обязательна. Питание подают 3,3–5 В, но рекомендуется стабилизировать напряжение через конденсатор 10 µF.
HC-05 может работать как мастер или ведомый, HC-06 – только ведомый. Настройка включает установку скорости передачи через AT-команды и назначение имени устройства для обнаружения другим модулем. Соединение осуществляется автоматическим спариванием по адресу Bluetooth.
Передача данных выполняется функциями Serial.write() и Serial.read(). Для стабильного обмена рекомендуется:
- Использовать буферизацию входящих данных для обработки целых сообщений.
- Разбивать массивы данных на пакеты до 32 байт, чтобы избежать потери информации.
- Поддерживать минимальное расстояние между модулями до 10 метров без препятствий, при необходимости использовать внешние антенны.
- Использовать delay или подтверждение при последовательной отправке нескольких сообщений, чтобы избежать коллизий.
Для проектов с двумя платами Arduino один модуль назначается ведущим, другой ведомым, что обеспечивает одноканальный поток данных и упрощает протокол обмена.
Соединение через Wi-Fi с использованием ESP8266 или ESP32

ESP8266 и ESP32 позволяют передавать данные между платами Arduino через локальную сеть или точку доступа. Подключение осуществляется через последовательный порт Arduino к модулю, а на ESP выполняется управление Wi-Fi соединением с помощью библиотеки WiFi.h.
Настройка обмена включает следующие шаги:
- Присвоение каждой плате уникального IP-адреса в сети.
- Выбор режима работы: STA (клиент) или AP (точка доступа).
- Использование TCP или UDP для передачи данных между платами.
- Создание простого протокола обмена: первый байт команды, последующие – данные.
Рекомендации для стабильной работы:
- Использовать статические IP, чтобы избежать повторного поиска устройств.
- Разбивать пакеты данных на блоки по 512 байт, чтобы не перегружать буфер ESP.
- Поддерживать минимальное расстояние между платами до 20 метров без прямых препятствий или использовать внешние антенны для увеличения диапазона.
- Применять WiFiClient.available() для проверки наличия данных перед чтением и WiFiClient.write() для отправки сообщений.
- В проектах с несколькими платами назначать один модуль сервером, остальные – клиентами, чтобы избежать конфликтов соединения.
При использовании ESP32 возможна одновременная работа с несколькими клиентами благодаря встроенному многопоточному стеку, что ускоряет обмен данных и снижает задержки в управлении периферией.
Организация простой шины общего назначения с помощью пинов INPUT/OUTPUT
Простая шина позволяет обмениваться данными между платами Arduino через несколько цифровых пинов, назначенных для передачи и приёма битов. Каждую линию данных подключают напрямую между платами и используют общую землю. Для предотвращения короткого замыкания при одновременной подаче сигнала с обеих плат рекомендуется использовать резисторы 220–470 Ом последовательно с каждым пином.
Передача данных выполняется побитово:
- Пины отправляющей платы переводятся в режим OUTPUT, на каждом такте выставляется значение бита.
- Пины принимающей платы переводятся в режим INPUT, состояние считывается функцией digitalRead().
- Для синхронизации используют дополнительный CLOCK-пин или протокол «готовность/подтверждение».
Рекомендации по работе с шиной:
- Для коротких соединений до 30 см достаточно последовательных резисторов, для длинных линий используют буферные драйверы.
- Разбивать данные на байты и отправлять их пакетами, чтобы уменьшить вероятность ошибок при синхронизации.
- При необходимости нескольких ведомых плат каждая получает отдельную линию выбора или сигнал READY для предотвращения коллизий.
- Проверять состояние шины перед отправкой нового пакета, используя пины подтверждения или логическое согласование.
Такая шина подходит для проектов, где требуется обмен небольшими массивами данных без применения специализированных протоколов SPI или I2C, и позволяет реализовать гибкую и настраиваемую связь между Arduino.
Вопрос-ответ:
Можно ли подключить две платы Arduino напрямую через UART без дополнительных компонентов?
Да, две платы можно соединить через UART напрямую, подключив TX одной платы к RX другой и наоборот, а также объединив GND. Для коротких соединений до 30 см дополнительных резисторов или конденсаторов не требуется. Рекомендуется использовать стандартные скорости 9600 или 115200 бит/с. При двусторонней передаче данных желательно предусмотреть протокол обмена, чтобы избежать конфликтов.
Как определить адрес для ведомой платы при использовании I2C?
Каждое устройство на шине I2C должно иметь уникальный адрес от 0x08 до 0x77. Адрес назначается программно через функцию Wire.begin(адрес) на ведомой плате. При использовании нескольких плат важно проверить, чтобы ни один адрес не повторялся, иначе передача данных будет некорректной.
Насколько стабильна связь между Arduino через NRF24L01 на открытом пространстве?
При стандартной антенне и прямой видимости модули NRF24L01 обеспечивают стабильный обмен на расстоянии до 30 метров. Для увеличения дальности используют внешние антенны и стабильное питание с конденсатором 10 µF на VCC и GND. Скорость передачи можно выбрать 250 кбит/с, 1 Мбит/с или 2 Мбит/с, при этом меньшая скорость повышает надёжность на больших дистанциях.
Как синхронизировать обмен данными между двумя Arduino через цифровые пины без использования протоколов SPI или I2C?
Для синхронизации используют один пин как CLOCK и несколько пинов для передачи битов. Отправляющая плата выставляет значение битов и формирует импульс CLOCK, принимающая считывает данные с помощью digitalRead(). Для предотвращения коллизий рекомендуется протокол «готовность/подтверждение» и буферизация данных, чтобы принимать целые байты до их обработки.
Можно ли использовать HC-05 для одновременного соединения с двумя Arduino?
HC-05 поддерживает только одно соединение одновременно. Для обмена данными с двумя платами Arduino потребуется два отдельных модуля: один назначается ведущим, другой ведомым. Ведущий модуль инициирует соединение с ведомым, а данные передаются через последовательный порт, используя буферизацию и контрольные байты для подтверждения корректного приёма.
Как увеличить дальность передачи между Arduino через модуль NRF24L01?
Для увеличения дальности следует использовать внешние антенны, подключать конденсатор 10 µF между VCC и GND для стабилизации питания, а также снижать скорость передачи с 2 Мбит/с до 1 Мбит/с или 250 кбит/с. Важно размещать платы так, чтобы между ними не было металлических препятствий, и избегать длинных проводов SPI без экранирования.
Можно ли использовать несколько ведомых плат на одной линии I2C и как это сделать?
Да, на одной шине I2C можно подключить несколько ведомых плат. Каждая плата должна иметь уникальный адрес, задаваемый через Wire.begin(адрес). Мастер-плата обращается к конкретной ведомой плате по её адресу. Для шины более 20 см рекомендуется использовать подтягивающие резисторы 4,7–10 кОм на линиях SDA и SCL, чтобы поддерживать стабильный сигнал.
