Урок 61. Аппаратная реализация интерфейса RS-485. Объединение плат Ардуино в локальную сеть RS-485.

Связь Ардуино через RS485

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

Предыдущий урок     Список уроков     Следующий урок

Для подключения к линии связи RS-485 применяются дифференциальные передатчики и приемники.

 

Передатчик должен формировать два противофазных сигнала.

Сигналы RS485

При этом стандарт RS-485 предъявляет к нему довольно жесткие требования:

  • высокое быстродействие;
  • работа на низкоомную и емкостную нагрузку;
  • защита от коротких замыканий;
  • отключение от линии (перевод в 3 состояние).

Дифференциальные приемники должны выделять разность между сигналами линий. И это при значительном уровне синфазных помех (-7 … +12 В) и высоком быстродействии.

Реализовать такие функции на дискретных элементах крайне сложно. Проще использовать интегральные приемопередатчики.

 

Приемопередатчики (драйверы) интерфейса RS-485.

Существует большое количество различных типов приемопередатчиков (драйверов) RS-485. Я предпочитаю использовать микросхемы ADM485, SP485, MAX485. Это однотипные микросхемы разных производителей. Функциональные возможности, параметры, назначение выводов у них совершенно одинаковые.

Драйвер RS-484 Производитель Ссылка на документация
MAX485 Maxim Integrated Products MAX481-MAX1487.pdf
ADM485 Analog Devices ADM485.pdf
SP485 Sipex SP485.pdf

Микросхемы выполнены в 8 выводном корпусе и имеют низкую цену.

По моей партнерской ссылке на момент написания статьи:

  • микросхема MAX485ESA стоит всего 8 руб;
  • микросхема MAX485SPA стоит 15 руб;
  • модуль конвертера TTL в RS-485 можно купить за 45 руб.

Купить драйверы RS485

В 8 выводном корпусе драйвера реализованы приемник и передатчик с параметрами, полностью соответствующими стандарту RS-485. Выходы передатчика и входы приемника объединены в микросхеме.

Драйверы RS485

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

Схема преобразования интерфейса UART в RS485

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

Схема преобразования интерфейса UART в RS485 с гальванической развязкой

Питание драйвера (+5 V INT) в этом случае должно быть гальванически развязано.

 

Объединение нескольких плат Ардуино в локальную сеть RS-485.

В качестве примера практической реализации сети RS-485 переработаем распределенную систему из урока 59 на сеть RS-485.

Новая схема локального контроллера будет выглядеть так.

Схема

Пояснять особенно нечего. Я добавил драйвер RS-485 по стандартной схеме включения.

Внешний вид

Такие же преобразования произошли со схемой центрального контроллера.

Схема

Все контроллеры подключены параллельно двухпроводной линии связи. Локальные контроллеры получают питание 5 В от центрального контроллера.

Линия у меня не длинная, скорость передачи низкая (9600 бит/сек). Поэтому в терминаторах нет необходимости. Для устранения неопределенности состояния линии при отключенных всех передатчиках к схеме центрального контроллера добавлены 3 резистора.

Схема смещения

Вся система теперь выглядит так.

Общий вид системы

 

Программное обеспечение.

Резидентное программное обеспечение центрального и локального контроллера осталось прежним:

sketch_59_2.ino - центральный контроллер (загрузить );

sketch_59_1.ino  - локальный контроллер (загрузить ).

Загрузить программы в платы Ардуино необходимо до запайки драйверов RS-485. Иначе они будут блокировать сигналы RxD и мешать загрузке из Arduino IDE.

Обмен данными по сети происходит под управлением библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave.

В программах, которые мы использовали в уроке 59, для организации сети через интерфейсы UART объекты ModBus создаются следующим конструктором:

Tiny_ModBusRTU_Slave slave(1, 8, regTable, 6, 13); // создаем объект ModBus

Последний параметр задает номер вывода для управления передатчиком RS-485 (сигнал DE). Для интерфейса UART этот вывод не нужен. Можно было параметр не задавать и сэкономить один вывод микроконтроллера. Но я его задал с номером 13 – светодиод общего назначения. Светодиод светился, когда в контроллере происходила передача данных.

