Различия между двумя распространенными модулями RS485-TTL

Я хочу "перевести" существующий код, использующий один из этих модулей, для другого модуля.

В частности, у меня есть код, в котором используется "преобразователь RS485 в TTL". Как вы можете видеть на этой картинке,

Сторона, которая подключается к Arduino, имеет четыре контакта: VCC, GND, TX, RX. Но из этих контактов только два являются контактами данных.

Однако, если мы посмотрим на модуль MAX485,

На стороне Arduino также есть четыре контакта: DI, DE, RE, RO. Однако все четыре контакта являются контактами данных.

Поскольку протокол один и тот же, почему выводы разные? В «преобразователе RS485 в TTL»; код, используется SoftWareSerial, и он получает два контакта, которые в конечном итоге подключатся к TX, RX на модуле - в качестве аргументов.

Как я могу перевести этот код для MAX485? Какой должна быть распиновка?

, 👍-1

Обсуждение

Ваше редактирование расширило вопрос до такой степени, что ответ, который я дал, больше не применяется., @timemage

@timemage Мне очень жаль. Я не знал, что до этого дойдет... Извините за потраченное время... И спасибо, что нашли время ответить., @user1584421

@ user1584421, я сделал «откат». пожалуйста, задайте новый вопрос о проблеме с библиотекой ModbusServer, @Juraj

Это не совсем пустая трата времени, но возникают сложности, когда вопрос обновляется до такой степени, когда на него есть ответ. Я не собирался сам откатывать ваш вопрос, чтобы вернуть его к согласованности, и я не был готов обновить его, чтобы ответить на новый вопрос и прекратить решать все старые вещи, которые вы интегрировали в новый вопрос., @timemage


2 ответа


4

Насколько я могу судить, ваш первый модуль должен иметь функцию, которая автоматически включает драйвер RS485 при отправке и отключает его, как только вы этого не делаете. Это не редкость.

Последний, по-видимому, не поддерживает его. Это похоже на обычную конструкцию типа MAX485, которой нет. Вместо этого он предоставляет контакты включения драйвера и приемника. Обычно они активны на противоположных уровнях, что позволяет вам связать их вместе и подключить к одному выводу на Arduino для одновременного управления обоими. Любой код, который у вас был с использованием предыдущего модуля, необходимо будет изменить, чтобы вручную включить драйвер при отправке, а затем отключить его впоследствии.

Вам потребуется дополнительный цифровой контакт (PIN_DE_RE), подключенный от Arduino к модулю, к обоим контактам RE и DE. Необходимо настроить вывод в setup() с помощью pinMode(PIN_DE_RE, OUTPUT); и установить низкий уровень digitalWrite(PIN_DE_RE, LOW); для микросхемы, соответствующей дизайну MAX485, так что приемник изначально включен, а драйвер отключен.

Ваши транзакции записи должны выглядеть следующим образом:

delayMicroseconds(10);
digitalWrite(PIN_DE_RE, HIGH);
delayMicroseconds(10);
your_serial.write(whatever); // или .print и т. д.
your_serial.flush();
delayMicroseconds(10);
digitalWrite(PIN_DE_RE, LOW);
delayMicroseconds(10);

Вы можете не нуждаться в явных задержках вокруг digitalWrite, так как digitalWrite в любом случае достаточно медленный, но смысл их в том, чтобы обеспечить поддержку минимальное время, необходимое между сменой контактов RE/DE и транзакцией. Я выбрал 10 мкс несколько произвольно. Прежде всего, это просто для того, чтобы подчеркнуть, что синхронизация между изменением сигнала и его отправкой/получением важна.

Для SoftwareSerial .flush() обычно ничего не делает, по крайней мере, на AVR. Но я включаю его только для того, чтобы подчеркнуть, что независимо от того, что вы используете для отправки серийного номера, вы должны убедиться, что транзакция покинула фактическое устройство, а не просто поставлена в очередь на отправку, прежде чем отключать драйвер RS485. Если бы вы делали это с Serial1 на Leonardo/Micro/Mega и т. д., это было бы важно. Я бы оставил .flush() как есть для SoftwareSerial отчасти потому, что это не будет стоить вам ничего, и все заработает, если вы переключитесь на последовательное соединение с буферизованным выходом.

