Arduino usb to ttl rs485 с защитой

Обновлено: 25.06.2024


Вышла новая версия программы FLProg c номером 1.9.1. Я подумал что нововведения в программе заслуживают освещения на хабре.Так же расскажу немного теории о протоколе Modbus и особенностях его реализации на борту Arduino.

Modbus — протокол, работающий по принципу «клиент-сервер».
Широко применяется в промышленности.
Modbus может использоваться для передачи данных через последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP.
Пока в программе FLProg реализована передача данных только по через RS-485.
В основе интерфейса RS-485 лежит принцип дифференциальной (балансной) передачи данных. Суть его заключается в передаче одного сигнала по двум проводам. Причем по одному проводу (условно A) идет оригинальный сигнал, а по другому (условно B) — его инверсная копия. Другими словами, если на одном проводе «1», то на другом «0» и наоборот. Таким образом, между двумя проводами витой пары всегда есть разность потенциалов: при «1» она положительна, при «0» — отрицательна.

Именно этой разностью потенциалов и передается сигнал. Такой способ передачи обеспечивает высокую устойчивость к синфазной помехе. Синфазной называют помеху, действующую на оба провода линии одинаково. К примеру, электромагнитная волна, проходя через участок линии связи, наводит в обоих проводах потенциал. Если сигнал передается потенциалом в одном проводе относительно общего, как в RS-232, то наводка на этот провод может исказить сигнал относительно хорошо поглощающего наводки общего («земли»). Кроме того, на сопротивлении длинного общего провода будет падать разность потенциалов земель — дополнительный источник искажений. А при дифференциальной передаче искажения не происходит. В самом деле, если два провода пролегают близко друг к другу, да еще перевиты, то наводка на оба провода одинакова. Потенциал в обоих одинаково нагруженных проводах изменяется одинаково, при этом информативная разность потенциалов остается без изменений.
Так выглядит типичная посылка, от Ведущего — Ведомому.

Так выглядит ответ Ведомого — Ведущему

ID — Адрес ведомого устройства. Он может иметь значения от 1 до 247. Адрес 0 используется для широковещательной передачи, его распознаёт каждое устройство, адреса в диапазоне 248…255 — зарезервированы.
В программе FLProg для ведущего (Master) реализована поддержка 32 ведомых (Slave) устройств что обусловлено применяемыми конвертерами UART -> RS-485.

Команда(код функции):
в данном примере одна, на чтение 0x03.
Но в действительности их намного больше.
Все коды функций делятся на:
— Публичные коды, описанные в стандарте MODBUS-IDA. Их список включает уже назначенные и используемые коды, а также коды для будущего использования;

0x02) — чтение значений из нескольких дискретных входов (Read Discrete Inputs).
(0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers).
(0x04) — чтение значений из нескольких регистров ввода (Read Input Registers).
(0x05) — запись значения одного флага (Force Single Coil).
(0x06) — запись значения в один регистр хранения (Preset Single Register).
(0x07) — Чтение сигналов состояния (Read Exception Status)
(0x0F) — запись значений в несколько регистров флагов (Force Multiple Coils)
(0x10) — запись значений в несколько регистров хранения (Preset Multiple Registers)
(0x16) — запись в один регистр хранения с использованием маски «И» и маски «ИЛИ» (Mask Write Register).
(0x18) — Чтение данных из очереди (Read FIFO Queue)
(0x14) — Чтение из файла (Read File Record)
(0x15) — Запись в файл (Write File Record)
(0x08) — Диагностика (Diagnostic)
(0x0B) — Чтение счетчика событий (Get Com Event Counter)
(0x0C) — Чтение журнала событий (Get Com Event Log)
(0x11) — Чтение информации об устройстве (Report Slave ID)
(0x2B) — Encapsulated Interface Transport

— User-Defined Function Codes (65-72, 100-110) — коды, которые могут использоваться компаниями для собственных функций, и не описаны в спецификации;
— Reserved Function Codes (9, 10, 13, 14, 41, 42, 43, 90, 91, 125, 126 и 127) — зарезервированы коды, которые не доступны для общего использования.
Обработка ошибок
Ведущий отправляет запрос к Ведомому, в котором в поле «код функции» указывает ему на необходимое действие.
Байты данных содержат информацию, необходимую для выполнения данной функции.
Ведомый, в случае удачного выполнения этой функции, повторяет код функции в ответе.
При возникновении ошибки, код функции в ответе модифицируется — старший бит выставляется в 1.
В байтах данных передается причина ошибки. Например при исполнении Ведомым функции 0x0F возникла ошибка, тогда он ответит Ведущему полем функции равным 0x8F.
В дополнении к изменению кода функции, Ведомый размещает в поле данных уникальный код, который указывает на тип и причину ошибки.
В спецификации Modbus определено два типа данных, один бит и 16 битное слово. Данные организованны в четыре таблицы с 16 битной адресацией ячеек, адресация в таблицах начинается с 0. Для доступа к данным из разных таблиц предназначены отдельные команды.

Discrete Inputs 1 бит только чтение
Coils 1 бит чтение и запись
Input Registers 16 бит только чтение
Holding Registers 16 бит чтение и запись

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

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

Они стоят недорого но достаточно надежны. Собраны на микросхеме MAX485.

Соеденение с Arduino проводятся по схеме

Для эмуляции ведущего и ведомого во время разработки реализации протокола я использовал две очень хорошие бесплатные программы.


QModBus — Симулятор ведущего


