Форумы » Эксплуатация » Подключение устройств и микросхем к Raspberry Pi

Переходники для интерфейса RS-485

fort


Сообщений: 3

отправлено 26 Апрель 2016 в 11:17

Добрый день.

Имеется 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?

raspiman


Сообщений: 0

отправлено 26 Апрель 2016 в 19:30

Лучше использовать screen, а не cat



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



Скорее всего переходник бракованный, на алиэкспрессе 90% товаров для радиолюбителей — просто китайский нерабочий хлам.

fort


Сообщений: 3

отправлено 27 Апрель 2016 в 11:05

Лучше использовать 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?).

fort


Сообщений: 3

отправлено 30 Май 2016 в 17:47

Как оказалось, переходник USB-RS485 основан на чипе CH340G, за работу которого отвечает драйвер ch341. Текущая версия драйвера не поддерживает установку четности и 7 бит данных, нужных мне для опроса счетчика. Но в сети нашлись более свежие исходники этого драйвера. После сборки и утсановки его, появилась поддержка режима 7DATABITS/EVEN/1. Подробнее о том как загружать именно этот драйвер при подключении переходника — здесь.



А здесь есть отличное описание переходника UART-RS485. Идея там в том, чтобы ардуина сама управляла чипом: принимать или передавать данные. Причем два выхода его DE и ~RE объединены и управляются цифровым выводом ардуины. Как это связать с работой RTS/CST сигналов и настройкой устройства /dev/ttyAMA0 (нужно ли делать stty -F /dev/ttyAMA0 crtscts или это ничего не даст?) пока не придумал.



Для проверки работы удобно использовать picocom. В нем на лету можн перключать скорость устройства, режимы четности и количество бит данных. Даже управлять линией DTR можно.

yrichs


Сообщений: 2

отправлено 16 Август 2018 в 13:57

Очень интересует тема работы raspberry через UART-RS485. Что в итоге у вас получилось? Я не смог заставить  работать именно потому, что непонятно, как включать разрешение на передачу

Irshat


Сообщений: 1

отправлено 23 Август 2018 в 13:58

Читайте документацию javascript:nicTemp();
RE - Receiver Output Enable. RO is enabled when RE is low; RO is
high 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 ?

Для того, чтобы написать сообщение в тему, необходимо авторизоваться!