,

Большое спасибо! С вашей помощью я понял, как работает модуль. Однако я получаю ошибку 226, что означает тайм-аут. У меня есть вопрос, обновленный с кодом. Если вы знаете, что происходит... Вы можете опустить относительно большой оператор if, так как он не выполняется. Код совсем небольшой., @user1584421


2

RS485 — это стандарт для коммуникационной шины с потенциально несколькими отправителями, конечно, не одновременно. Таким образом, устройство должно отключить свою передающую цепь, чтобы другие могли общаться. Протокол прикладного уровня не определяется RS485.

По этой причине хороший модуль драйвера имеет два управляющих входа рядом с линиями данных:

  • DE означает "включение драйвера". Он должен быть активен, если устройство хочет управлять шиной и отправлять свое сообщение.
  • RE означает "включение приемника". Он должен быть активен, если устройство хочет прослушать шину и получить какое-то сообщение.

Строки данных обычно обозначаются следующим образом:

  • DI — это «ввод драйвера». Если вы используете повсеместную последовательную связь, это то же самое, что и TXD.
  • RO — это «выход приемника». Если вы используете повсеместную последовательную связь, это то же самое, что и RXD.

Как это работает в модуле, который имеет только TXD и RXD?

Ну, аппаратное обеспечение предполагает определенную скорость передачи данных, которая должна быть задокументирована.

Как только в TXD обнаруживается стартовый бит, модуль активирует драйвер (DE). Это может дополнительно отключить приемник (RE), чтобы избежать приема сообщения как эха.

Эта активация контролируется таймером, который длится, по крайней мере, столько времени, сколько требуется для передачи с определенной скоростью передачи данных.


Что теперь делать с линиями управления модуля MAX485?

Вы можете подключить TXD к DI и RXD к RO соответственно.

Если ваш модуль просто использует микросхему драйвера производства Maxim, управляющий вход RE фактически имеет инвертированную логику. Это означает, что приемник активен, если на линии низкий уровень. Напротив, драйвер активен, если линия DE имеет высокий уровень.

Поместите соответствующие вызовы digitalWrite() в те места, где вы хотите отправить что-то датчику. Имейте в виду, что для передачи требуется некоторое время. Перед отключением драйвера необходимо убедиться, что все биты отправлены.

Если вы хотите получать данные только от датчика, просто отключите драйвер и включите приемник постоянно.

,

все это было в теперь удаленном ответе timemage. ОП нужно решение с библиотекой ModbusMaster, @Juraj

Спасибо, но, как сказал Юрай, я знал эту информацию в то время, когда вы писали ответ. Это уже реализовано, теперь я получаю ошибку тайм-аута., @user1584421

@Juraj Я никогда не видел ответа timemage. И из комментария я не могу сделать вывод о его содержании. -- В вопросе упоминается не проблема с библиотекой, а с соединениями., @the busybee

@user1584421 user1584421 ПОЖАЛУЙСТА, отредактируйте свой вопрос, если проблема, которую вы описываете в прозе, устранена. Или лучше удалите вопрос и опубликуйте новый с актуальным вопросом., @the busybee

В нижней части вопроса перечислены все соединения ... Возможно, мне следует изменить название вопроса?, @user1584421

Я сделал «откат» вопроса и восстановил ответ тайммага., @Juraj

@ user1584421 Это не форум. Если на ваш вопрос ответили так или иначе, отметьте лучший ответ или, например, прокомментируйте, попросив разъяснений. Если у вас есть новая проблема, опубликуйте новый вопрос. Возможно, вы захотите отправиться в [тур]., @the busybee

@Juraj Большое спасибо! Сейчас намного лучше., @the busybee

просто небольшое замечание. user1584421 является участником в течение 8 лет и имеет более 1300 очков репутации из более чем 50 вопросов и 6 ответов., @Juraj