[Из песочницы] Управление шторой по интерфейсу RS-485
О пользе управления шторой через 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. О чем отчитаюсь в следующей статье.