IoT шлюз Ethernet-RS485 на базе STM32 +27





Привет, Хабр!


Данный пост посвящён DIY разработке Ethernet-RS485 шлюза. Цель данного шлюза – обеспечение централизованного управления нодами Mysensors со стороны контроллера умного дома.


imageНедавно меня таки достали провода, дюпоны, навесная пайка и т.п. и было принято давно оттягиваемое решение — сделать свои платы с нуля, т.е. всё по серьёзному. :)
Сказано — сделано!


Первым делом была разработана и нарисована принципиальная схема шлюза, в которой я постарался учесть все свои хотелки и пожелания. Далее произведена компоновка и подгонка платы под требуемые размеры (50x50мм). И последний этап, это заказ плат на производстве. Я заказывал на фабрике JLCPCB, 5 плат — 2$ + доставка.


Данный шлюз построен на базе МК STM32F103CB(8)T6. В качестве Ethernet чипа выступает достаточно известная микросхема от WIZnet — W5500. Транспортом данного шлюза в сети Mysensors является проводной интерфейс RS485. В качестве драйвера RS485 был выбран чип — MAX13488EESA+T, в том числе и в связи с наличием у него режима автоматического выбора направления приёма/передачи.


Итак пройдёмся поподробнее по основным частям шлюза.


Сердцем шлюза является МК STM32F103CBT6 в корпусе 48LQFN. МК построен на ядре Cortex-M3, имеет 128Кб встроенной флэш памяти и 20Кб ОЗУ. Штатная частота МК — 72МГц, но если не использовать встроенный USB порт, то частоту можно разогнать и до 128МГц, он на ней вполне стабильно работает. МК питается от 3.3В. Для полноценной работы нужны два кварца, на 8МГц и 32.768КГц. Для программирования и отладки имеется интерфейс SWD. МК можно заменить и на STM32F103C8T6, он на данный момент по памяти вполне проходит.


Ethernet чип W5500. Внутри имеет ядро Cortex M0, для связи с внешним миром присутствует порт SPI (скорость до 80 МГц). При скорости 100Mbps Full Link имеет потребление в 132мА. Есть поддержка Wake on LAN, для обозначения своего режима умеет управлять 4 светодиодами 4 (SPD / DUP / ACT / Link). В наличии 32 кбайт буферной памяти RAM для обеспечения процесса передачи TCP/IP пакетов, аппаратно обеспечивает до 8 независимых TCP/UDP сокетов (канальных соединений). Аппаратно поддерживает следующие коммутационные протоколы обработки проводного TCP/IP стека: TCP, UDP, MAC, ICMP, IPv4, ARP, IGMP, PPPoE. Диапазон рабочих температур -40...85°C. Напряжение питания — 3.3В.


И наконец драйвер RS485 — MAX13488EESA+T. Микросхема в корпусе SOIC-8 150mil. Скорость передачи данных до 16 Mb/s. Рабочее напряжение — 5В, потребляемый ток — 4.5 мA. Позволяет подключать до 128 узлов на одну линию RS485. Из главных особенностей это возможность включения режима автоматического определения направления приёма/передачи, т.е. данный драйвер может подключаться напрямую к порту UART и всё! Никаких лишних телодвижений совершать не надо.


Принципиальная схема шлюза разбита на три части:


Принципиальная схема

Схема RS485 части шлюза.



Схема МК и его периферии.



Схема части Ethernet.



Т.к. шлюз в сети Mysensors является единой точкой отказа, то к нему предъявляются повышенные требования по надёжности и безопасности. И в первую очередь он должен быть гальванически развязан от самой линии RS485. Для гальванической развязки линии данных была установлена микросхема — цифровой изолятор от TEXAS INSTRUMENTS — ISO7321CDR. Для развязки по питанию был использован изолированный DC/DC преобразователь от Traco Power – TME0505S. Защита драйвера RS485 от высоковольтных импульсов при необходимости реализовывается отдельной платой. Единственно, в виду своей компактности был оставлен защитный диод (подавитель ЭСР) VD1.


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


Рендеринг шлюза

Верхний слой.



Нижний слой.



3D — вид сверху.



3D — вид снизу.



Теперь поподробнее о схеме. Для функционирования шлюза, от МК нам необходим один порт USART и один порт SPI. МК STM32F103CBT6 имеет 3 порта USART с максимальной скоростью до 4.5Mbits/s. И два SPI порта. В результате компромисса (компоновка деталей на плате), для взаимодействия с драйвером RS485 был выбран порт USART1 (ноги PB6, PB7 с ремапом). А для взаимодействия с W5500 — порт SPI1 (ноги PA4-7).


Подключение Ethernet контроллера W5500 выполнено в соответствии с рекомендациями производителя. Единственное, что может вызвать некоторые сложности, это высокоточные резисторы, которых может не оказаться в наличии в местном радиоларьке. Но на сайте lcsc.com и ему подобных с данными резисторами всё в порядке. Для Ethernet разъёма был выбран широко распространённый бюджетный модуль — HR911105A, имеющий на борту трансформатор и два светодиода.


Самое сложное в данной плате, это запаять две 48-ножечные lqfp микросхемы. Если с этим справились, то дальнейшая сборка не представляет никаких сложностей. Настроек плата не требует и сразу после сборки готова к работе.


Хоть это и шлюз, но чтобы не пропадать добру на плате были разведены практически все пины МК, разведён ресет, и два светодиода (один из них RGB). Сделаны две площадки под микросхемы, одна под I2C EEPROM и вторая для цифрового термометра/измерителя влажности HDC1080. Термометр конечно будет измерять общую температуру по больнице, так как он установлен рядом с двумя чипами, но мало ли, вдруг кому понадобиться.


В качестве разъёма для RS485 был выбран, трёх пиновый зелёный разъём DB2EV-5.08-3P, с шагом 5.08мм. Он конечно великоват, но удобен в использовании. Остальные разъёмы за исключение microUSB выбраны — 1.25мм JST, они достаточно компактны и хорошо фиксируются.


Фото собранного шлюза

Вид сверху



Вид снизу



Для питания платы необходимы 5В, которые можно подать через разъём microUSB, либо через разъём Power. 5В питание необходимо драйверу RS485, микросхеме гальванической развязки и DC/DC преобразователю. Т.к. МК STM32 и Ethernet чип требуют питания 3.3В, на плате предусмотрен LDO регулятор — на базе микросхемы LDL1117S33R. На линиях питания 5 и 3.3В установлены танталовые и керамические конденсаторы. Большинство используемых смд компонентов — 0603.


Т.к. у всех всегда ситуации и подходы бывают разные, то некоторые вещи оставлены на откуп
пользователю. Если нам не нужна гальваническая развязка от линии RS485, то мы можем не устанавливать изолирующий DC/DC преобразователь — D1, микросхему опторазвязки — D3. В таком случае надо напаять "соплей" в предназначенные для этого места на плате.


Смотреть


По необходимости устанавливаем резисторы R31, R32 и R2, защитный диод VD3.


При первом включении на столе, шлюз нормально видел ноду, прошивки в неё залетали за 30 секунд, всё было хорошо. И да, планируемая мной скорость сети RS485 — 0.5-1Mbit. В доме будет 1Mbit, на улице 0.5Mbit. Так вот когда я поставил шлюз на его рабочее место в серверную, а ноду подключил к устройству на улице, я вполне ожидаемо столкнулся с тем, что они друг друга не увидели. С помощью осциллографа я мог наблюдать весьма удручающую картину линии RS485, но пара подтягивающих резисторов R31 и R32 быстро решила данную проблему. На фото шлюза, данные резисторы подпаяны проводками. Дело в том, что изначально я не планировал ставить их на шлюз, т.к. они нужны только на концах линии RS485, а шлюз у меня планировался в середине. Но когда подключена только одна нода, они всё же нужны и поэтому они были добавлены во второй ревизии. Терминирующий резистор на 120Ом устанавливается прямо в разъём RS485, так его проще переносить от устройства к устройству при наращивании линии.


Как это ни удивительно, но плата первой ревизии показала полную работоспособность и стабильную работу. За несколько месяцев не произошло ни одного зависания. Но с другой стороны ещё не было и гроз, а данный шлюз у меня смотрит как-раз на улицу.


Но — поживём увидим! :)


Таким образом была выполнена основная задача — создать компактный, высокоскоростной и надёжный Ethernet-RS485 шлюз. Чтобы не расплываться мыслями по древу, статья сосредоточена только на железной части, а программная часть сознательно вынесена за скобки.


Репозиторий с проектом шлюза


С радостью отвечу на конструктивные вопросы.


