Переходники для интерфейса RS-485
-
Добрый день.
Имеется Raspberry Pi 2 и 2 переходника для интерфейса RS-485:
такой: UART-RS485
и такой: USB-RS485. Оба выполнены на микросхеме MAX485.
Изначально задача была в том чтобы через RS-485 опрашивать электросчетчики. Но пока не получилось это сделать ни с одним из преобразоавтелей.
Тогда я решил, что если их соединить между собой то я смогу проверить их работу, передавая данне с одного на другой.
Первый преобразоавтель подключил по этой схеме. Второй просто подключил в USB порт. Между собой их соеднил проводом A-A, B-B.
Для работы первого преобразователя потребовалось изменить опции загрузки ядра (убрать консоль ядра с uart, система — raspbian 8.3). Также пользователь pi был добавлен в группу dialout (владелец устройств /dev/ttyAMA0 и /dev/ttyUSB0).
К первому преобразователю (подключенному через UART) обращаюсь через устройство /dev/ttyAMA0, ко второму — /dev/ttyUSB0.
Проверяю так. В одном окне запусаю команду «cat /dev/ttyUSB0», в другом — «echo test > /dev/ttyAMA0». В результате в первом окне вижу слово test, т.е. в эту сторону передача данных работает. Потом проверяю ноборот: в одном окне запусаю команду «cat /dev/ttyAMA0», в другом — «echo test > /dev/ttyUSB0». В результате во втором окне слова test уже не вижу. Т.е. при записи данных в устройство /dev/ttyUSB0 они не читаются из /dev/ttyAMA0. Получается что обмен работает только в одну сторону.
Также пробовал проверять через ser2net. Создал такой конфиг /etc/ser2net.conf:
2000:raw:600:/dev/ttyUSB0:9600 8DATABITS NONE 1STOPBIT
2001:raw:600:/dev/ttyUSB1:9600 8DATABITS NONE 1STOPBIT
2002:raw:600:/dev/ttyUSB2:9600 8DATABITS NONE 1STOPBIT
2003:raw:600:/dev/ttyAMA0:9600 8DATABITS NONE 1STOPBITЗапускаю ser2net, пробую подключиться, в одном окне (подключение к /dev/ttyUSB0):
pi@raspberrypi:~ $ nc localhost 2000
во втором окне (подключение к /dev/ttyAMA0):
pi@raspberrypi:~ $ nc localhost 2003
В этом случае, все что набираю во втором окне, видно в первом. Все что набираю в первом окне — не видно во втором. Та же ситуация — все что пришется в преобразователь подключенный в uart можно прочитать через преобразоавтель подключенный через usb, а наоборот уже нет. Опять таже ситуация с одностронней свзью.
Два одинаковых USB преобразователя между собой отлючно работают. 2 преобразователя через UART проверить не могу, т.к. uart на плате один.Сам пока склоняюсь к некорректной работе преобразователя, подключенного через UART. Как я понял, кто-то должен переключать режим работы интерфейса в микросхеме MAX485 в этом случае с приема на передачу. Как я думаю, в этом случае за это должны отвечать пины GPIO 23,24, к которым подключены контакты DE,RE. Но, как RaspberryPi узнает об этом? Думаю здесь должна быть какая-то программная проддержка со стороны RaspberryPi.
Что может быть не так?
Разные уровни сигналов?
Полярность соединения между собой преобразователей не та? (проверял наоборот — вообще ничего не передаётся).
Преобраpователи реализуют «разные» RS-485?
Нужен драйвер для преобразователя, подключенного через UART? -
Лучше использовать screen, а не cat
По теме — без осциллографа тут не разобраться, тыкайте в линию щупом осциллографа и смотрите что передаётся.
Скорее всего переходник бракованный, на алиэкспрессе 90% товаров для радиолюбителей — просто китайский нерабочий хлам.
-
Лучше использовать screen, а не catНадо будет попробовать.
По теме — без осциллографа тут не разобраться, тыкайте в линию щупом осциллографа и смотрите что передаётся.Думаю что во многом пробелму решит удалось. Все дело в подключении переходника через UART. Там есть 2 контакта DE и RE, которые отвечают за переключение работы схемы либо на прием, либо на передачу (как я понял из описания MAX485). Так вот этими контактами кто-то должен управлять (подавать на них высокий уровень напряжения, когда нужно передать или принять данные). Если подключать по схеме которую я приводил выше, то ничего работать не будет (если не использовать их конфиг и их приложение), поскольку Raspberry Pi ничего не знает о том, что нужно переключать переходник с приема на передачу. В этом случае будет работать в одну сторону.На одном из форумов нашёл, что для работы UART нужно задействовать не только RX и TX, но и еще RTS и CTS. Функции RTS и CTS могут выполнять GPIO 16 и GPIO 17, если выставить режим работы alt3. Подробнее о нумерации пинов и их функциях можно посмотреть (таблица 6-31) здесь (да, документ для чипа BCM2835 (модель B+), в модели 2 чип BCM2836, но в некоторых источниках пишут что распиновка выводов полностью совместима).
Для настройки выводов GPIO понадобится пакет wiringpi.sudo apt get update
sudo apt get install wiringpiПосмотреть режим работы GPIO можно так:
gpio readall
Важно не запутаться в нумерации выводов, поскольку сам чип, библиотека wiringpi, и расположение пинов на плате видят один и тот же физический пин под разыми именами.
Включим RTS на 11 физическом пине (он же GPIO 17)
gpio -g mode 17 alt3
Включим CTS на 36 физическом пине (он же GPIO 16)
gpio -g mode 16 alt3Какой пин подключать к DE, а какой к RE пока не разобрался. Попробовал в одном варианте — не работает, поменял местами — заработало. Причем передача и получение работали в обе стороны.
Но потом, что-то ещё менял, в итоге получилось что вижу то, что отправлял, т.е. получаю эхо.
Причем эхо приходит, даже если отключить линию данных совсем. На одном форуме нашел, что это может быть из-за того, что во время отправки данных не отключается режим приема данных с линии, т.е. должны работать те самые RTS/CTS. Как исправить — пока не знаю. Нужно точно разобраться с тем как работают RTS/CTS и что должно подключаться к контактам переходника DE,RE. Осциллограф и умение им пользоваться (вкупе с пониманием того что должно происходить на линии) здесь бы здорово пригодились, но их нет.
Пока из мыслей либо переустановить систему, либо попробовать использовать uart с явным укзанием использования rts/cts (minicom,ser2et,pyserial,screen?). -
Как оказалось, переходник USB-RS485 основан на чипе CH340G, за работу которого отвечает драйвер ch341. Текущая версия драйвера не поддерживает установку четности и 7 бит данных, нужных мне для опроса счетчика. Но в сети нашлись более свежие исходники этого драйвера. После сборки и утсановки его, появилась поддержка режима 7DATABITS/EVEN/1. Подробнее о том как загружать именно этот драйвер при подключении переходника — здесь.
А здесь есть отличное описание переходника UART-RS485. Идея там в том, чтобы ардуина сама управляла чипом: принимать или передавать данные. Причем два выхода его DE и ~RE объединены и управляются цифровым выводом ардуины. Как это связать с работой RTS/CST сигналов и настройкой устройства /dev/ttyAMA0 (нужно ли делать stty -F /dev/ttyAMA0 crtscts или это ничего не даст?) пока не придумал.
Для проверки работы удобно использовать picocom. В нем на лету можн перключать скорость устройства, режимы четности и количество бит данных. Даже управлять линией DTR можно.
-
Очень интересует тема работы raspberry через UART-RS485. Что в итоге у вас получилось? Я не смог заставить работать именно потому, что непонятно, как включать разрешение на передачу
-
Читайте документацию javascript:nicTemp();RE - Receiver Output Enable. RO is enabled when RE is low; RO ishigh impedance when RE is high.Это просто пин включения приемника.DE - Driver Output Enable. The driver outputs, Y and Z, are enabled by bringing DE high. They are high impedance when DE is low. If the driver outputs are enabled, the parts function as line drivers. While they are high impedance, they function as line receivers if RE is low.Это пин включения передатчика. Зачем вам RTC/CTS ?