PeakHmiMBSerialSlave — Симулятор ведомого

Ну и напоследок видео урок по созданию ведущего и ведомого устройства в программе FLProg.

PS. Благодарю авторов представленных ниже статей, которые помогли мне разобраться с протоколом Modbus, и реализовать данный функционал.
Источники:
Modbus RTU для Чайников
Arduino & Modbus

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

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

RS-485 на практике

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

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

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

Модуль Arduino RS-485

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

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

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

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

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

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

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

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

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

'; // превращаем содержимое буфера в строку, добавляя нулевой символ if( strcmp(buffer, "test") ) < // если принятая строка равна тексту ping digitalWrite(13, state); // мигаем светодиодом state = !state; >> >

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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


В предыдущей статье рассказывал о протоколе связи I2C используемый в дисплеях LCD1602, OLED и во многих других устройств. Сегодня расскажу о другом протоколе RS485, который использует асинхронную передачу данных и преимуществом RS-485, является возможность передачи данных на большие расстояния. Данный протокол часто используется промышленности.
В этой статье приведу пример организации связи по протоколу RS485 и использовании недорогих модулей на базе микросхемы MAX485.

Технические параметры.

► Рабочее напряжение: 5 В
► Потребляемый ток: < 10 мА
► Ток потребляемый в режиме ожидания: < 5 мА
► Частота передачи данных: <2,5 Мбит/с
► Габариты: 44x14x20 мм

Немного о RS485

Общие сведения о модуль RS485

Модуль собран на небольшой плате, габариты которой всего 44 мм х 20 мм, основная микросхема это MAX485, которая преобразует сигнал TTL (необходимый для Arduino) в стандарт RS485 и обратно. Так же, кроме микросхемы MAX485 на модуле установлена минимальная электрическая обвязка.


Принципиальная схема модуля показана на рисунке ниже.


Переключение модуля на прием и передачу осуществляется с помощью выводов DE и RE. Если их замкнуть между собой и подключить к любому цифровому выводу arduino, то подав на него «1» модуль будет работать только на передачу, а подав «0», только на приём.

Подключение Arduino к RS485

Необходимые детали:
► Arduino UNO R3 x 2 шт.
► Конвертер TTL-RS485 на чипе MAX485 x 2 шт.
► Провода DuPont, 2,54 мм, 20 см x 1 шт.

Подключение.
В примере используем две Arduino UNO и два модуля RS485. Сначала подключаем Arduino (Master) к модулю RS485, вывод 10 (Arduino) к RO (RS485), вывод 11 (Arduino) к RI (RS485) и вывод 3 подключаем к контактам RE, DE (RS485). Затем подключаем питание VCC и GND и конечно два провода в шине RS485, «A» к «A», «B» к «B». Аналогично собираем и второю Arduino.



Здравствуйте! 21 век давно на дворе, а RS485 все еще актуален. Адаптеры — вечная проблема: спалил, забыл, сломал и т.д… FTDI тут конечно, не оригинал, но цена-качество нормальное. Мини обзор.

По работе частво встречаюсь с этим протоколом. Почему-то сейчас в промышленной электронике стало модно разводить все что ни попадя на RJ45 коннекторы. Периодичекски народ палит адаптеры подключив не туда: например с частотного преобразователя для мотора на адаптер приходит питание 12В, а в адаптере диода для защиты нет. И эти 12В приходят в ноутбук на USB, от чего ему становится грустно. Соответственно стояла задача купить максимально дешевый девайс без глюков. FTDI со своими драйверами весльма хорошо зарекомендовала, но, как вы понимаете, тут за менее чем 2 бакса не будет настоящей FT232. Почему именно она? А потому что у нее есть выход годовности к передаче. Что избавляет от необходимости ставить доп. логику. Драйвера стабильны и безглючны. Аналоги на ch340 и cp2102 кроме того что нуждаются в доп логике, так еще и шалят иногда не давая компу выйти из спячки. Встречаем!

Флюс не смыт, пайка с большего нормальная, но например, разъем кривовато припаян. На микросхеме гордое «FTOI» :) Модуль весьма небольшой: Тут с 10мм меряю:
На преобразователе 3 светодиода: Tx / Rx и питание. Мне не нравится тип разъема USB. Так сложилось что у нас в промышленности стал стандартом miniUSB. Не знаю почему, но производители его постоянно везде ставят. Так что придется нарисовать переходник. В качестве защиты — стабилитрона на 6,8 В. То что на выходе оригинал MAX485 я тоже сомневаюсь. Ну и полезная фича — перемычки. Ими можно отключить MAX485 и получить ТТЛ уровни с фейковой FTDI.
Отмываем флюс и подключаем. Преобразователь моментально подхватывается Win10 и ставятся родные драйвера. Это серьезный плюс. В системе видится так:
Драйвера вроде как микросхему не портят. По кайней мере за пару часов ничего не случилось.
Самое быстрое что было в хозяйстве — частотный преобразователь от SchneiderElectric. Соединился с ним на 38400. При конекте радостно перемаргивают красным Tx-Rx. На первый взгляд никаких подводных камней нет. Я как-то читал что китайские клоны FTDI начинают глючить при длительной работе. Так что проверяйте на всякий случай.
Пока я не нашел никаких серьезных подводных камней кроме плохонькой пайки и фейковых микросхем. Впринципе, как за чуть больше 1,5 баксов — отличный вариант, который в случае сгорания можно выбросить и не жалеть.
На этом у меня все. Спасибо за внимание!

Читайте также: