Связь между Arduino и Arduino
Когда я отправляю данные на Arduino Uno через последовательный монитор, последовательные данные передаются по тому же USB-кабелю, который используется для программирования Arduino. Таким образом, на плате Arduino должно быть устройство, такое как FTDI или AVR с поддержкой USB, которое управляет выводом RXD
Arduino. Итак, мой вопрос: когда я хочу, чтобы две платы Arduino взаимодействовали друг с другом через последовательный порт, во многих руководствах говорится, что просто подключите RX и TX на одном Arduino к TX и RX на другом. Так почему же устройство на плате, которое обычно управляет выводом RXD
, не «борется»? другой Arduino, который теперь также управляет линией RXD
?
3 ответа
Лучший ответ:
Atmega16U2, который осуществляет связь по USB, подключен к Rx и Tx через резисторы 1 кОм, поэтому при обмене данными с другим Arduino он «преобладает»; USB-интерфейс. См. изображение:
Кстати, обратите внимание, что светодиоды Tx и Rx подключены к Atmega16U2, а не к Atmega328P, поэтому они не светятся при обмене данными между Arduino и Arduino.
При измерении с помощью пустого скетча на моем Uno ток между Tx и Gnd составил 0,14 мА, а не 5 мА. Это говорит о том, что Atmega16U2 устанавливает для контактов высокое сопротивление, когда фактически не получает данные от интерфейса USB.
Это логично, потому что упомянутые вами (в комментарии) ток 5 мА могут мешать, если вы захотите использовать этот контакт для чего-то другого.
Если мы посмотрим на эту часть схемы 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
Другой способ обеспечить последовательную связь между 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 и беспроводную связь между двумя ардуино. Или вместо этого вы можете общаться с мобильным устройством с помощью модуля 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
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Потрясающе, спасибо! Вы оба были очень быстрыми. Означает ли это, что питание 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