Плата rs485 для ардуино

Arduino RS-485: Подключение, описание и примеры с кодами

Интерфейс RS-485

RS-485 является одним из наиболее распространенных интерфейсов передачи данных.

Для передачи сигнала используется всего два провода. Обычно применяется витая пара UTP, но можно использовать и простой кабель. Ну, а связка Arduino и RS-485 открывает большие возможности в различных DIY проектах.

Интересные факты о RS-485

Максимальная длина линии интерфейса RS-485 составляет 1200 метров и подключить к одному кабелю можно до 32 устройств. Предком интерфейса RS-485 является RS-232.

Преимущество связки Arduino RS-485

  • Длина линии связи, которая может достигать 1200 метров.
  • Подключение к одной линии до 32 устройств.
  • Помехоустойчивость.
  • Простота реализации.
  • Любая Arduino может быть ведущим или ведомым устройством.

Недостатки RS-485

  • Скорость уменьшается с увеличением длины провода.
  • Полудуплексный режим, то есть прием и передача производится по одной паре проводов.

При передачи данных на расстояние от 500 метров потребуется экранированный UTP кабель. Скорость может снизиться до 50 Кбит/с, но этого вполне достаточно для передачи показаний с датчиков.

Схема подключения Arduino по RS-485

Для подключения плат Arduino по интерфейсу RS-485 потребуется конвертирующий модуль на базе MAX485. Это

Модуль TTL to RS-485
Преобразователь логики Arduino в RS-485

Схема соединения двух Arduino UNO

Код программы для Arduino RS-485

Программа для одностороннего приема и передачи

Напомним, что в один момент времени устройство может либо принимать, либо отправлять данные. Для указания устройства в качестве приемника или передатчика на модулях присутствуют контакты DE и RE. Высокий уровень на контактах — режим передатчика, низкий — приёмника.

Программа для передатчика — Она будет отправлять в Serial Port строку «test» один раз в секунду.
Программа для приемника — При появлении в эфире строки «test» будет мигать светодиодом на плате Arduino (13 пин).

Код программы приемника

Код программы передатчика

Программа для двухстороннего приема и передачи данных

Код программы для первой платы Arduino

Теперь платы Arduino буду менять режим приемника/передатчика в момент отправки сообщения.

Код программы для второй платы Arduino

Разновидности микросхем RS-485

Существуют различные микросхемы RS-485 — MAX485, ADM485, SP485, SN75176. Функциональные возможности которых идентичны, назначения выводов совершенно одинаковые.

Микросхемы представлены в SOIC-8 и DIP-8 корпусах.

Защита от помех

  1. Снижение скорости передачи данных повышает помехоустойчивость. Не устанавливайте скорость большую, чем требуется для нормального функционирования системы.
  2. Не прокладывайте сигнальный кабель вместе или вблизи силовых кабелей.
  3. В промышленных зонах рекомендуется применять экранированную витую пару с последующем заземлением экрана.
  4. Использование индуктивных фильтров для избавления системы от высокочастотных помех.

Заключение

Интерфейс RS-485 применяется в промышленных системах из-за устойчивости к помехам и возможностью передавать данные на большие расстояния.

Но этот интерфейс нашел применение в домашних системах Умного дома и проектах Arduino по тем же причинам.

RS-485 широко используется с протоколами ModBus и DMX512.

* ModBus — открытый коммуникационный протокол.
* DMX512 — протокол передачи данных между контроллерами и световым оборудованием.

Источник

Урок 26.2 Соединяем две arduino по стандарту RS485

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

В этом уроке мы научимся соединять две arduino по стандарту RS485 через аппаратную шину UART.

Преимущества:

  • Простота реализации.
  • Реализуется возможность подключения более двух arduino.
  • Любая arduino на линии связи может работать ведущим и/или ведомым.
  • Передача данных осуществляется на большие расстояния (длина линии связи до 1,2 км).
  • Не требуется отключать модули от шины UART при загрузке скетча.

Недостатки:

  • Связь осуществляется в полудуплексном режиме (одновременно может отправлять данные только одна arduino).
  • Используется дополнительный цифровой вывод arduino, для управления конвертирующим модулем.

Нам понадобится:

  • Arduino х 2шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 2шт.
  • Trema Shield х 2шт.
  • Эластичная клавиатура 4×4 х 2шт.
  • Шлейф «мама-мама» (4 провода) для шины I2С х 2шт.
  • Витая пара «мама-мама» (2 провода) — линия связи x 1шт.
  • Конвертирующий модуль на базе чипа MAX485 х 2шт.

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека iarduino_KB (для подключения матричных клавиатур).
  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .

Видео:

Схема подключения:

Подключение LCD дисплея осуществляется к аппаратным выводам шины I2C.
Клавиатура подключается к любым цифровым выводам, в примере используются выводы 2-9.
Конвертирующий модуль подключается к шине UART:

RE (Receiver Enable — разрешение работы приёмника)

Конвертирующий модуль Arduino
DI (Driver Input — вход передатчика) TX (transmit — передать)
RO (Receiver Out — выход приёмника) RX (receive — получить)
Vcc (Voltage constant current — напряжение постоянного тока) Vcc
GND (GrouND — земля) GND (GrouND — земля)
DE (Driver Enable — разрешение работы передатчика) D10 (Digital — цифровой)
D10 (Digital — цифровой)

На рисунке приведён пример подключения двух и более устройств.
Схемы устройства-1, устройства-2, . — идентичны.

Все конвертирующие модули на линии соединяются одноименными выводами: «A» с «A», «B» с «B».

Код программы:

Настройка параметров линии связи:

Конвертирующий модуль только преобразует сигналы TTL в стандарт RS485 и обратно. Параметры линии: скорость передачи данных, количество бит в минимальной посылке, длина стопового бита, проверка на чётность/нечётность, зависят от настроек шины UART, см. раздел «Настройка параметров шины UART» в уроке 26.1.

Настройки шины UART всех arduino подключённых к линии должны быть идентичны!

Источник

Недорогой RS-485 интерфейс для Arduino/ESP8266/ESP32

RS485 интерфейс позволяет обеспечить помехоустойчивое соединение с оборудованием на расстоянии до 1200 метров. Вопрос, как обеспечить безопасное подключение микроконтроллера к оборудованию, работающему по RS485 интерфейсу?

При разрядах молний электронное оборудование, соединенное длинным кабелем, не раз выгорало. Кроме того оборудование RS485 нередко работает на напряжениях выше, чем 3,5 V или 5 V на которых работают микроконтроллеры, а, соответственно, может выдать в линию повышенное напряжение, которое выведет из строя чип RS485.

Arduino RS485 Shield или бюджетная плата RS485 не обеспечивают защиты чипа конвертера интерфейса MAX485 от подобных напастей, а, соответственно, непригодны для промышленного использования. В предыдущих статьях я рассматривал некоторые Arduino RS485 Shields. В частности, подробно рассмотрел работу с недорогим Arduino Shield с Aliexpress.

В этой статье я рассмотрю очень недорогие модули обеспечивающие RS485 интерфейс и при этом достаточно защищенные для использования в промышленном оборудовании.

XY-485 и XY-017

Начну с довольно дорогого и качественного модуля XY-485. Очень качественно собран, на нем распаяны разъемы, хорошо промаркирован. В общем, когда держишь в руках, чувствуется, что модуль собирается на приличном заводе.

Модуль конверера RS485 интерфейса XY-485

Сразу отмечу, что в модуле контроль приема/передачи производится автоматически. Т.е. не нужно, как в ранее рассмотренном Arduino 485 Shield, управлять вручную установкой в HIGH/LOW пинов RE/DE. В статье есть подробный пример кода. Им же я воспользуюсь для работы с XY-485 с автоматическим контролем приема/передачи.

Более дешевая плата XY-017, брат-близнец XY-485. На ней не распаяны разъемы, хуже маркировка, но все-же платы очень похожи друг на друга по компонентам и размещению элементов. Разводка немного отличается, но не сильно.

Обратим внимание на наличие предохранителей и стабилитронов в обеих вариантах модулей, защищающих выходы микросхемы MAX485 от ударов молний, перенапряжений и ошибок при соединении, когда RS485 оборудование неверно подключается к A+ и B-.

Кроме того на плате распаяны два светодиода Rx/Tx индицирующие отправку/получение данных. Удобно.

Проверю работу Arduino с этим модулем. Для экспериментов воспользуюсь модулем RX-485, Arduino Uno и ранее не раз использованным термодатчиком, работающим по RS485, протокол Modbus.

Возьму код из предыдущего примера и уберу строки управляющие RE и DE пинами.

Схема соединения Arduino Uno с XY-485:

Arduino Uno XY-485
Rx (PIN 0) TXD
Tx (PIN 1) RXD
5V VCC
GND GND
Термодатчик XY-485
A+ A+
B- B-
GND Блок питания —
VCC Блок питания +5 V

