О пользе управления шторой через rs-485


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

Самым простым было бы найти переходник USB-RS485 и начать тестирование. Но такого переходника поблизости не оказалось. Если заказывать, пришлось бы какое-то время ждать. Быстрее сделать. У меня есть несколько переходников USB-UART на всех популярных микросхемах, но пользуюсь я в основном парой переходников на CP2103. Выглядят они примерно так:



Примерно, потому что установлены разъёмы и выведены дополнительные сигналы. Всего-то нужно сделать переходник UART-RS485. В магазине были куплены несколько MAX485. Возможно, было бы проще, использовать что-то вроде MAX13487 c автоматическим переключением передачи и приёма. Но в местном магазине я таких не нашёл (возможно просто плохо искал). Честно говоря, мне и за MAX485 ехать в магазин было лень. Поначалу было желание сделать приём на ОУ, а передатчик на транзисторах — это же так просто протестировать работает электрокарниз AM72E по этому протоколу, или нет.

Назад в «Современную электронику»


Дело за схемой. За основу я взял схему из журнала «Современная электроника» №1 за 2007г. Выглядело всё радужно. В статье говорится, что «Выводы GPIO микроконтроллера CP2103 по-умолчанию запрограммированы как управляющие выходы и соответствуют их использованию в схеме адаптера USB-RS485». Оказалось, что это не мой случай. Переходники у меня давно. Редкая вещь, попавшая мне в руки, не подвергается «улучшению». Прошивки в переходниках небыли исключением и даже если в девичестве могли понукать RS485, то теперь эти навыки были напрочь отшиблены.

Вечер переставал быть томным. Нужно было что-то, что переключит MAX485 с передачи на приём. Кстати, на передачу переходник отлично работал. В общем-то, и этого могло оказаться достаточно т. к. читать с AM72E особенно нечего.

Вариантов было много. MAX485 на плате установлен на панельку, и без труда может быть заменён на микросхему, с автопереключением приём-передача. Но это вообще не вариант т. к. надо ехать в магазин. Ещё у меня есть переходники на FT232, а эти микросхемы могут переключать MAX485. Слишком просто. И у меня уже зрел план, как мне поразвлечься с AM72E и для FT232 места в нём не было. Нужно дополнить схему так, чтобы при появлении стартового бита на TX UART'а, MAX485 переключилась с приёма на передачу и находилась в этом состоянии на время передачи всего байта, а затем снова переключилась на приём. Обратившись к накопленному до меня опыту через google, я выяснил, что решается эта проблема при помощи таймера NE555. Действительно, чего мудрить. Но ничего из таймеров семейства NE555 у меня не было. Дальше вы знаете: магазин — лень.

Одновибратор для лентяя… не нужен


Сделать одновибратор можно миллионом способов. Я даже хотел по-быстрому переделать плату и поставить STM8S003 для этих целей. На первый взгляд это может выглядеть как из пушки по воробьям, но если вы сравните схемы на NE555 и STM8S003, то схема на МК окажется даже проще т. к. из внешних элементов нужен только один конденсатор. Программа — буквально несколько строчек на ассемблере. С ценой тоже всё неплохо — стоит дешевле, чем MAX485 в нашем магазине. С аппаратным таймером (на NE555) есть одна проблема. Он отлично будет работать на одной скорости. Как только вам будет нужно изменить скорость обмена, вам придётся перестраивать таймер. Мне частенько попадаются устройства, которые при старте выдают в UART отладочную информацию на одной скорости, а после загрузки переходят в режим обмена на другой. Да и мало ли почему вам может потребоваться изменить скорость! Каждый раз лезть при этом в схему не захочется. Вот тут-то таймер на STM8 может помочь — программу можно написать так, чтобы нужные тайминги выставлялись по-сигналу и не требовали вмешательства. Это не очень сложно. Я вообще не понимаю, почему мне нужно что-то знать о скорости обмена по UART. Ещё много лет назад мне попадались устройства UART, которые автоматически определяли скорость, на которой подключилось другое устройство и на лету на неё настраивались.

Я знаю, что вам хотелось бы увидеть схему без STM8S003. Ладно, пойду вам на встречу. И без этого я сумею из простого теста сделать что-то интересное. В схеме вообще не будет одновибратора:



Что и как здесь работает, объяснять не буду — всё стандартно и очевидно. Скажу только, что перемычки возле резисторов R5 и R7 я не ставил, т. е. схему можно сделать проще, убрав все перемычки и эти два резистора. Максимум, что вам может понадобится, это R5. Встречаются устройства, которые при ответе, просто отпускают линию при передаче последних битов, если это единицы. Тогда, без R5, последний байт может искажаться. В нашем случае это не принципиально т.к. последним передаётся старший байт контрольной суммы ответа. Схема будет работать и без R1, но нам он понадобится позже.

У меня это выглядит так:



Не расстраивайтесь, если не видите всех элементов, которые есть на схеме. Я вначале сделал плату по схеме из статьи, а затем экспериментировал со схемой переключения приём-передача. Транзистор (DTC143 в SOT23, сразу с базовым резистором) и SMD резисторы напаяны прямо на дорожки с обратной стороны платы.

Если вы поставите MAX13487, то от схемы вообще ничего не останется. Ещё лучше — возьмите стандартный переходник USB-RS485. Но тогда вы будете привязаны проводами к шторам. Глупое зрелище. Стал бы я заморачиваться с переходником UART-RS485, если бы у меня не было коварного плана?

Lua нам в помощь


С железом на этом закончим. Надо писать программу. Программа только для теста. Ничего сложного. Нужно команды для AM72E отправить в последовательный порт. Ну, ещё можно почитать, что он там нам отвечает. Для опытов возьмём компьютер с Windows. Надо выбрать язык, на котором будем писать. Первое, что мне пришло на ум — powershell. Не, не буду я вас мучить powershell. Тогда python. Всем хорош питон — код на нём переносим на любую операционку, понятен, можно сразу прикрутить графический интерфейс, а для Windows ещё и упаковать как экзешник так, что мало кто поймёт, что программа на питоне. И всё равно не python. Примеров работы с последовательным портом на питоне и без этого много — желающие могут найти самостоятельно. Программу напишем на Lua. Да уж, странный выбор. Вообще-то выбора у меня большого и не было. Либо C, либо Lua. Почему — об этом позже. Можно и на C. Но нет, не в этот раз. Просто потому, что на C я пишу код так, что через пару месяцев сам не могу его понять, не приняв веществ расширяющих сознание. Шучу. Так я пишу на любом языке.

Lua нужно установить. Берём отсюда: https://code.google.com/p/luaforwindows/downloads/list. Устанавливается практически в один клик. В комплекте достаточное количество модулей. Есть всё необходимое. В том числе и для графического интерфейса — iup. Если решите, что он вам понадобится — используйте на здоровье. Но мы обойдёмся командной строкой. Нам только для тестирования. И нам понадобится модуль, для работы с последовательным портом. Если бы мы решили проводить тестирование под Linux или Mac OS, то с последовательным портом можно было бы работать без дополнительного модуля — просто как с файлом. Для доступа к UART под Windows нам нужен модуль luars232. В сборке он уже есть. Дополнительно ничего искать и устанавливать не надо.

Файл с программой — curtain.lua — всего несколько десятков строчек. При желании можно ещё сократить. Как пользоваться, объяснять не буду. Покажу картинку:



Сделаю только одно пояснение. Это и так очевидно, но если строка начинается с символа «>», то эта строка введена с клавиатуры. Если этого символа в начале строки нет, то строка получена от программы.

Я и не рассчитывал, что всем всё будет понятно. Командная строка, как и провода, нам не понадобятся. Сейчас важно только то, что RS485 на AM72E прекрасно работает. Нет, у меня был момент, когда всё собрав и проверив, я начал отправлять команды в AM72E, а он никак не реагировал. Мысль о том, что RS485 всё-таки не работает, промелькнула у меня в голове. Но потом я посмотрел под стол, туда, где у меня сетевой удлинитель, и увидел, что AM72E надо бы ещё подключить к сети. После этого, при отправке команды «Close», я услышал весёлое жужжание двигателя — всё работает.

Чуток передохну и перейду к реализации своего «коварного плана» — научу свой электрокарниз принимать команды через WiFi. О чем отчитаюсь в следующей статье.