Теперь мы подключили сигнал разрешения работы передатчика (DE) к 13 выводу. Поэтому программное обеспечение осталось прежним. В реальных разработках лучше использовать другой вывод.

 

Проверка работы системы.

Проверка ничем не отличается от тестирования системы-прообраза. Подал питание. Покрутил переменные резисторы, погрел термодатчики, понажимал кнопки. Все работает, данные отображаются на дисплее центрального котроллера. Ошибок обмена нет.

Дисплей системы

Имитировал ошибки обмена – нажал кнопку сброса локального контроллера.

Сообщение об ошибках

Посыпались ошибки на дисплее для данных обоих контроллеров.

В системе-прообразе на интерфейсе UART при нажатии сброса были ошибки только одного локального контроллера. Второй работал нормально. Происходит это, потому что при состоянии сброса микроконтроллер переводит все свои выводы в плавающее состояние (бросает в воздухе). Сигнал разрешения работы передатчика RS-485 за счет светодиод с резистором (вывод 13) переходит в состояние лог. 1. Для передатчика это разрешающий уровень. В результате выход драйвера блокирует линию связи.

Если необходимо, чтобы при отключении микроконтроллера сигналом сброса линия связи не блокировалась необходимо использовать для сигнала DE другой вывод. Также надо подключить его к земле через резистор сопротивлением 5…10 кОм.

Помехоустойчивость сети.

Все, что было написано по поводу сети RS-485 в предыдущем уроке в полной мере справедливо по отношению к нашей системе.

Длина линии связи теперь может достигать 1200 м. Скорость обмена можно увеличить. По сравнению с сетью через интерфейс UART схема незначительно усложнилась, но помехоустойчивость и все остальные параметры повысились. Получилась сеть совершенно другого качественного уровня.

 

В следующем уроке продолжу тему обмена данными между платами Ардуино.

Предыдущий урок     Список уроков     Следующий урок

