Как соединить 2 ардуины между собой usb кабелем для обмена данными

Тема в разделе "Arduino & Shields", создана пользователем Дятел, 13 фев 2026.

  1. Дятел

    Дятел Нерд

    Хочу соединить две ардуины НАНО между собой USB кабелем для обмена данными через аппаратный сериал.
    Rx-Tx на плате соединять не хочу. Интересно именно кабелем.
    Питать ардуины буду через пин 5в. на плате ардуино. Обе ардуино из одного источника или каждую по отдельности от разных повербанков.
    GND ардуин, естественно, соединю. Хотя, как понимаю, это не обязательно. через USB уже соединятся.
    Кабель: на ардуинах разъем MiniUSB. Спаяю HUB : две мамы usb type-a, а них вставлю обычные кабели MiniUSB для ардуины. На обеих сторонах такого сочленения получится MiniUSB.
    Компьютер в этом соединении не участвует.
    Вопросы:
    1. получится или нет?
    2. Если да, то:
    2.1. Как соединять между собой usb type-a. Плюс к плюсу. Минус к минусу, это понятно. А D+ и D- как? D+ к D- ИЛИ D+ к D+ и D- к D-
    3. Если нет, то соединю: Rx-Tx и Tx-Rx. Но этот вариант мне заметно менее интересен. так как надо паять. (ардуино припаяно на плате).
    3.1. При загрузке скетча на ардуины надо будет разъединять оба провода: Rx-Tx и Tx-Rx?

    Что бы проверить работоспособность соединения буду в Serial.print посылать команды на изменение частоты мигания светодиодом на 13 пине.
     
  2. DetSimen

    DetSimen Гуру

    Если соединишь через RS485, то и земли объединять не надо. А если через HC-12 или JDY-40 то и проводов не надо. И всё получицца.
     
  3. Дятел

    Дятел Нерд

    спасибо за совет, но свободных пинов нет, кроме аппаратных Rx Tx
     
  4. fps

    fps Нерд

    А кто тогда будет usb host?
    И где будет исполняться драйвер usb serial?
     
    Дятел нравится это.
  5. Дятел

    Дятел Нерд

    "Неприличными словами не выражаться!"
    Неужели не понятно, что я этого не понимал? сейчас немного прояснилось.
    А про драйвер не понял. Он же на борту у каждой ардуины.
    Спасибо.
     
  6. fps

    fps Нерд

    На борту ардуины аппаратный чип (например ch340) который "упаковывает UART в USB".
    А на компьютере драйвер (программа) "распаковывает" UART из USB.
    В вашем случае это сделать некому.
     
    Дятел нравится это.
  7. KindMan

    KindMan Гуру

    Вот их и соедините.
     
  8. Дятел

    Дятел Нерд

    спасибо. я думал, что ch340 умеет еще и распаковывать. он же принимает данные. от компьютера. Оказалось все не так просто, как хотелось бы.
    похоже, так и придется сделать. Спасибо.
    Вместо одной из ардуин хочу esp8266 поставить. Ардуино Rx Tx к esp8266 Tx Rx.
    Почему к аппаратным? у Ардуино других свободных пинов нет. А у ESP есть, и можно SoftSerial, но хотел попробовать аппаратный. На провода повешу выкл/вкл микрик, что бы прошивать контроллеры.
    Вопрос: из за разных напряжений микроконтроллеров, ставят делитель на резисторах. Но так же много схем где без делителя. Почему порты у людей не горят, когда они без делителя подключают.
     
  9. parovoZZ

    parovoZZ Гуру

    без хоста не выйдет. Впрочем, есть библиотека V-USB в ваших дуринах - только не знаю, поддерживает ли она COM HOST. LUFA точно поддерживает, но для неё нужен чип с USB на борту (Леонардо).

    Rx-Tx кабелем тоже можно соединить. Тем же кабелем от USB.

    нет там никаких драйверов.
     
    Дятел нравится это.
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Там только загрузчик (bootloader)
     
  11. parovoZZ

    parovoZZ Гуру

    там нет загрузчика. Загрузчик только в микропроцессорноподобных чипах. Например, ESP32. В леонарде что-то такое есть, но вроде только на USB.
     
    Дятел нравится это.
  12. Дятел

    Дятел Нерд

    всем спасибо за подсказки. Да, понял в чем дело, почему встречно через 2 юсб не выйдет.
    Зато теперь мучаюсь с есп8266. нодемсию.
    передаю данные от ардуино к esp и назад. tx rx ардуины (аппаратные) к софтовому есп espSerial(13, 14)
    проблема:
    при приеме данных esp прибавляет в конце один байт. передаю данные пакетом с контрольной суммой. данные передаю структурой struct .
    если контрольная сумма сошлась, то разбираю на элементы.
    посылаю uint16_t integer_info_1;
    посылаю: 10000000 двоичное число.
    посылаю так txData.integer_info_1=0b10000000;
    получаю на esp 1000000000000000. то есть прибавляет еще один байт.
    если при приеме заменить тип данных на uint8_t integer_info_1; то принимает нормально. на передаче тип данных не меняю. как и раньше uint16_t. Если вместо esp поставить ардуино на прием. То у нее все принимается без проблем.
    При передаче от esp тоже, похоже, происходит какое-то изменение с данными, но пока не разбирался. Опять же если вместо esp ардуино, то все работает как надо.
     
  13. parovoZZ

    parovoZZ Гуру

    Так не надо делать. Лучше через массив байтов. При этом перед отправкой данные надо разложить на байты, после приема собрать. Делается это через указатели.

    Если очень хочется структурой, то ее надо обязательно выравнивать.
     
    Дятел нравится это.
  14. Дятел

    Дятел Нерд

    Запретный плод сладок :))
    еще не понял как это
    спасибо. помогло.
    Выравнивание
    Как экземпляр структуры хранится в памяти: члены лежат в памяти друг за другом в том порядке, в котором указаны в структуре. И имеет место быть битовое выравнивание - переменные выравниваются в памяти так, чтобы переменная не пересекала границу выравнивания, это нужно для оптимизации скорости доступа к данным. Выравнивание зависит от архитектуры и может быть например 2 байта (AVR), 4 байта (esp8266, esp32). Отсюда и были мои проблемы.!
    Чтобы структура занимала меньше места в памяти (и не вызывала ошибок при обмене данными между микроконтроллерами разных типов), её члены стоит располагать в порядке убывания веса: сначала массивы и вложенные структуры, затем float, long, указатели и ссылки, далее остальные короткие целые типы
    было:
    uint8_t CMD_info;
    uint16_t integer_info_1;
    float float_info_1;
    float float_info_2;
    uint8_t crc; // байт crc
    Исправил на:
    float float_info_1;
    float float_info_2;
    uint16_t integer_info_1;
    uint8_t CMD_info;
    uint8_t crc; // байт crc
    И все стало корректно работать.
    СПАСИБО За подсказки!
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Могу сказать конкретно за Ардуино Уно Р3. Нет ничего сложного соединить аппаратным сериалом две ардуины. TX-ы к RX-ам и земля. Там появятся небольшие конфликты передатчиков в конверторах CH340G. Но в их линиях стоят резисторы 1 КОм. Они всё ограничат. Поэтому дыма не будет. Но надежность передачи - если линия не длинная и скорость не больше 19600. Пробуйте.
     
    Последнее редактирование: 17 фев 2026
  16. Дятел

    Дятел Нерд

    не совсем вас понял.
    Понял так, что вы предлагаете соединить вместо юсби-шного разъема через аппаратные rx-tx?
    Если так, то примерно так и сделал. Правда на второй ардуине я использую SoftSerial.
    Так же вместо второй ардуины я попробовал esp8266 тоже через espSerial.
     
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вы рисковали - вам повезло. Если бы на выходе (пин 2) передатчика микры CH340G не стоял ограничительный резистор 1 КОм (а он по-видимому именно для этого случая стоит) - из микр (и на том конце тоже) вышел бы "волшебный дым". И всёёё.
    Тогда вам тем более повезло. Мог сгореть выход (полу-мост) разряда регистра порта, на который вы посадили СофтСериал. Там точно нет никаких ограничительных резисторов.
     
    Последнее редактирование: 18 фев 2026
  18. DetSimen

    DetSimen Гуру

    чтобы не завязываться на выравнивание, используй

    #pragma pack(push,1)

    перед обьявлением структуры, и

    #pragma pack(pop)

    после. Выравнивания не будет, длина структуры будет простой суммой длин всех типов переменных, в ней использующихся. На некоторых контроллерах доступ к элементам структуры будет дольше, чем к выровненным, но для микроконтроллеров это неважно, я думаю.
     
    Дятел нравится это.
  19. Дятел

    Дятел Нерд

    Спасибо за инфо.
    Но как-то я отношусь к ней скептически. Я мало соединял ардуин между собой, но картинок я смотрел много! :)
    И, о такой опасности слышу в первый раз.
    Не в обиду вам. Расскажите, пожалуйста о причинах такой опасности более подробно. логика у обоих 5ти вольтовая. Наверняка токоограничивающие резисторы там стоят, на случай если не на тот пин воткнул и Hight на Low попадет.
     
  20. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не знаю как вам объяснять. Вот схема исправленная от ошибок. Два резистора в ней R8, R9 - защитные, про которые мы говорим. Других таких - нет.
     

    Вложения:

    Последнее редактирование: 18 фев 2026
    Дятел нравится это.