ШЛЮЗ СВЯЗИ: ESP8266 и преобразователь MAX485
Одним из самых бюджетных вариантов шлюза связи для комплекса DispSky, является использование Wifi-модуля, основанного на чипе ESP8266, совместно с модулем-преобразователем, основанном на чипе MAX485.
ESP8266 подключается к серверам DispSky через WiFi-канал связи, затем полученные пакеты преобразуются и передаются по шине интерфейса RS485, при этом не требуется «белый» IP-адрес. В свою очередь, к шине интерфейса RS485 могут быть подключены различные устройства для опроса, такие как: контроллеры, модули, считыватели, счётчики электроэнергии, расходомеры и прочее.
Для подключения могут использоваться различные модули, основанные на чипе ESP8266: ESP-01, ESP-07, ESP12, NodeMcu и другие. В качестве преобразователя UART TTL в RS485 также возможно использовать модули, основанные на различных микросхемах, в том числе и неуправляемых. Для стабильной работы мы рекомендуем использовать модули, основанные на микросхеме MAX485.
Дальнейшие инструкции описывают подключение контроллера Овен ПЛК110-M v2 по интерфейсу RS485, с помощью модуля ESP-01 и преобразователя на основе микросхемы MAX485. Опрос происходит по протоколу Modbus RTU. Аналогичным образом к комплексу DispSky можно подключить и другие устройства, поддерживающие интерфейс RS485, при этом обеспечивается широкий спектр различных протоколов опроса. Такими устройствами могут быть контроллеры и модули ввода-вывода, счётчики электроэнергии, регистраторы, считыватели, расходомеры и другие устройства.
Для подключения к комплексу DispSky необходимо:
Для того, чтобы контроллер опрашивался комплексом DispSky, необходимо сформировать на нём модуль Modbus RTU Slave. При этом, будет опрашиваться любой контроллер, любого производителя, поддерживающий указанный стандарт — Modbus RTU.
Для работы с контроллером Овен ПКЛ110-М v2 необходимо запустить среду разработки CoDeSys v2.3
Создайте пользовательское программное обеспечение в контроллере Овен ПЛК-110.
Перейдите: «Ресурсы» (1) -> «Конфигурация ПЛК» (2) -> «Modbus (slave)» (3) -> «RS-485» (4), обратите внимание на настройки интерфейса (5), протокол (6) и добавьте регистры для опроса (7):
Сформируйте прошивку и запустите контроллер.
.
В модуле ESP8266:
Скачайте скетч и откройте его при помощи среды разработки Arduino IDE:
- Укажите имя своей WiFi сети
- Укажите пароль своей WiFi сети
- Укажите адрес сервера DispSky «s1.dispsky.ru»
- Укажите порт сервера DispSky «5010»
- Придумайте свой уникальный код состоящий из 12-ти любых ASCII символов
- Установите параметры интерфейса RS485
Соедините модули между собой согласно схеме:
Подключите линию интерфейса RS485 к контроллеру, и подайте питание на модуль ESP8266. Обратите внимание, что для стабильной работы модулю требуется качественное питание 3,3 В.
В личном кабинете DispSky:
Перейдите в раздел «Конфигурация» (1) -> «Устройства» (2), добавьте (3) новый узел связи (4) (Для этого нажмите правой кнопкой мыши на свободной области поля «устройства»):
Во всплывающем окне введите параметры узла связи:
- Придумайте название
- Выберите режим настройки — HF2211
- Введите код, который вы указали в скетче
Во всплывающем окне введите параметры устройства:
- Придумайте название
- Выберите протокол — Modbus поверх TCP (RTU)
- Введите идентификатор (адрес) устройства. Устанавливается в среде разработки, по умолчанию — 1
Для просмотра и добавления регистров для опроса в контроллере нажмите на кнопку «Теги»:
Для добавления тегов нажмите кнопку «Добавить» (1) и введите параметры регистров (2):
При выборе адресов учитывайте расположение регистров в разделе «Конфигурация ПЛК»:
Проконтролировать передачу данных возможно в настройках соединения, путем выбора вкладки «Диагностика»:
Для удобного и наглядного контроля за параметрами программы Вы можете сделать мнемосхему и видеть все показатели в ОнЛайн режиме в личном кабинете из любой точки в мире.
Документация:
Программное обеспечение:
Техническая поддержка
При возникновении дополнительных вопросов по работе сервиса DispSky вы можете обратиться в службу технической поддержки по телефонам, указанным на нашем сайте, а так же по e-mail support@dispsky.ru или по телефону +7 (921) 432-68-48.
193318, Санкт-Петербург, ул. Ворошилова, д. 2, БЦ «Охта»
Время приема: с 9.00 до 18.00 (время московское)
Управление шторой по интерфейсу RS-485. Часть 2: добавляем WiFi
Задачу минимум мы выполнили – протестировали, как работает мотор AKKO AM72E по интерфейсу RS485. Теперь мы можем повелевать солнечным светом, посылая электроны по проводам. Очевидный следующий шаг – это переход от управления при помощи элементарных частиц к управлению при помощи вибраций, т.е. радиоволн. Заклинания, которые мы будем при этом использовать, зависят от магии, которую мы выберем.
Любая беспроводная технология подошла бы для наших целей, но мне захотелось управлять шторами со смартфона. При этом желательно не устанавливать никаких дополнительных программ. Буду подключаться к домашней сети WiFi и управлять электрокарнизом при помощи браузера. Привод, через переходник RS485-UART подключу к ESP8266. Вы вполне можете пойти своим путём и использовать, например, WiFi роутер.
ESP-01 на сегодня, является самым бюджетным модулем с WiFi. Стоит он настолько мало, что, если понадобится управлять несколькими моторами, мы можем не тянуть провода от одного мотора к другому, а просто подключить каждый к своему модулю. При этом нам не нужно будет задавать каждому AM72E свой адрес – можно обращаться по адресу ESP-01. Нам ESP8266 интересен не только своей низкой ценой и небольшим размером, но и тем, что ресурсов на нём очень мало и придётся приложить немало усилий, чтобы впихнуть в него что-то, что будет работать.
Я не буду описывать, как подключить и обновить прошивку ESP8266. О том, как правильно это сделать, можно посмотреть здесь.
Под Windows, чтобы запрограммировать ESP8266, можно использовать либо Arduino IDE, и тогда мы пишем на C (ну, почти), либо NodeMcu, и писать можно на Lua. Другие варианты тоже есть, но нам они не подходят.
Нет, не торопимся заливать NodeMcu. Прошивку нужно подготовить. Ресурсов на ESP-01 недостаточно для того, чтобы мы могли забывать о них, если хотим поднять Web сервер. На плате есть flash ROM – место, где будут храниться все наши файлы — 512 кбайт. Это уже крайне мало, но упираться в нехватку ресурсов мы начнём не во-флеше, а в ОЗУ. SoC ESP8266 имеет область RAM 64 кбайт для кода программ, и 96 кбайт для данных. При старте данные из флеша загружаются в ОЗУ. Если мы зальём стоковую прошивку NodeMcu и посмотрим на величину доступной памяти, то увидим вот что:
21 кбайт! При таких объёмах придётся экономить каждый байт! Ещё видим после строки «Can’t autodetect firmware, because proper answer not received» какой-то мусор. Это отладочная информация, выдаётся на скорости 74 880, затем скорость меняется. Вот, как это выглядит на нужной скорости:
Ничего интересного.
Вначале увеличим объём доступного ОЗУ. Сделать это существенно, можно самостоятельно пересобрав прошивку. Исходные коды доступны, но перелопачивать весь проект только ради тестирования совсем не хочется. К тому же это придётся делать под Linux. Не то, чтобы это очень сложно, но если мы будем отвлекаться – мы никогда не закончим. Скорректировать прошивку можно по ссылке: frightanic.com/nodemcu-custom-build.
Я переставил флажок на dev096 и в окне выбора подключаемых модулей поставил дополнительную галочку возле 1-ware. Этот модуль я включил из-за одной функции — расчета CRC16. Вот так:
Вы, разумеется, можете включить или убрать те модули, которые вам нужны. Теперь вводим в форму email и жмём кнопку «Check the build status». Одноразовый email тоже подойдёт. Ждём несколько минут, и получаем письмом ссылку на файлы с прошивкой. Прошивка, в которой можно работать только с целыми числами сэкономит вам во flash с десяток килобайт. Я такую и заливал. Но вы можете сделать другой выбор. Посмотрим, зачем же мы так старались:
Теперь нам доступно 35 кбайт ОЗУ.
Прежде, чем мы перейдём к программированию, вернёмся ненадолго к переходнику UART-RS485. К той его части, которая отвечает за переключение приём-передача. К резистору R1. При загрузке ESP8266 устанавливает все выводы GPIO в режим входов, и затем программа определяет, в каком режиме будет работать каждый GPIO. Оказалось, что в момент загрузки на контакте TX_UART (U0TXD) должен быть высокий уровень, иначе не стартует программа, записанная во-флеше. Без R1 при опросе контакта TX будет считан низкий уровень и произойдёт «подвисание» ESP8266 до тех пор, пока переходник не будет переподключен.
От всей схемы переключения приём-передача можно отказаться, задействовав при этом один из контактов GPIO. Но доступных GPIO на ESP-01 и без того мало, и возможно, в вашем проекте им найдётся другое применение. К тому же со схемой переключения, сделанный нами переходник можно использовать, например, с роутером, у которого нет GPIO.
Проект состоит из трёх файлов: data, index.html и init.lua. Правильнее считать это не проектом, а прототипом. К примеру, нет никакой авторизации, кроме как при подключении к роутеру. И я совсем не уверен, что сервер на ESP8266 способен противостоять атакам. Код никак не проверяет, кроме как при подключении, есть подключение к сети или оно пропало. Нет кода, который позволит автоматически перезапустить ESP8266, если программа зависла. Последние две задачи легко решаются, но проект при этом стал бы сложнее.
Файл data вам нужно отредактировать – вписать туда название и пароль вашей сети WiFi. Подключив ESP8266 к сети, мы получим возможность управлять шторами через интернет. После того, как завершите отладку init.lua, переменной debug присвойте значение false, либо вовсе её удалите. Так меньше мусора будет сыпаться в UART. Если этого не сделать, то привод может не работать. К тому же AKKO AM72E всё равно не сможет понять, что вы ему пишите. При этом функцию log и все строки, в которых она упоминается в init.lua можно также удалить.
Вернёмся к теме экономии ресурсов. Файл data, с моими названием сети и паролем, занимает в памяти 1643 байта. Если вы ещё не догадались, то этот файл — обычный файл lua. Его можно скомпилировать. После компиляции этот же файл занимает уже 1040 байт. То же самое вы можете сделать с init.lua. Размер файла можно ещё уменьшить. Нужно выкинуть из него все лишнее, прежде всего комментарии и пробелы. Файл при этом становится плохо читаемым, но если нам нужно больше места, на это придётся пойти. Это обычная практика. В конечном счёте, красивое и правильное оформление вашего кода никто не оценит. Ну, разве что конкуренты, когда ваш код попадёт к ним. Зато урезанный функционал будет сразу заметен. Особенно, если будет с чем сравнивать. Когда программируются устройства с небольшими ресурсами, приоритеты меняются. Часто именно поэтому программы, написанные на C для встраиваемых систем, плохо читаемы. Всё усложняется перекладыванием на препроцессор всего, что только можно. Если начав проект на C, вы отложите его на пару месяцев, то вам может потребоваться приличное время, чтобы разобраться в своём же коде. На сопровождение кода внимание обращается меньше, т.к. за три — пять лет появляется новое железо и всё приходится переписывать заново из-за изменившейся архитектуры.
После того, как я вручную удалил всё лишнее из файла data, он стал занимать 705 байт. При этом размер можно ещё сократить на несколько десятков байт, если переменным давать не осмысленные имена, а имена из одной буквы (да, да, это совсем не то, чему нас учат в школе). После его компиляции файл data.lc занимает во флеше 728 байт – упс! Даже так бывает!
Про index.htm сказать особенно нечего. У себя я ещё добавил к нему картинку в формате svg. Вы тоже можете это сделать. Просто залейте файл curtain.svg во флеш ещё одним файлом.
Init.lua – основной файл проекта. В самом файле есть комментарии и если что-то непонятно, можно запустить построчное выполнение и вообще экспериментировать до полного прояснения. Кроме UARTA, ещё есть переключение светодиода, подключенного к GPIO2. Файлы при отдаче сервером считываются из флеша и передаются блоками по 512 байт. Это снижает требования к размеру доступного ОЗУ.
В коде этого нет, но если возникнет необходимость посчитать CRC16, то делается это командой ow.crc16(buf, crc). К примеру, если набрать в командной строке:
=ow.crc16(‘\85\00\00\03\01’, 0xFFFF)
Получим:
15593
Нужно только не забыть, первым отправить младший байт, а затем старший.
Вот, что в итоге получилось:
Здесь должно быть видео )