Возможно ли двунаправленное UART-соединение по одному проводу передачи данных?
Nano находится внутри дома, а pro mini-снаружи дома. Я хочу отправлять/получать текст между ними. Общение всегда будет состоять в том, чтобы нано отправлял текст мини, а затем мини отправлял текст профи в ответ. Не будет случая, чтобы mini сначала отправил текст сам по себе.
Линия имеет три провода, но так как я должен питать мини с помощью этой линии, один используется для VCC, а другой используется для заземления, оставляя свободным только один провод. В этом случае могу ли я осуществлять UART-связь между ними? Если да, то как мне подсоединить к ним провод (включая заземление)? А что касается программного обеспечения, как я должен обрабатывать сообщения? Не могли бы вы привести простой пример кода, в котором nano отправляет "Привет" pro mini, а затем pro mini, получив "привет", отправляет "Мир" nano?
@Damn Vegetables, 👍4
Обсуждение4 ответа
Лучший ответ:
Вы можете осуществлять двустороннюю связь по одному проводу с помощью выходы с открытым коллектором. Для этого вы можете добавить такую схему с каждой стороны ссылки:
Здесь TX - это контакт передачи Arduino, а ДАННЫЕ-это провод передачи данных. Вывод приемника подключен непосредственно к проводу передачи данных, и при написании ваших скетчей вы должны учитывать тот факт, что все, что вы отправляете , будет получено обратно отправителем в виде “эха”.
Эта схема замедлит ваши переходы сигналов, ограничив максимально достижимую скорость передачи в бодах. Начните с чего-нибудь консервативного, например 9600 бит / с и ниже, если он не работает надежно.
"Вывод TX на Arduino" означает "TX1 - выход" Nano, а "вывод RX" означает "RX- - - 0" Pro Mini на схеме выше? Или он полностью игнорирует функцию UART Arduino и вместо этого использует цифровой вывод reuglar?, @Damn Vegetables
@DamnVegetables: Это предполагает, что вы используете аппаратный UART и, следовательно, соответствующие контакты. На Nano эти контакты помечены как TX1 и RX0. На Pro Mini они обозначены как TXO и RXI., @Edgar Bonet
Этот вопрос, вероятно, страдает от проблемы X Y. Где вопрос (о программном обеспечении) и возможный ответ (сосредоточенный на аппаратном обеспечении) не подходят к решению одними и теми же методами.
Угадав расстояние, на которое вы хотите провести свои 3 провода (питание, заземление и данные), это может быть скорее проблемой в области электротехники, чем программного обеспечения. Если вы готовы добавить 1 дополнительный провод для передачи данных, мы можем запустить кабель на приличное расстояние, устраняя проблемы с шумом, связанные с длинными кабелями связи.
Переходим к одному из возможных решений COTS: Рассмотрите возможность использования аппаратного интерфейса RS485 на обоих концах 4-проводного кабеля. Интерфейсы RS485 могут легко использоваться в проектах Arduino (здесь и далее приведены два примера), и существуют программные библиотеки Arduino RS485, которые обеспечивают связь.
Цель проекта не была раскрыта в вопросе. Однако вот пример проекта RS485, в котором подключенные Arduino сообщают положение потенциометра таким образом, что подключенный к Arduino RS485 на дальнем конце может имитировать движения потенциометра на сервоприводе с приводом от двигателя.
Внимательный глаз может заметить, что в вышеупомянутом проекте используется только 2 провода между двумя Ардуино. Это возможно, потому что в вышеупомянутом проекте два Arduino работают независимо друг от друга (этого не видно на диаграмме на веб-странице, связанной с). Кроме того, RS485 использует сбалансированную пару сигналов (2 провода) и не нуждается в дополнительной заземлении между двумя ардуино в качестве ссылки для определения разницы между 1 и 0.
Это может быть проблемой XY, и может быть аппаратное решение, но если вопрос "как я могу заставить это работать с 3 проводами", ответ "просто используйте 4 провода" бесполезен. Скорее всего, кабель уже там. Если бы пробивание стен для подключения Arduino было приемлемым, ОП не задавал бы этот вопрос., @AndreKR
@AndreKR Да, кабель уже установлен (я это сделал), и в то время я думал, что мне не понадобится двунаправленная связь, а 3-жильный кабель был дешевле, чем 4-жильный кабель, поэтому я выбрал первый. Теперь, после использования системы, я понял, что мне нужен способ получить статус удаленного устройства. Я мог бы удалить старый и установить новый кабель (не исключено), но это будет такая морока, поэтому я искал способ сделать это с помощью существующего провода., @Damn Vegetables
Спасибо. Замена существующего 3-жильного кабеля на 4-жильный кабель не является невозможной, но я подумал, что если бы у меня было два свободных провода для передачи данных, я мог бы просто подключить два Arduino напрямую, используя уже имеющиеся контакты TX/RX. Вы имеете в виду, что для использования RS485 требуется два свободных провода (кроме двух для питания удаленного Arduino), верно? Расстояние составляет около 30 метров (=100 футов), и мне не нужна быстрая связь (даже 100 бит / с более чем достаточно). Модуль под названием "TTL для RS485" кажется дешевым. Как вы думаете, это лучше, чем прямая связь даже в моем случае?, @Damn Vegetables
@AndreKR, в конце моего ответа было 2-проводное решение. Он будет работать только в том случае, если пульт дистанционного управления был запитан от какого-либо другого источника питания, а затем по кабелю. И RS485 почти всегда будет выдавать опорный сигнал возврата на землю. Снова и снова люди, которые не знают, что пытаются расширить I2C и SPI только для того, чтобы обнаружить, что они не могут жить без шума. Я исправлю свой ответ и объясню это более четко., @st2000
@DamnVegetables, К вашему сведению, вы, по сути, спрашиваете, как спроектировать [1-проводный](https://en.wikipedia.org/wiki/1-Wire) интерфейс на больших расстояниях, чем обычно. Я мог бы просто сказать это в своем ответе и указать вам на Arduino [учебники](https://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html) и [библиотеки](https://www.arduino.cc/reference/en/libraries/onewire/). Но вполне вероятно, что вы столкнетесь с проблемами, если ваш кабель будет слишком длинным. На самом деле, я думаю, что изложу вышесказанное в своем ответе. Но только для того, чтобы помочь нам найти лучший ответ ... только какой длины ваш кабель?, @st2000
@DamnVegetables RS485 нужны 2 провода, потому что это не данные/Земля, а скорее +данные/-Данные, как USB. Также обратите внимание, что RS485 работает лучше всего, если два провода передачи данных являются витой парой, @slebetman
Да, это верно. И он (USB 2.0) может достигать довольно впечатляющих скоростей на большом протяжении кабеля. Я думаю, что USB 3 использует несколько сбалансированных пар в полнодуплексном режиме для получения еще более высоких скоростей., @st2000
Пример протокола с использованием одного провода (кроме заземления, таким образом, всего 2) как для двунаправленной связи, так и для питания: Даллас 1-проводный
Существует несколько других аналогичных стандартных протоколов, и вы можете свободно думать о своих собственных, если вы готовы реализовать все внутренние компоненты вместо использования хорошо написанной и широко используемой библиотеки.
Хотя теоретически это может дать ответ на вопрос, [было бы предпочтительнее](https://meta.stackexchange.com/a/8259/437864) включить основные части ответа здесь и предоставить ссылку для справки., @sempaiscuba
будет ли он работать на кабеле длиной 30 метров?, @Juraj
Вы можете сделать это, используя один провод для заземления, один провод для nano->mini и один провод для mini->>nano. Мини-провод nano - >передает как питание, так и данные. Вы можете удерживать его на некотором напряжении над землей, чтобы обеспечить питание и наложить сигнал данных, который подключен к сети переменного тока на мини-конце. С другой стороны, вы можете исправить данные, чтобы обеспечить питание, если не забудьте отправить 01010101 всякий раз, когда вам больше нечего сказать.
Обратите внимание, что UART работает на холостом ходу., @Edgar Bonet
- Двоичный в десятичный с использованием побитовых операторов
- Эквивалент UCSR0B для ESP2866
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Последовательная связь между ESP8266 и Arduino Uno
- Как использовать Serial.setTimeout()
- Отправить структуру через Serial
- Как связаться с датчиком через порты RX/TX Arduino?
- Может ли Arduino Leonardo одновременно использовать USB-порт и последовательные контакты RX TX?
Главный вопрос-это расстояние и желаемая скорость соединения. Вы можете использовать, например, даже двухжильный кабель для питания и некоторую магию ВЧ-модуляции для передачи данных. Или вы можете использовать провода только для питания и использовать некоторое радио (например, Wi-Fi) для передачи данных. Решение для радиосвязи более простое и экономичное, потому что оно довольно распространено., @gbg
https://www.pjon.org/SoftwareBitBang.php, @jsotola
То, что вы хотите, называется полудуплексным. Поиск показал кучу хороших статей: https://forum.arduino.cc/t/software-serial-with-half-duplex-for-a-shared-serial-bus/112131 и http://nerdralph.blogspot.com/2014/01/avr-half-duplex-software-uart.html Вам придется придумать какое-нибудь рукопожатие, чтобы каждая сторона знала, когда другая закончит передачу. Повеселись!, @aMike
Вы можете использовать такой "протокол Ethernet", который использовался на коаксиальном кабеле ? Или используется с "высокочастотным модемом" ? Или, проще говоря, "соединитель цепи", как в старой "линейной телефонии" ?, @Antonio51