Sketch успешно загружается в Arduino, но в мониторе серийного порта идут ошибки «Response Timed Out». Никакое шаманство не помогает: менял библиотеки для работы с RS485, подключал «землю», подавал питание и на датчик и на XY-485 от USB порта, перечитал массу статей на английском и русском и т.д. Ничего не помогало, никак не мог найти в чем проблема. Затем, случайно на youtube увидел короткий обзор модуля XY-017.

В ролике услышал решение в одной фразе:

«На XY-017 попутаны местами Tx и Rx».

Честно говоря, я бы никогда не подумал, что на столь классно выполненном XY-485 будет допущена столь серьезная ошибка.

Ровно такая-же история с платой XY-017. По крайней мере мне достался такой экземпляр. Чувствуется производители «списывали» друг у друга. 🙂

Меняю местами Rx и Tx, пытаюсь загрузить sketch в Arduino Uno и получаю ошибку:

avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
An error occurred while uploading the sketch

Выдергиваю на время «заливки» sketch-а пин Rx и повторяю upload sketch-а. После успешного upload возвращаю Rx назад и «о, чудо», все начинает работать, получаю данные с датчика температуры и влажности. В общем, правильное соединение непривычное 🙂

Arduino Uno XY-485
Rx (PIN 0) RXD
Tx (PIN 1) TXD

Если все соединения с Arduino Uno выполнены верно, питание нормально подается на модуль и pin-ы к которым вы подключили плату не pullup, т.е. не подвешены на + питания, то на плате XY-485 светодиод RXD не должен постоянно гореть

Я запитывал модуль XY-485 и от 3,3 V и от 5 V непосредственно от платы Arduino Uno запитанной от USB порта и от отдельного БП. В обеих случаях все работает нормально. Данные с дачика поступают.

XY-485 c ESP8266

Самая важная вещь при подключении модуля XY-485 к плате с распаянным ESP8266:

Подключайте XY-485 к блоку питания на 3,3 В, чтобы не спалить GPIO ESP8266!

Можно подключать модуль к соответствующему выводу платы на которой распаян ESP8266. Практически на всех девелоперских платах есть вывод 3,3 В. Хотя я предпочитаю запитывать от отдельного БП.

Казалось бы при переносе RX/TX с Arduino Uno на входы RX/TX ESP8266 проблем возникнуть не должно. Но это в теории. 🙁 На практике схема сразу перестает работать. Идет ошибка «Invalid Slave ID», хотя если бы не было соединения с датчиком ошибка была бы «Response Timed Out».

Помучавшись с аппаратным последовательным портом сэмулировал RX/TX на свободных контактах GPIO с помощью библиотеки ESP SoftwareSerial от Peter Lerup (@plerup). На обычных GPIO поддерживается скорость дo 115200 и несколько SoftwareSerial портов. Поскольку это программная эмуляция последовательного порта, лучше использовать низкие скорости.

С программной эмуляцией последовательного порта все работает стабильно, параметры с датчика считываются. При заземлении всех элементов схемы (Wemos D1, XY-485, термодатчика RS485) И запитывании XY-485 и термодатчика от отдельного БП, а не от Wemos D1 подключенного по USB к ПК ошибка «Invalid Slave ID» не появляется.

Этот код работает относительно стабильно. Функция loop() и getResultMsg() не изменялись. Я не стал убирать неработающие куски кода, которые использовались в процессе экспериментов, а лишь закомментировал. Возможно, будет полезно.

Выбранный GPIO 15 (D8 на Wemos D1) оказался не очень удачным. Он служебный и при аплоаде скетча на нем должен быть выставлен определенный уровень. Из-за этого при аплоаде всегда возникает ошибка. Пришлось перенести на D1 (GPIO5).

Проблема возникает, если, например, снять один из PIN-ов RX/TX. Если ModbusMaster не получает данных, то выпадает в стек. В качестве workaround можно использовать временное отключение watchdog при опросе датчика.

Другой обходной вариант — включить в секцию setup строчку:

Динамическое создание объектов SoftwareSerial и ModbusMaster

В некоторых случаях статическое создание объектов не годится. Нужно создавать их динамически. В этом случае исходный код будет выглядеть следующим образом:

добавился один аргумент.

Передача объекта через void*

Иногда возникает необходимость в библиотеке объявить свойство в классе, которому в дальнейшем надо будет передать ссылку на объект. Небольшой пример, как это сделать.

Fritzing part for RS485 (XY-017 board)

Не нашел fritzing part для RS485 (XY-017 платы), поэтому нарисовал свой вариант.

Источник

Adblock
detector