Один комментарий на «Урок 61. Аппаратная реализация интерфейса RS-485. Объединение плат Ардуино в локальную сеть RS-485.»

  1. Здравствуйте! Спасибо за статью! Скажите пожалуйста, нужно-ли защищать приемопередатчик MAX495 от наводок в линии супрессором?

    • Здравствуйте!
      Да конечно. Если линия длинная и есть опасность высоковольтных импульсных помех то надо защищать. Поставить 3 пробивных стабилитрона (супрессора) между линиями A B, A C, B C.

  2. Добрый день! Спасибо за ваши уроки. У меня не получается передать с одной ардуины на другую показания трех датчиков температуры. Вместо вольтметра в вашем коде показания второго датчика работает, а третий никак не могу настроить. С уважением Виталий.

    • Здравствуйте!
      Передайте сначала просто последовательность байтов. Убедитесь, что они принимаются правильно. Затем упаковывайте в байты значения температуры. Можете открыть тему на форуме сайта.

      • Здравствуйте! У меня все получилось. Сперва не мог понять что делает 2 в (regTable+2), и что надо было ставить для третьего датчика температуры( поставил +4). Но пока не увеличил регистры хранения с 6 до 8 ничего не получалось. Тему открою чуть попозже. Сперва определюсь сколько данных мне надо передавать в проекте. Большое спасибо за уроки.

  3. Эдуард, спасибо за уроки.
    Библиотеки
    Tiny_ModBusRTU_Slave и
    Tiny_ModBusRTU_Master
    не работают с программным UART..??

    • Здравствуйте!
      Да, конечно. Библиотека работает только с аппаратным UART контроллером.

      • Спасибо за ответ, думал что я что-то не то делаю, хотел использовать уно для опроса нескольких разных веток.
        Придется использовать отдельный контроллер на каждую ветку, или «Мегу».

  4. Здравствуйте Эдуард !
    Спасибо за уроки. Очень хорошие статьи.
    Вопрос: Будет ли работать сеть RS-485 с тремя ведомыми платами Ардуино, если к ней подключить через стандартный преобразователь RS-485 USB компьютер в качестве ведущего с программой для обмена данными, используя на Ардуино Вашу библиотеку Tiny_ModBusRTU_Slave ?

    С уважением Геннадий.

    • Здравствуйте!
      Все должно работать. Правильно укажите тайм-ауты. Для начала с большим запасом.

  5. Здравствуйте Эдуард !
    1. Правильно ли я понял, что с помощью переключателей SW1, SW2 и SW3 устанавливается адрес платы с Ардуино ?
    2. Будет ли работать покупной модуль RS-485 TTL, использующий микросхему МАХ 485, с Вашей библиотекой Tiny_ModBusRTU_Slave ?
    С уважением Геннадий.

    • Здравствуйте!
      1. Кнопки SW1 — SW3 используются для демонстрации передачи информации на локальные контроллеры. При нажатии кнопки должен загораться светодиод на соответствующем локальном контроллере.
      2. Да, конечно. Библиотека будет работать с модулем на микросхеме MAX485. У меня в уроке схема ничем не отличается от схемы этого модуля.

  6. Здравствуйте, Эдуард! Огромное спасибо за великолепные уроки! Повсюду в интернете лежат лишь монструозные скетчи, собранные из стандартных примеров, напичканные delay’ями. В крайнем случае встречаются псевдопланировщики на базе функции millis, но все библиотеки опроса датчиков типа DHT22 или того же 18B20 все равно используют все те же delay’и, так что о параллельном выполнении задач вообще речи нет. Ваш же сайт, похоже, единственный в рунете, где показана нормальная реализация многозадачности для всего сразу. Правда придется переделывать все стандартные библиотеки, но это даже хорошо — опыт прокачивается. 🙂
    З.Ы, Присоединяюсь к ждущим с нетерпением следующих уроков. Панели Nextion HMI очень удобны (правда, дороги), с удовольствием почитаю про Ваш опыт общения с ними.

  7. Здравствуйте Эдуард !
    1. У меня Ардуино Мега 2650 и имеется три канала: RX0-TX0, RX1-TX1 и RX2-TX2. Я подключил конвертер RS-485 TTL к каналу RX1-TX1. Скажите, у Вас в библиотеке Tiny_ModBusRTU_Slave для Ардуино определяется по какому каналу вести прием-передачу? Если нет, то подскажите, что надо сделать?
    2. Из каких условий выбран интервал прерываний в 500 мксек ? Можно ли его изменить ?
    С уважением Геннадий.

    • Здравствуйте!
      Библиотека работает только на аппаратном порту 0. Она была создана для урока, хотя по моим тестам и отзывам других работает безупречно. Я проверял ее только на Arduino UNO, Arduino Nano и Arduino PRO Mini. Мне писали, что были проблемы с функционированием на Mega 2560 на Serial, но нашлась причина. Давайте лучше я сейчас на форуме сайта (http://mypractic-forum.ru) опубликую переписку по этому поводу в разделе «Уроки Ардуино». Там же можете задавать вопросы на эту тему.

  8. Здравствуйте Эдуард !
    1. Ардуино Мега 2650 имеет 4 порта: RX0-TX0, RX1-TX1, RX2-TX2, RX3-TX3. У меня подключено к порту RX1-TX1. Есть ли в Вашей библиотеке Tiny_ModBusRTU_Slave возможность указывать по какому порту работать ? Если нет, то как запрограммировать Ардуино, чтобы он работал через этот порт ?
    2. Как выбирался интервал прерывания в 500 мксек и можно ли его изменять ?
    С уважением Геннадий.

  9. Здравствуйте Эдуард !
    Arduino UNO по ModBus_RTU пытаюсь прочитать регистр (ватметр dds238-2 zn) адрес 40015 функции 3. (реверсная энергия)
    Не работает! Чем может отличаться режим раба ардуино от ватметр dds238??
    Вот сам Ваттметр https://ru.aliexpress.com/item/5-65-A-230V-50HZ-voltage-current-DDS238-2-ZN-S-single-phase-Din-rail/32812065998.html?spm=2114.13010708.0.0.8Z8w4V

    • Здравствуйте!
      Может у вас устройство медленно отвечает. Попробуйте увеличить время тайм-аута. На форуме сайта пишут, что даже потребовалось изменить тип переменной для тайм-аута.
      http://mypractic-forum.ru/viewtopic.php?t=87

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *