Мультиплексор 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 портов своими руками.

    Часто задаваемые вопросы