Для интересующихся постройкой УД на базе Mysensor существует русскоязычная группа в телеграмм — https://t.me/mysensors_rus и русскоязычный сайт — mysensors.ru.


image PS Моя первая разработанная плата — универсальная нода Mysensors для сети RS485. Она про наполнению и разработке гораздо сложнее и интереснее данного шлюза. Если данная тема будет интересна, то моя следующая статья будет о ней.


P.P.S. Цель данной статьи показать, что нет ничего сложного в разработке и создании своих собственных плат и готовых устройств. Главное ставить цель и идти к ней!


P.P.P.S. Хочу заметить, что для меня это хобби и всего лишь вторая собственноручно разработанная плата, поэтому просьба сильно не пинать. :)


P.P.P.P.S 20.02.2020 — обновил плату (третья ревизия). Добавил гальванические зазоры, кондёры по 0.1uF (где их не было). Возможность установки подтягивающего резистора на ногу RO MAX13488 (его номинал над подбирать по месту) и объединения земли GND_isolate с RS485_ground.

Вы можете помочь и перевести немного средств на развитие сайта



Комментарии (60):

  1. tronix286
    /#21277708

    Для полноценной работы нужны два кварца, на 8МГц и 32.768КГц


    Для полноценной работы в качестве чего? Для текущей задачи — часовой кварц имхо нафиг не нужен. Я уж забыл все и могу ошибаться, но в основном часовой кварц нужен когда у нас есть всякие sleep mode, особенно deep sleep mode — можно всю периферию рубануть, включая конечно и HSE и все что от него тактируется, а оставить только таймер или прерывание, которое завязано на LSE — короче говоря, меньше наноОмпэр будет кушать. Ну и второе применение — точные часы секунда в секунду за года непрерывной работы.

    В принципе, здесь даже и HSE кварц не особо нужен, UART'ы и на встройке неплохо работают, даже в большом температурном режиме, ну если не жалко — то пусть будет, конешно -)

    • dab0g
      /#21277838

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

      • dernuss
        /#21279034

        А чем надёжнее вачдог с внешним кварцем?

        • dab0g
          /#21279126

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

          • dernuss
            /#21279142

            А вот ход часов будет поточнее.

            для этого надо было ds3231 ставить)

            т.к. мало ли чего захочется сделать завтра.

            это да

      • Karlson_rwa
        /#21279190

        Но на конденсаторах вы сэкономили (как и на правильном подключении шилда сетевого разъема). Не знаю, какие у вас знания, но 0,1uF лучше ставить у каждой ноги питания каждой микросхемы.

        • NordicEnergy
          /#21281556

          Учитывая современные частоты уж лучше ставить 0.01 мкФ к каждой ноге)) Хотя у всех, в том числе и у меня, привычка по старинке фигачить 0.1, как из пулемета.

          • dab0g
            /#21281594

            На МК и на W5500 у меня кондёры стоят. Нет только на драйвере RS485 и микросхеме-изоляторе. Хороший тантал с низким ESR я туда поставил, а вот эту мелочь упустил :/ Добавим!

            • Karlson_rwa
              /#21283362

              Нет декапов на изоляторе, драйвере, памяти и датчике влажности (у него в даташите, кстати, всё написано в 10-м параграфе, да и в примере трассировки есть площадки под конденсатор). И у W5500 нет декапа на цифровом питании.
              Но как всегда в таких проектах — работает и нехай. Но шилд разъема таки надо подключить куда-нибудь. Нехорошо его оставлять в воздухе.

              • Karlson_rwa
                /#21284338 / +1

                Вот я не понимаю минусаторов в данном случае. Правда глаза режет что ли?

  2. lelik363
    /#21277740

    Если нам не нужна гальваническая развязка от линии

    А если нужна гальваническая изоляция, то на какое напряжение оно рассчитано? Имеются ли на ПП соответствующие зазоры?

    • dab0g
      /#21277878

      Так я же писал, что для полноценной защиты по желанию можно устанавливать дополнительную защитную плату, например такую — www.compel.ru/lib/83359. Первоначально я думал все эти защиты разместить на шлюзе, но потом понял, что лучше вынести отдельно. Т.к. ситуации бывают разные и например для квартиры такая защита будет излишней, а размер шлюза увеличиться при этом достаточно сильно. А вот для уличных линий защита нужна.

      • lelik363
        /#21278344

        Ссылка на ТВU?
        Гальваническая изоляция и защиты от помех с большой энергией, например микросекундные помехи, это разные вещи. Одно другим заменить нельзя.
        Как правило используется и другое, чтобы соответствовать промышленным стандартам.

        • dab0g
          /#21278978

          По даташиту TME0505S обеспечивает изоляцию до 1000В, ISO7321 — 3000В.

          • dimonfofr
            /#21279482

            Но зазоры на плате между изолированными частями такое напряжение не обеспечивают. Вот что говорят по этому поводу в даташите на изолятор:
            image

            • dab0g
              /#21279680

              Это да. Но если делать такие зазоры, то теряется универсальность платы. Т.е. сейчас если нет необходимости в изоляции, то достаточно прилепить 4 «сопли» на плате и всё. А если делать большие зазоры, то необходимы перемычки. Это осознанный компромисс. Потому я и поставил на плате защитный диод SM712, ну и TBU никто не отменял.

              • lelik363
                /#21279826

                Как я говорил ранее одно другого не заменяет, так как гальваническая изоляция — это требования по безопасности, а TBU, TVS, газоразрядники — это борьба с помехами. Гальваническая изоляция, TBU, TVS пополняют друг друга, но не заменяют.
                Требования по гальванической изоляции предъявляются не только к компонентам, но и к плате, и к элементам конструкции. Поэтому без зазора в плате не обойтись. Кстати и зазора нет под разъёмом интерфейса Ethernet.
                Терминатор R2 лучше коммутировать к шине через jumper. Терминаторы нужны только на крайних устройствах.

                • dab0g
                  /#21279912

                  Ок, про зазоры я тогда ещё покумекаю.
                  Про терминатор уже было тут.

  3. alex_kag
    /#21278048

    А какое максимальное количество портов rs485 можно организовать? И вопрос в драйвере для работы под виндой. Возможно ли?

    • dab0g
      /#21278258

      Это как — какое количество? На данном шлюзе разведён только один. Если речь про stm32f103cbt6, то там можно три. И о каком драйвере речь, если шлюз заканчивается ethernet портом. До него надо по TCP/UDP достукиваться, а драйвера там нужны только для сетевой карты.

      • alex_kag
        /#21278372

        про драйвер — Есть такие преобразователи — rs485/ethernet на базе модулей tibbo — к ним поставляются драйвера, которые эмулируют физический ком порт, а сами стучат в ethernet по сети…
        Они же предлагают решения, на 4 rs485/ethernet. Вот захотелось узнать про Ваш модуль…

        • dab0g
          /#21278982

          У меня шлюз делался под Mysensors, поэтому только один порт.

        • IronHead
          /#21296706

          Для вашего случая можно прикинутся 4х портовой MOXOй и работать через ее родной драйвер. (можно реализовать даже на данной плате как мне кажется, если wiznet умеет в неблокирующиеся сокеты для TCP)

          • dab0g
            /#21297034

            А зачем, для универсальности?
            Для шлюза Mysensors нужен только один, он реализован.
            Это если реализовывать задачу проброса UART в Ethernet, то да, порта 3 наверное можно реализовать.

  4. BigDflz
    /#21278170

    W5500 вещь хорошая, делал нечто подобное на ардуинке, (организовав websocket-сервер на ардуинке) с отображением в реальном времени данных в браузере по такой схеме браузер — сервер(java) — ардуинка. 32 кбайт буферной памяти RAM позволяло на 15 сек (больше не пробовал) выдёргивать сетевой кабель без потери данных (данные считывались с лазерного дальномера примерно 10 раз в секунду и отправлялись java-серверу)

    • frayd
      /#21280960

      А какой лазерный дальномер использовали?

  5. sim2q
    /#21278302

    В качестве драйвера RS485 был выбран чип — MAX13488EESA+T, в том числе и в связи с наличием у него режима автоматического выбора направления приёма/передачи.
    Для дома наверное норм, но если линия длинная — то это вроде как не совсем полноценный драйвер. Лучше поставить «честный» и дергать TX/RX

    • dab0g
      /#21279024 / +1

      Да, видел я некоторые обсуждения. Но честно говоря так и не понял чем он неполноценен. Для дома я думаю ставить по шлюзу на этаж, а улица у меня метров 200 максимум будет. Если вдруг на таком расстоянии вылезут косяки, то поправить плату недолго.

      • dimonfofr
        /#21279500 / +1

        Драйвер полноценный, все с ним хорошо. Единственное что для корректной работы функции автоопределения резисторы растяжки линии необходимы. И если у вас вдруг будет слышно локальное эхо, и вы захотите от него избавиться, то нужно будет подтянуть выход RO вверх.
        Я с этим драйвером работал и с этой проблемой столкнулся. Про это есть у меня в статье habr.com/ru/post/486258

        • dab0g
          /#21279696

          Спасибо, учту. В принципе у меня и сейчас эти две дороги соседние, т.е. резистор можно прилепить. Но площадку под него добавлю.

        • dab0g
          /#21297714

          А каким номиналом подтягивать? Или в каких пределах?

  6. mpa4b
    /#21278356

    Неужели f103 + w5500 дешевле, чем f107 и какой-то phy?

    • dab0g
      /#21278382 / +1

      Сложно сказать, это кому что больше нравиться. Но в моём случае это не лучший вариант, т.к. шлюз для Mysensors, а впиливать туда ещё целую Ethernet библиотеку это имхо значит совершать лишние телодвижения и снижать стабильность системы.

      • borisxm
        /#21279854

        Когда-то делал именно на f107 шлюз для modbus — вроде существенных проблем не было. Правда, позже это все переехало на переходник USB-RS-485 да так и живет уже лет 12.
        Кстати, для тех кто в теме, наверное очевидно, что нужно заливать в эту плату, но в тексте ссылки на софт вроде нет.

  7. x893
    /#21279062

    Немного напомнило
    www.crowdsupply.com/domatic/getwired

  8. xztau
    /#21279622

    Оба-на! Вот оно. Только вот не отключаемый терминатор это не есть хорошо. Принудительную подтяжку ставлю не у каждого прибора и только на длинных линиях.
    RFC2217 поддерживается.

    P.S.
    Да, да. Сейчас статью почитаю

    • dab0g
      /#21279708

      Вот, вот. Если сразу почитать, то многие вопросы отпадут. :) Этот резистор можно ставить если это конец линии и ничего меняться не будет, в противном случае:

      Терминирующий резистор на 120Ом устанавливается прямо в разъём RS485, так его проще переносить от устройства к устройству при наращивании линии.

      • xztau
        /#21280138

        По схеме такого не скажешь. На рендере [R2] его то же впаивать надо. Ладно, разбежались.
        Про RFC2217 — это, кстати, вопрос был:)

  9. alex_kag
    /#21279740

    Залез сейчас на github, а в репозитории то прошивки нет :(…

    • dab0g
      /#21279786

      Какой прошивки, для чего? Про программную часть речи не шло. Да и прошивки в этом случае не лучший вариант, ибо у всех разные ip адреса.

      • alex_kag
        /#21279802

        хм, так прошивка — это же самое интересное :)

  10. scorpy27
    /#21280092

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

    на плате, для правильности, стоило бы оставить изоляционный зазор 1мм вокруг драйвера до опторазвязки.
    а вместо перемычек зачастую удобнее паять резистор 1206 0Ом.

    • dab0g
      /#21280122

      Так у каждого свои требования и хотелки. :)
      И если не сильно затруднит, то можно хотя бы 5 ссылок на подобные проекты (STM32+Ethernet+RS485)?
      А насчёт зазоров уже обсуждали.

    • xztau
      /#21280146

      бессчётное, блин! бессчётное!

      • scorpy27
        /#21286152

        несомненно вы правы, непонятно за что минусуют

  11. VT100
    /#21282130

    Пропущено соединение "GND isolate" и "RS485_ground".

    • dab0g
      /#21282698

      А зачем их соединять?

      • lelik363
        /#21282942

        Для уравновешивания потенциалов «земель» между двумя устройствами(приемопередатчиками).

        • VT100
          /#21283146 / +1

          Точнее — между двумя изолированными частями двух устройств. Т.е. для двух устройств будет 3 земли — 2 земли у 2 устройств и одна земля у их общего интерфейса.
          А нужно это для того, что-бы сигналы на входах приемников не выходили за допустимый синфазный диапазон (типично — от минус 7 до 12 вольт).
          Ну и защитный диод не будет работать как следует без этого соединения.

  12. im_stD
    /#21282600

    Здравствуйте.

    Вы использовали библиотеку ioLibrary Driver или сами всё делали работая напрямую с регистрами?