Skip to content
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи
Collapse
  1. Главная
  2. Raspberry Pi
  3. Переходники для интерфейса RS-485

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

Запланировано Прикреплена Закрыта Перенесена Raspberry Pi
6 Сообщения 1 Posters 134 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • piP Не в сети
    piP Не в сети
    pi
    написал в отредактировано pi
    #1

    Добрый день.
    Имеется 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?

    1 ответ Последний ответ
    0
    • piP Не в сети
      piP Не в сети
      pi
      написал в отредактировано
      #2

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

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

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

      1 ответ Последний ответ
      0
      • piP Не в сети
        piP Не в сети
        pi
        написал в отредактировано pi
        #3

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

        1 ответ Последний ответ
        0
        • piP Не в сети
          piP Не в сети
          pi
          написал в отредактировано pi
          #4

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

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

          stty -F /dev/ttyAMA0 crtscts
          

          или это ничего не даст?) пока не придумал.

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

          1 ответ Последний ответ
          0
          • piP Не в сети
            piP Не в сети
            pi
            написал в отредактировано
            #5

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

            1 ответ Последний ответ
            0
            • piP Не в сети
              piP Не в сети
              pi
              написал в отредактировано pi
              #6

              Читайте документацию 
              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 ?

              1 ответ Последний ответ
              0

              • Войти

              • Нет учётной записи? Зарегистрироваться

              • Login or register to search.
              • Первое сообщение
                Последнее сообщение
              0
              • Категории
              • Главная
              • Документация
              • Последние
              • Пользователи