Как стать автором
Обновить

Шлюз Modbus RTU с поддержкой Ethernet

Время на прочтение5 мин
Количество просмотров11K

Существует большое разнообразие WI-FI модулей на основе чипа ESP32. Как правило, основной канал передачи и получения данных  WI-FI, реже Bluetooth, т.е. беспроводные технологии, не требующие дополнительного «обвеса».  Достаточно создать web страницу и используя браузер управлять всеми настройками.  Используя эту концепцию мне удалось создать серию интерфейсных плат в разном форм-факторе, от встраиваемых  до внешних универсальных  с дополнительными функциями.   Пришло время добавить и проверить работу  проводного интерфейса Ethernet.

От простого к сложному

Для wi-fi вариантов плат первый установленный на плату модуль самый простой и  распространенный ESP-WROOM-32.

Далее с добавлением новых функций и протоколов столкнулся с нехваткой HEAP памяти при одновременном запуске нескольких сервисов, самыми «прожорливыми» оказались TelegramBot и HomeKit, решено было использовать модуль со встроенной памятью psram ESP32-WROVER, попутно адаптировав установочное место под оба варианта модулей.

Ethernet и esp32 pico d4

Чтобы не увеличивать габариты платы и сохранить совместимость с предыдущими версиями решено вместо модулей ESP32 использовать SIP модуль ESP32-PICO-D4, самый миниатюрный модуль из всей линейки Espressif  ESP32.  В его 48-выводном QFN корпусе упаковано практически все, что находится под металлическим экраном ESP-WROOM-32. Его применение было успешно опробовано в миниатюрном «походном» варианте интерфейса в формате USB флешки.

Использование PICO-D4 значительно экономит пространство на плате, но при этом отсутствует возможность установить расширенную память psram.  Хорошая новость в том, что при использовании канала Ethernet, wi-fi можно отключить, в таком варианте  остается почти в 2 раза больше свободной памяти чем при использовании WI-FI.

WI-FI остается резервным каналом на  случай когда кабель Ethernet отключен,  в этом случае на модуле запускается точка доступа. К ней можно подключиться с телефона или компьютера для настройки модуля через WEB интерфейс.  Также точка доступа кратковременно включается при подаче питания на интерфейсную плату, для того чтобы узнать  полученный IP адрес. Через 15 секунд . если не было подключения в режиме точки доступа, WI-FI выключается, если по истечении этого времени телефон или компьютер остаются подключенными, то режим AP выключается после отключения всех устройств от модуля Wi-FI.

Так как ESP32 имеет встроенный контроллер Ethernet,  то достаточно добавить микросхему уровня PHY и RJ45 разъем, я использую  HR911105A с трансформатором внутри.

 Для работы с интерфейсом Ethernet к чипу необходимо подключить внешнее устройство со встроенным PHY.  Такое соединение возможно с помощью 17-сигнальной линии "Media Independent Interface (MII)"  или девятисигнальной линии "Reduced Media Independent Interface (RMII)". Так как помимо Ethernet на плате используется слот для microSD карты, три линии для драйвера Modbus, два универсальных GPIO, информационный светодиод то свободных портов для подключения PHY остается только для варианта RMII по 9 линиям.

В качестве устройства с внешним PHY была выбрана микросхема LAN8720A, в компактном 24-pin QFN корпусе.

Для тактирования микросхемы PHY и контроллера Ethernet в esp32 так же понадобится сигнал с частотой 50MHz.  Можно использовать три варианта:

-внутренний источник сигнала 50MHz с esp

-внешний кварц 25Mhz

-внешний генератор 50MHz

Я проверил 1 и 3 варианты

В принципе, в отдельных случаях генератор можно не ставить, а использовать встроенный генератор с модуля esp32. На этапе макетирования я опробовал данный вариант, модуль запустился, но Espressif   в настройках при конфигурировании предупреждает: "Output RMII clock from GPIO0 (Experimental!)".  Espressif не рекомендует использовать вариант тактирования схемы от внутреннего источника на выводе GPIO0,  так как сигнал на выводе может быть нестабильным. Рекомендация использовать внешний сигнал на вход GPIO0.

