Связь между Arduino и Arduino

Когда я отправляю данные на Arduino Uno через последовательный монитор, последовательные данные передаются по тому же USB-кабелю, который используется для программирования Arduino. Таким образом, на плате Arduino должно быть устройство, такое как FTDI или AVR с поддержкой USB, которое управляет выводом RXD Arduino. Итак, мой вопрос: когда я хочу, чтобы две платы Arduino взаимодействовали друг с другом через последовательный порт, во многих руководствах говорится, что просто подключите RX и TX на одном Arduino к TX и RX на другом. Так почему же устройство на плате, которое обычно управляет выводом RXD, не «борется»? другой Arduino, который теперь также управляет линией RXD?

, 👍5


3 ответа


Лучший ответ:

6

Atmega16U2, который осуществляет связь по USB, подключен к Rx и Tx через резисторы 1 кОм, поэтому при обмене данными с другим Arduino он «преобладает»; USB-интерфейс. См. изображение:

USB-интерфейс Arduino Uno


Кстати, обратите внимание, что светодиоды Tx и Rx подключены к Atmega16U2, а не к Atmega328P, поэтому они не светятся при обмене данными между Arduino и Arduino.


При измерении с помощью пустого эскиза на моем Uno ток между Tx и Gnd составил 0,14 мА, а не 5 мА. Это говорит о том, что Atmega16U2 устанавливает для контактов высокое сопротивление, когда фактически не получает данные от интерфейса USB.

Это логично, потому что упомянутые вами (в комментарии) ток 5 мА могут мешать, если вы захотите использовать этот контакт для чего-то другого.

,

Потрясающе, спасибо! Вы оба были очень быстрыми. Означает ли это, что питание Arduino через USB безопасно, даже если они подключены к последовательному соединению с другим Arduino? И что ATmega16U2 и другой Arduino *будут* бороться, но только с ~5 мА?, @Neil Stockbridge

Да, я думаю, что это делается постоянно. Однако, и это важно, поскольку соединение Arduino-Arduino будет подавлять интерфейс USB, у вас возникнут проблемы с его программированием (тот, который вы пытаетесь запрограммировать), пока они подключены., @Nick Gammon

Также возможно, хотя я не уверен, что чип USB установит для контактов высокое сопротивление, когда они фактически не используются. На самом деле, я только что замерил на своем Uno, ток между Tx и Gnd составил 0,14 мА, а не 5 мА. Это логично, потому что упомянутые вами 5 мА могут мешать, если вы захотите использовать этот вывод для чего-то другого., @Nick Gammon

@NeilStockbridge Итак, эти резисторы 1 кОм, вероятно, используются в качестве меры предосторожности, чтобы вы не пытались перепрограммировать чип, когда он подключен к чему-то другому., @Nick Gammon


3

Если мы посмотрим на эту часть схемы Arduino Uno (, то вся схема будет находится здесь):

... мы видим два резистора сопротивлением 1 кОм (1000 Ом) (обозначенные RN4A и RN4B) между микросхемой преобразования USB в последовательный порт слева и процессором Atmel в центре справа. Они позволяют контактам Rx (прием) и Tx (передача) получать обратное управление от внешнего подключенного устройства.

,

Опереди меня на несколько секунд! :), @Nick Gammon

... тебя сложно победить в этих кругах!, @st2000

Должно быть, это старая схема, поскольку в Uno теперь используется Atmega328P, а не Atmega8. Однако принцип тот же., @Nick Gammon

Хммм, оно появилось прямо с сайта arduino.cc. Ооо, вот что они имели в виду под «эталонным дизайном»., @st2000

На моем стоит «Rev 3», так что вы, должно быть, нашли более раннюю версию. Однако это все еще эталонный дизайн., @Nick Gammon

Вот ссылка на [Ред. 3](https://content.arduino.cc/assets/UNO-TH_Rev3e_sch.pdf)., @Nick Gammon


0

Другой способ обеспечить последовательную связь между Arduino — использовать библиотеку SoftwareSerial с использованием выбранных вами (цифровых) контактов для последовательной связи между Arduino. Кстати, он позволяет избежать помех со стороны вашего компьютера при простом последовательном соединении

Библиотека SoftwareSerial обеспечивает последовательную связь с другими цифровыми выводами платы Arduino, используя программное обеспечение для репликации функциональности (отсюда и название «SoftwareSerial»). Можно иметь несколько программных последовательных портов со скоростью до 115200 бит/с. Параметр включает инвертированную сигнализацию для устройств, которым требуется этот протокол.

https://docs.arduino.cc/learn/built-in-libraries/software -серийный

Это требует небольшой подготовки и понимания, но не так уж и много.

#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11

// Устанавливаем новый объект SoftwareSerial
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
    // Определить режимы контактов для TX и RX
    pinMode(rxPin, INPUT);
    pinMode(txPin, OUTPUT);
    
    // Устанавливаем скорость передачи данных для объекта SoftwareSerial
    mySerial.begin(9600);
}

void loop() {
    if (mySerial.available() > 0) {
        mySerial.read();
    }
}

В этом примере (скопированном из приведенной выше/связанной статьи) вы должны использовать переменную mySerial для связи между Arduino и Arduino так же, как вы используете стандартное последовательное соединение. Вам также потребуется подключить контакты RX и TX одного Arduino к контактам TX и RX платы Arduino. другой Arduino соответственно.

Одним из преимуществ изучения использования библиотеки SoftwareSerial является то, что существует множество устройств связи, использующих последовательное соединение, таких как модули Bluetooth (например, HC-05, HC-06 и HM-10), которые вы можете использовать. теперь можно с легкостью использовать. В этом случае вы можете заменить провода, которые я просил добавить, на модуль Bluetooth и беспроводную связь между двумя Arduinos. Или вместо этого вы можете общаться с мобильным устройством с помощью модуля Bluetooth.

https://www.instructables.com/Tutorial- Использование-HC06-Bluetooth-to-Serial-Wireless-U-1/

Или вы можете получить доступ к Интернету с помощью модуля Wi-Fi через SoftwareSerial.

https://www.taintedbits.com/2017/07/ 21/arduino-uno-esp8266-software-serial/

,

вопрос не в том, как избежать вмешательства. он спрашивает, почему его нет., @Juraj