- Последовательная связь RS-485
- Необходимые компоненты
- Принципиальная электрическая схема
- Программирование STM32F103C8 и Arduino UNO для последовательной связи RS485
- Тестирование связи RS485 между STM32F103C8 и Arduino UNO:
Протоколы связи являются неотъемлемой частью цифровой электроники и встроенной системы. Везде, где есть интерфейс между несколькими микроконтроллерами и периферийными устройствами, протокол связи должен использоваться для обмена пакетами данных. Доступно много типов протоколов последовательной связи. RS485 является одним из протоколов последовательной связи и используется в промышленных проектах и тяжелом оборудовании.
Мы узнали о последовательной связи RS485 между Arduino Uno и Arduino Nano в предыдущем руководстве . Это руководство посвящено использованию последовательной связи RS-485 в микроконтроллере STM32F103C8. Если вы новичок в микроконтроллере STM32, начните с раздела «Приступая к работе с STM32 с использованием Arduino IDE: мигающий светодиод» и проверьте здесь все проекты STM32.
В этом руководстве Master STM32F103C8 имеет три кнопки, которые используются для управления состоянием трех светодиодов, присутствующих на Slave Arduino Uno, с помощью последовательной связи RS-485.
Давайте начнем с понимания работы последовательной связи RS-485.
Последовательная связь RS-485
RS-485 - это протокол асинхронной последовательной связи, не требующий часов. Он использует технику, называемую дифференциальным сигналом, для передачи двоичных данных от одного устройства к другому.
Так что же это за метод передачи дифференциального сигнала ??
Метод дифференциального сигнала работает путем создания дифференциального напряжения с использованием положительного и отрицательного напряжения 5 В. Он обеспечивает полудуплексную связь при использовании двух проводов и полнодуплексную связь при использовании четырех проводов.
Используя этот метод:
- RS-485 поддерживает более высокую скорость передачи данных до 30 Мбит / с.
- Он также обеспечивает максимальное расстояние передачи данных по сравнению с протоколом RS-232. Он передает данные на расстояние до 1200 метров.
- Основным преимуществом RS-485 перед RS-232 является наличие нескольких ведомых устройств с одним ведущим устройством, в то время как RS-232 поддерживает только одно ведомое устройство.
- Может иметь до 32 устройств, подключенных к протоколу RS-485.
- Еще одно преимущество RS-485 - невосприимчивость к шуму, поскольку для передачи используется метод дифференциального сигнала.
- RS-485 быстрее по сравнению с протоколом I2C.
Модуль RS-485 можно подключить к любому микроконтроллеру, имеющему последовательный порт. Для использования модуля RS-485 с микроконтроллерами необходим модуль под названием 5V MAX485 TTL to RS485, основанный на микросхеме Maxim MAX485, поскольку он обеспечивает последовательную связь на большом расстоянии до 1200 метров и является двунаправленным, а полудуплексный режим имеет скорость передачи данных 2,5. Мбит / с. Для этого модуля требуется напряжение 5 В.
Описание контактов RS-485:
Имя контакта |
Описание |
VCC |
5В |
А |
Неинвертирующий вход приемника Выходной сигнал неинвертирующего драйвера |
B |
Инвертирование входа приемника Инвертирование выхода драйвера |
GND |
GND (0 В) |
R0 |
Выход приемника (вывод RX) |
RE |
Выход приемника (LOW-Enable) |
DE |
Выход драйвера (HIGH-Enable) |
DI |
Вход драйвера (вывод TX) |
Модуль RS485 имеет следующие особенности:
- Рабочее напряжение: 5 В
- Встроенный чип MAX485
- Низкое энергопотребление для связи RS485
- Трансивер с ограничением скорости нарастания
- 2P клемма с шагом 5,08 мм
- Удобная проводка связи RS-485
- Все выводы микросхемы могут управляться через микроконтроллер.
- Размер платы: 44 х 14 мм
Использовать этот модуль с STM32F103C8 и Arduino UNO очень просто. Используются аппаратные последовательные порты микроконтроллеров. Аппаратные последовательные контакты в STM32 и Arduino UNO приведены ниже.
- В STM32F103C8: контакты PA9 (TX) и PA10 (RX)
- В Arduino Uno: контакт 0 (RX) и 1 (TX)
Программирование также простое, просто используйте Serial.print () для записи в RS-485 и Serial.Read () для чтения из RS-485, а контакты DE и RE RS-485 становятся НИЗКИМИ для приема данных и ВЫСОКИМИ для записывать данные в шину RS-485.
Необходимые компоненты
- STM32F103C8
- Arduino UNO
- Модуль преобразователя MAX485 TTL в RS485 - (2)
- Потенциометр 10K
- Кнопка - 3
- Светодиод - 3
- Резисторы
- Макетная плата
- Подключение проводов
Принципиальная электрическая схема
В этом руководстве STM32F103C8 используется как Master с одним модулем RS-485, а Arduino UNO используется как Slave с другим модулем RS-485.
Цепное соединение между RS-485 и STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE RE |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5В |
GND |
GND |
А |
К ведомому RS-485 |
B |
К B ведомого RS-485 |
STM32F103C8 с тремя кнопками:
Три кнопки с тремя понижающими резисторами номиналом 10 кОм подключены к контактам PA0, PA1, PA2 модуля STM32F103C8.
Цепное соединение между RS-485 и Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (Техас) |
DE RE |
2 |
R0 |
0 (RX) |
VCC |
5В |
GND |
GND |
А |
К А Мастера RS-485 |
B |
К Б Мастера RS-485 |
Используются три светодиода, где аноды светодиодов с резистором 330 Ом подключены к контактам 4, 7, 8 Arduino UNO, а катоды светодиодов подключены к GND.
Программирование STM32F103C8 и Arduino UNO для последовательной связи RS485
Arduino IDE используется для разработки и программирования обеих плат, то есть STM32 и Arduino UNO. Но убедитесь, что вы выбрали соответствующий ПОРТ из Инструменты-> Порт и Плата из Инструменты-> Плата. Если вы обнаружите какие-либо трудности или сомнения, просто обратитесь к разделу Программирование вашего STM32 в ARDUINO IDE. Программирование для этого руководства состоит из двух разделов, один для STM32F103C8 (ведущий), а другой для Arduino UNO (ведомый). Оба кода будут объяснены один за другим ниже.
STM32F103C8 как МастерНа стороне Master состояние кнопки считывается, а затем эти значения последовательно записываются на шину RS-485 через последовательные аппаратные порты 1 (PA9, PA10) STM32F103C8. Также на данный момент нет необходимости во внешней библиотеке. Arduino имеет всю необходимую библиотеку для последовательной связи.
Начните последовательную связь с помощью аппаратных последовательных контактов (PA9, PA10) со скоростью 9600.
Serial1.begin (9600);
Считайте состояние кнопки на выводах PA0, PA1, PA2 модуля STM32F103C8 и сохраните их в переменных button1val, button2val, button3val. Значение ВЫСОКОЕ, если кнопка нажата, и НИЗКОЕ, если не нажата.
int button1val = digitalRead (кнопка1); int button2val = digitalRead (кнопка2); int button3val = digitalRead (button3);
Перед отправкой значений кнопок в последовательный порт контакты DE и RE RS-485 должны быть ВЫСОКИМ, которые подключены к контакту PA3 STM32F103C8 (чтобы сделать контакт PA3 ВЫСОКИМ):
digitalWrite (enablePin, HIGH);
Затем, чтобы поместить эти значения в последовательный порт и отправить значения в зависимости от того, какая кнопка нажата, используйте оператор if else и отправьте соответствующее значение при нажатии кнопки.
Если нажата первая кнопка, то условие соответствует, и значение «1» отправляется в последовательный порт, к которому подключен Arduino UNO.
если (button1val == HIGH) { int num1 = 1; Serial1.println (число1); }
Аналогично, при нажатии кнопки 2 значение 2 отправляется через последовательный порт, а при нажатии кнопки 3 значение 3 отправляется через последовательный порт.
иначе, если (button2val == HIGH) { int num2 = 2; Serial1.println (число2); } иначе, если (button3val == HIGH) { int num3 = 3; Serial1.println (число3); }
И когда ни одна кнопка не нажата, в Arduino Uno отправляется значение 0.
иначе { int num = 0; Serial1.println (число); }
На этом завершается программирование для настройки STM32 как ведущего.
Arduino UNO в качестве ведомогоНа стороне Slave Arduino UNO получает целочисленное значение, которое отправляется от Master STM32F103C8, которое доступно на аппаратном последовательном порту Arduino UNO (P0, 1), к которому подключен модуль RS-485.
Просто прочтите значение и сохраните его в переменной. В зависимости от полученного значения соответствующий светодиод включается или выключается при подключении к Arduino GPIO.
Чтобы получить значения от Мастера, просто установите контакты DE и RE модуля RS-485 в НИЗКОЕ. Таким образом, контакт 2 (enablePin) Arduino UNO имеет низкий уровень.
digitalWrite (enablePin, LOW);
Теперь просто прочтите целочисленные данные, доступные в последовательном порту, и сохраните их в переменной.
int получить = Serial.parseInt ();
В зависимости от полученного значения, то есть (0, 1, 2, 3), соответственно включается один из трех светодиодов.
if (receive == 1) // В зависимости от полученного значения соответствующий светодиод включается или выключается { digitalWrite (ledpin1, HIGH); } иначе, если (получить == 2) { digitalWrite (ledpin2, HIGH); } иначе, если (получить == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
На этом завершается программирование и настройка Arduino UNO как Slave. Также на этом завершаются полные конфигурации для Arduino UNO и STM32. Рабочее видео и все коды прилагаются в конце этого урока.
Тестирование связи RS485 между STM32F103C8 и Arduino UNO:
1. Когда нажимается кнопка-1, которая подключена к ведущему STM32, загорается светодиод 1, подключенный к ведомому Arduino.
2. При нажатии кнопки 2, подключенной к ведущему STM32, загорается светодиод 2, подключенный к ведомому Arduino.
3. Точно так же, когда нажата кнопка 3, загорается светодиод 3, подключенный к ведомому Arduino.
Это завершает последовательную связь RS485 между STM32F103C8 и Arduino UNO. Платы Arduino UNO и STM32 широко используются для быстрого прототипирования, и мы выполнили много полезных проектов на этих платах. Если вы обнаружите какие-либо сомнения или предложения для нас, напишите и прокомментируйте ниже.