Мультиплексор COM портов на Arduino Nano: скетч для объединения 4 последовательных интерфейсов
При разработке проектов с несколькими последовательными устройствами часто возникает задача объединить их в один виртуальный COM-порт. Особенно это актуально для самодельных музыкальных инструментов, датчиков или промышленных контроллеров. В этой статье мы разберём, как написать скетч для Arduino Nano, который слушает 4 цифровых входа (D0-D3) как SoftwareSerial, принимает данные на скорости 115200 бод с каждого порта и передаёт их на HardwareSerial (USB) на скорости 1 000 000 бод, добавляя служебный байт с номером входа.
Принцип работы мультиплексора
Основная идея - использовать микроконтроллер Arduino Nano в качестве моста между четырьмя внешними устройствами (например, MIDI-контроллерами или датчиками) и компьютером. Каждое устройство подключается к отдельному цифровому пину, который программно эмулирует UART (SoftwareSerial). Arduino Nano постоянно опрашивает все четыре входа, и при появлении байта данных он немедленно отправляет его в компьютер через стандартный USB-COM порт, предварительно добавив байт-идентификатор (0-3).
Схема подключения и выбор пинов
Для проекта используйте Arduino Nano. Подключение внешних устройств:
- Порт 0 - пин D4 (RX) и D5 (TX) для SoftwareSerial0
- Порт 1 - пин D6 (RX) и D7 (TX) для SoftwareSerial1
- Порт 2 - пин D8 (RX) и D9 (TX) для SoftwareSerial2
- Порт 3 - пин D10 (RX) и D11 (TX) для SoftwareSerial3
Важно: пины D0 и D1 зарезервированы для HardwareSerial (USB-COM). Все SoftwareSerial порты должны работать на одинаковой скорости 115200 бод. Общий провод (GND) всех устройств соедините с землёй Arduino.
Полный скетч для Arduino IDE
Ниже представлен код, который реализует описанный функционал. Скетч использует библиотеку SoftwareSerial (встроенную в Arduino IDE).
#include <SoftwareSerial.h>
// Создаём объекты SoftwareSerial для каждого порта
SoftwareSerial port0(4, 5); // RX, TX
SoftwareSerial port1(6, 7);
SoftwareSerial port2(8, 9);
SoftwareSerial port3(10, 11);
void setup() {
// HardwareSerial на скорости 1 000 000 бод
Serial.begin(1000000);
// Инициализация SoftwareSerial портов
port0.begin(115200);
port1.begin(115200);
port2.begin(115200);
port3.begin(115200);
}
void loop() {
// Проверяем каждый порт и передаём данные с идентификатором
checkAndForward(port0, 0);
checkAndForward(port1, 1);
checkAndForward(port2, 2);
checkAndForward(port3, 3);
}
void checkAndForward(SoftwareSerial &port, byte id) {
if (port.available()) {
byte data = port.read();
// Отправляем служебный байт (номер входа)
Serial.write(id);
// Отправляем сам байт данных
Serial.write(data);
}
}Объяснение ключевых моментов кода
Функция checkAndForward() принимает ссылку на объект SoftwareSerial и номер порта (0-3). Если во входном буфере есть данные, она читает один байт, отправляет сначала идентификатор порта, а затем сам байт. Благодаря высокой скорости HardwareSerial (1 000 000 бод) и относительно низкой скорости входных портов (115 200 бод), оверхед в 100% не создаёт задержек - пропускная способность USB-канала более чем в 8 раз выше.
Настройка и тестирование
Загрузите скетч в Arduino Nano через Arduino IDE. Убедитесь, что в мониторе порта выбрана скорость 1 000 000 бод. Подключите внешние устройства к пинам D4-D11 согласно схеме. При поступлении данных вы увидите в мониторе порта последовательность: [байт-номер порта] [байт данных]. Например, если с устройства на порту 2 пришёл байт 0x41, в терминал выведется: 02 41.
Возможные проблемы и их решение
- Потеря данных: Если скорость HardwareSerial недостаточна, увеличьте её до 2 000 000 бод (поддерживается не всеми USB-мостами).
- Конфликт пинов: Не используйте пины D0 и D1 для SoftwareSerial - они заняты аппаратным UART.
- Сбои передачи: Проверьте общий GND между всеми устройствами.
Этот скетч можно легко адаптировать под другие платы (Arduino Uno, Mega) и количество портов. Он идеально подходит для создания мультиплексора COM портов своими руками.