Последовательная связь между STM32F103C8 и Arduino Uno по протоколу RS-485


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

Ранее на нашем сайте мы рассматривали последовательную связь между Arduino Uno и Arduino Nano по протоколу RS-485, также мы рассматривали применение данного протокола совместно с протоколом Modbus в плате Arduino Uno. В этой же статье мы рассмотрим последовательную связь между платами STM32F103C8 (также известной под названием STM32 Blue Pill – "синяя таблетка") и Arduino Uno по протоколу RS-485.

Внешний вид проекта последовательной связи между STM32F103C8 и Arduino Uno по протоколу RS-485

В этом проекте мы будем использовать три кнопки, подключенных к плате STM32F103C8 и выполняющей роль ведущего устройства (Master), для управления тремя светодиодами, подключенных к плате Arduino Uno и выполняющей роль ведомого устройства (Slave).

Протокол последовательной связи RS-485

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

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

В нашем случае дифференциальный сигнал образуется при помощи использования положительного и отрицательного напряжения 5V. Интерфейс RS-485 обеспечивает полудуплексную связь (Half-Duplex) при использовании 2-х линий (проводов) и полноценную дуплексную связь (Full-Duplex) при использовании 4-х линий (проводов).

Основные особенности данного интерфейса:

  1. Максимальная скорость передачи данных в интерфейсе RS-485 – 30 Мбит/с.
  2. Максимальная дистанция связи – 1200 метров, что значительно больше чем в интерфейсе RS-232.
  3. Основным достоинством интерфейса RS-485 по сравнению с RS-232 является использование нескольких ведомых (multiple slave) при одном ведущем (single master) в то время как RS-232 поддерживает только одного ведомого.
  4. Максимальное число устройств, которое можно подключить по интерфейсу RS-485 – 32.
  5. Также к достоинствам интерфейса RS-485 относится хорошая помехоустойчивость вследствие использования дифференциального сигнала.
  6. RS-485 обеспечивает более высокую скорость передачи по сравнению с интерфейсом I2C.

Для последовательной связиь между платами STM32F103C8 и Arduino Uno по протоколу RS-485 мы будем использовать модуль 5V MAX485 TTL to RS485, в основе которого лежит микросхема Maxim MAX485. Модуль является двунаправленным и обеспечивает последовательную связь на расстояние до 1200 метров. В полудуплексном режиме он обеспечивает скорость передачи данных 2,5 Мбит/с.

Модуль 5V MAX485 TTL to RS485 использует питающее напряжение 5V и логический уровень напряжения также 5V, что позволяет без проблем подключать его к платам Arduino.

Данный модуль имеет следующие особенности:

  • работает с напряжениями 5V;
  • имеет в своем составе чип MAX485;
  • отличается низким энергопотреблением;
  • всеми его контактами можно управлять с помощью микроконтроллера;
  • размеры платы модуля: 44 x 14mm.

Внешний вид модуля RS-485 показан на следующем рисунке.

Внешний вид модуля RS-485

Назначение контактов (распиновка) модуля RS-485 приведена в следующей таблице.

Название контакта Назначение контакта
VCC 5V
A вход/выход линии RS-485
B вход/выход линии RS-485
GND GND (0V)
R0 выход приемника (RX pin)
RE разрешение работы приемника
DE разрешение работы передатчика
DI вход передатчика (TX pin)

Как видите, контакты на модуле RS-485 расположены очень логично - с одной стороны к модулю подключается устройство, а с другой - линия.

Подключить модуль MAX485 TTL to RS485 к платам STM32F103C8 и Arduino Uno достаточно просто – для этого используются последовательные порты данных плат, которые расположены на следующих контактах:

  • в плате STM32F103C8: контакты PA9 (TX) и PA10 (RX);
  • в плате Arduino Uno: контакты 0 (RX) и 1 (TX).

Запрограммировать работу данного модуля при его подключении к платам STM32F103C8 и Arduino Uno тоже несложно: необходимо использовать функцию Serial.print() для передачи данных по RS-485 и функцию Serial.Read() для чтения данных из RS-485. При этом на контакты DE & RE модуля MAX485 TTL to RS485 необходимо подать уровень LOW для приема данных и уровень HIGH для передачи данных.

Необходимые компоненты

  1. Отладочная плата STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
  2. Плата Arduino Uno (купить на AliExpress).
  3. Модуль преобразования MAX485 TTL в RS485 – 2 шт. (купить на AliExpress).
  4. Кнопка – 3 шт.
  5. Светодиод – 3 шт. (купить на AliExpress).
  6. Резисторы (купить на AliExpress).
  7. Макетная плата.
  8. Соединительные провода.

Схема проекта

Схема для последовательной связи между платами STM32F103C8 и Arduino Uno по протоколу RS-485 представлена на следующем рисунке.

Схема для последовательной связи между платами STM32F103C8 и Arduino Uno по протоколу RS-485В нашем проекте плата STM32F103C8 (Blue Pill) будет использоваться в качестве ведущей (Master), а плата Arduino Uno – в качестве ведомой (Slave).

Схема соединений между модулем MAX485 TTL в RS485 и платой STM32F103C8 (ведущей) приведена в следующей таблице.

MAX485 TTL в RS485 STM32F103C8
DI PA9 (TX1)
DE RE PA3
R0 PA10 (RX1)
VCC 5V
GND GND
A To A of Slave RS-485
B To B of Slave RS-485

Три кнопки с помощью подтягивающих резисторов 10 кОм подключены к контактам PA0, PA1, PA2 платы STM32F103C8.

Схема соединений между модулем MAX485 TTL в RS485 и платой Arduino Uno (ведомой) приведена в следующей таблице.

MAX485 TTL в RS485 Arduino Uno
DI 1 (TX)
DE RE 2
R0 0 (RX)
VCC 5V
GND GND
A To A of Master RS-485
B To B of Master RS-485

Три светодиода с помощью подтягивающих резисторов 330 Ом подключены к контактам 4, 7, 8 платы Arduino Uno.

Объяснение программ проекта

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

Для программирования плат STM32F103C8 и Arduino Uno мы будем использовать Arduino IDE. Только убедитесь в том, что в Arduino IDE вы выбрали правильный порт в пункте меню Tools->Port и правильную плату в пункте меню Tools->Board.

В нашем проекте у нас будет две программы – для платы STM32F103C8 (ведущей) и платы Arduino Uno (ведомой). Рассмотрим каждую из этих программ по отдельности.

Программа для платы STM32F103C8 (ведущей)

На стороне ведущего (Master) мы будем считывать состояние кнопок и передавать их по протоколу RS-485 через последовательный порт Serial 1 (контакты PA9, PA10) платы STM32F103C8. Для этого нам не понадобится никаких дополнительных библиотек – Arduino IDE содержит все необходимые для последовательной связи библиотеки.

В начале программы инициализируем последовательную связь на контактах PA9, PA10 со скоростью 9600 бод.

Считаем состояние кнопок, подключенных к контактам  PA0, PA1, PA2 платы STM32F103C8, и сохраним их в переменных button1val, button2val, button3val. Их значение будет равно HIGH если кнопка нажата и LOW если кнопка не нажата.

Перед тем как передавать значения кнопок через последовательный порт, на контакты DE & RE модуля RS-485 (которые подключены к контакту PA3 платы STM32F103C8), необходимо подать уровень HIGH.

Далее в зависимости от состояния кнопок мы будем передавать в последовательный порт соответствующие значения. Если нажата первая кнопка, то мы будем передавать значение ‘1’.

Аналогичным образом, если нажата кнопка 2, мы будем передавать значение 2, а если нажата кнопка 3 – то значение 3.

Когда ни одна из кнопок не нажата, мы будем передавать значение 0.

Программа для платы Arduino Uno (ведомой)

Ведомая плата Arduino Uno будет принимать значение целого типа (integer), которое было передано ей ведущей STM32F103C8. Мы будем считывать это значение и сохранять его в переменной. Далее в зависимости от значения этой переменной мы будем включать/выключать соответствующий светодиод.

Для того, чтобы осуществить прием данных по протоколу RS-485 нам необходимо подать на контакты DE & RE модуля RS-485 уровень LOW – для этого нам необходимо подать на контакт 2 платы Arduino Uno уровень LOW.

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

Далее в зависимости от принятого значения (0, 1, 2 или 3) мы будем зажигать соответствующий светодиод.

Тестирование работы проекта

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

Работа проекта при нажатии первой кнопки

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

Работа проекта при нажатии второй кнопки

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

Работа проекта при нажатии третьей кнопки

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Программа для STM32F103C8 (ведущей)

Программа для Arduino Uno (ведомой)

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
6 010 просмотров

Комментарии

Последовательная связь между STM32F103C8 и Arduino Uno по протоколу RS-485 — 6 комментариев

  1. Оставлю свой запоздалый комментарий.

    Ни RS-485, ни RS-232, ни что-то еще подобное не являются протоколами.
    Это физические интерфейсы. А протокол придумывает разработчик программы либо сообщество программистов.

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

  2. Начало статьи показало, что автор не в теме:
    Использование питания +5 и - 5в обсуждалось в 80х, когда протокол RS485 обсуждался. Появление специализированных микросхем зафиксировало только однополярние питание и уровни сигнала в одной полярности.
    Следует различать логический и физический протоколы. RS485 это только физический протокол связи, использующий (чаще всего) логический протокол RS232, который имеет и физическую и логическую версию.
    Полный дуплекс по 4м проводам называется RS422

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

      • RS-485, like RS-422, can be made full-duplex by using four wires. Похоже, комментатор выше, сам не в теме. )

        • Ну, может быть с помощью комментариев, мы все таки установим истину в этом вопросе ))

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

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