Есть еще два gpio с которых можно получить тактовую частоту для Ethernet, это gpio 16 и 17. Так как у меня используется pico d4, то эти варианты не подходят из-за того, что на эти выводы назначены сигналы для расширения памяти psram,  в pico d4 psram не используется, но в модуле ESP32-WROVER она используется и чтобы не терять совместимость, решено было использовать внешний генератор 50 MHz.

Но и тут есть «грабли», так как выход с генератора идет и на микросхему PHY LAN7820 и на вход GPIO0, то при старте может возникнуть ситуация низкого уровня на этом выводе, чтобы этого избежать, рекомендуется использовать дополнительный вывод для отключения генератора на время запуска модуля esp32. Я данный вариант предусмотрел, задействовав  практически последний незадействованный вывод, но часть генераторов при проверке не переводили свой выход в третье состояние при отключении внешним сигналом и при старте esp32 входил в режим загрузчика.

В итоге вывод отключения генератора остался в резерве, а между генератором и входом GPIO0 вместо резистора был установлен конденсатор, что дало возможность запускаться при подаче питания без риска входа в режим Boot.

Вопрос с тактированием при отладке отнял больше всего времени, остальная схемотехника запускается без особых проблем. Особенности схемотехники можно уточнить в pdf на LAN8720, и у производителей подобных решений типа Olimex. Для своих тестов я использовал такой вариант  платы с LAN8720.

В качестве старта, для проверки работоспособности использовался пример от espressif в esp-idf

examples/Ethernet/basic и examples/Ethernet/ eth2ap

Первый пример демонстрирует базовое использование драйвера Ethernet вместе с tcpip_adapter, если все настроено и подключено правильно, плата получит IP адрес который можно пропинговать.

Второй пример более сложный и реализует простой «маршрутизатор», который поддерживает  пересылку пакетов между портом Ethernet и интерфейсом точки доступа Wi-Fi. В этом случае Ethernet должен играть роль WAN (т.е. иметь доступ к внешней сети), чтобы мобильное устройство могло получить доступ в Интернет при подключении к ESP32 через Wi-Fi.

В результате собрав весь накопленный опыт и спаяв плату удалось реализовать универсальное устройство, в зависимости от используемой прошивки, плата может работать как с интерфейсом WI-Fi так и по кабелю.  В обоих случаях  все функции работают одинаково.

Для WI-Fi версии добавил возможность подключать выносную антенну, с помощью перемычки можно переключать сигнал на внешний пигтейл или на печатную антенну на плате.

При использовании Ethernet часть настроек в web интерфейсе не используется, неиспользуемые поля скрываются. Так же изменен цвет web интерфейса на красный аналогично цвету плат.

Назначение

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

Интерфейс является связующим звеном между человеком и устройством. Со стороны пользователя предоставляется доступ ко всем настройкам модуля и его функциям, а так же обновление ПО по воздуху (OTA). Со стороны прибора канал обмена информацией Modbus RTU, читая и записывая значения из регистров памяти в сетевом интерфейсе можно быстро получать информацию по разным протоколам и с разных внешних устройств.

На данный момент доступны следующие режимы работы сетевых интерфейсов:

Modbus TCP

Шлюз TCP в RTU

MQTT

HomeKit

TelegramBot

1-wire (ds18b20 до 16 шт.)

Логгер (microsd или внешний файл на ПК)

Режим цифровых вх/вых

-ШИМ 2 канала

-Генератор 0-100кГц

-Ручной энкодер

-2 DI

-2 DO

-I2C расширитель MCP23017 16 вх/вых

-i2c дисплей 1306

-i2c датчик влажности и температуры htu21

-i2c датчик атмосферного давления  и температуры bmp180

-светодиодная лента ws2812

-i2c nfc  считыватель карт (pn532)

-i2c измеритель тока/напряжения INA219

Пример реализации маршрутизатора на данной плате.

Дальнейшее развитие в корпусе на din-рейку.

Более подробно по работе со всеми функциями можно узнать из серии  видео, а так же в wiki на github.

Теги:
Хабы:
Всего голосов 21: ↑21 и ↓0+21
Комментарии5

Публикации