Комментарии (17)


  1. dimao79
    11.11.2015 13:35

    Не нравится мне такая схема переключения приема-передачи, ой как не нравится. У меня сделано так

    image


    1. dimao79
      11.11.2015 13:54
      +3

      Рисовал схему по готовой плате, коллектор с эмиттером местами перепутал, сорри. Так правильно

      image


    1. Osmosis
      11.11.2015 16:26
      -1

      Схема в статье более правильная. Вы не учитываете, что питание MAX485 может быть и 12 вольт (по схеме 5 вольт, но и это уже делает Вашу схему нерабочей), а управляющие сигналы с UART от CP2103 — 3,3 вольта. При таких уровнях транзистор по Вашей схеме будет всегда открыт и никакого переключения не будет.


      1. dimao79
        11.11.2015 17:43
        +1

        Схема в статье неправильна чуть более, чем полностью. У вас режим работы трансивера (прием или передача) зависит от того, какой лог.уровень он передает. И если оно работает — то за счет подтяжек на линиях А/В. Если у вас вся схема питается от 3,3 а трансивер от 12 — используйте левелшифтеры, в любом их виде.

        Обратите внимание на конденсатор с RE/DE на землю. Отличие между вашей и моей схемами именно в нем.


        1. Osmosis
          11.11.2015 19:00

          Хорошо. Никто не настаивает на каком-то конкретном варианте. Наоборот, предложено целых четыре: на MAX13487, NE555, STM8S003 и на транзисторе. Все предложенные варианты опробованы и работают. Можете сделать схему с преобразованием уровней, оптической развязкой и всем, что ещё захочется.


          1. dimao79
            11.11.2015 19:20

            Это ваше устройство, делайте как считаете нужным. Вам указали на ошибки, исправлять их или нет — дело ваше.

            И еще — хорошо, что вы подключились к шторе, а не к 100КВт частотнику в зашумленном цеху, и хорошо, что ваша штора не работает на скоростях под 1Мбит/с.


            1. Osmosis
              12.11.2015 10:39

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


              1. dimao79
                12.11.2015 10:58
                +1

                Поделился тем, что каким то чудом оно заработало? Отличный результат!

                Только вы не учитываете одного, завтра кто либо захочет подключить комплекс пуска баллистических ракет к очередному клону Ардуины, и, не имея навыков в схемотехнике, нагуглит вашу схему. И если оно не заработает, то виноваты будут все — от разработчиков Ардуины до разработчиков ракетного комплекса. Но не он, ведь нагугленная схема, как тут написано, более правильная, и вообще, штора то работает! А то, что оно сделано с нарушением стандартов — так мелочи какие, не ракетный комплекс же подключали, а всего лишь штору!


  1. vladimir_open-dev
    11.11.2015 14:14

    Зачем это все? Ладно была бы 2102… 2103 имеет GPIO, которые через прогу CP21xxCustomizationUtility можно настроить на RS-485 flow control. Давно у меня была проблема, что этот сигнал появлялся, но был инвертирован, что решилось простым инвертором на транзисторе.


    1. Osmosis
      11.11.2015 16:28

      А мы не хотим быть привязаны к CP2103, нам нужен переходник UART — RS485. UART любой, например с платы роутера.


      1. vladimir_open-dev
        11.11.2015 17:00

        У вас в течение бита передачи микросхема переключается на прием… что-то мне подсказывает, что в лучшем случае будет работать не надежно. Схема dimao79 в этом отношении лучше, но она зависима от скорости.


        1. Osmosis
          11.11.2015 18:58

          Ага, чтобы нормально работало поставили R4. Схема чуть продуманней, чем кажется.


          1. vladimir_open-dev
            11.11.2015 22:21

            ничуть


            1. dimao79
              11.11.2015 22:48
              +1

              Я вообще не понял, как подтяжка выхода приемника может влиять на работу передатчика. И что в этом такого продуманного?

              По моему все просто, при передаче лог.0 на DE — 1, А=0, B=1. При передаче лог.1 на DE — 0, выходы А и В в высокоомном состоянии, и благодаря резисторам подтяжки линия А в высоком состоянии, В — в низком. Что приемником штор интерпретируется как передача лог.1

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


  1. UA3MQJ
    11.11.2015 14:57

    Спасибо, что не ардуино опять! )
    Вопрос выбора ЯП для таких задач — дело не простое. Делал я генератор DDS, попробовал HTML и плагины для работы с СОМ, попробовал питон, да так в итоге на Qt и запрограммировал.


  1. prostosergik
    12.11.2015 01:26

    Стал бы я заморачиваться с переходником UART-RS485, если бы у меня не было коварного плана?

    … я думал, сейчас будет «А теперь подключим это к ESP8266!»

    … и почти не ошибся =)

    UART любой, например с платы роутера.


    1. Osmosis
      12.11.2015 10:41

      Все правильно) Это будет во второй части.