Содержание
- Обзор
- Технические характеристики
- Подключение к Arduino
- Соединение двух плат Arduino по RS485
- Часто задаваемые вопросы
Обзор интерфейса связи RS485
RS485 – это стандарт проводной связи, обычно переменяется для соединение в сеть различного промышленного оборудования. Для передачи и приёма данных используется одна витая пара проводов. Стандарт RS485 позволяет соединять устройства на расстоянии до 1,2км и подключать до 32 устройств к одной шине. При этом в системе одно устройство является ведущим (master), а остальные устройства ведомые (slave).
Существует большое количество различных типов приемопередатчиков (драйверов) RS-485. Приемопередатчики на основе микросхемы MAX485 (рисунок 1) преобразует сигналы TTL в стандарт RS485 и обратно и используются для подключения устройств на основе Arduino к шине RS485.
Рисунок 1. Модуль TTL – RS485 для Arduino.
Технические характеристики
- Напряжение питания – 5 В;
- Ток потребления – 10 мА;
- Ток потребления в режиме ожидания – 5 мА;
- Скорость передачи данных – до 2,5 Мбит/с;
- Рабочая температура – 0-70 °С;
- Размер – 44x14x20 мм.
Назначение контактов
- Vcc – питание модуля (+ 5В);
- GND – земля;
- DI – вход передатчика;
- RO – выход приёмника;
- DE – разрешение работы передатчика;
- RE – разрешение работы приёмника;
- A – линия передачи;
- B – линия передачи.
Выводы модуля A и B, являются выводами линии передачи данных, при этом все модули на линии соединяются одноименными выводами.
Подключение модуля к плате Arduino
Схема подключения модуля к плате Arduino показана на рисунке 2.
Рисунок 2. Подключение модуля TTL – RS485 к плате Arduino.
Если соединить вход DE со входом RE и подключить их к цифровому выводу Arduino, то подав на него сигнал HIGH модуль будет работать только на передачу, а подав сигнал LOW, только на приём. Для связи Arduino с модулем TTL – RS485 будем использовать программный Serial на контактах 3 и 2.
Подключение Arduino к компьютеру по RS485
Соединим наше устройство (Arduino + модуль TTL – RS485) к компьютеру по шине RS485. Для этого со стороны компьютера потребуется адаптер USB - RS485 (рисунок 3), компьютер видит его как COM-порт.
Рисунок 3. Модуль USB – RS485.
Arduino будем использовать как slave-устройство. При получении команды от компьютера, если первый байт (адрес) равен символу "1", Arduino переходит в режим передачи и отправляет ответ – "OK". Затем Arduino переходит в режим приема.
Arduino-скетч получения данных с компьютера показан в листинге 1.
Листинг 1
// подключение библиотеки
#include <SoftwareSerial.h>
// создание экземпляра
// на RX-3, TX-2
SoftwareSerial RS485Serial(3, 2);
// пин подключения выводов RE и DE
// конвертирующего модуля (выбор передача/получение)
const int PIN_DIR = 6;
unsigned long millis1,millis2;
// получаемые данные
String inputData0 = "";
// признак конца передачи
boolean dataComplete0 = false;
void setup(){
pinMode(PIN_DIR,OUTPUT);
// в режим приемника
digitalWrite(PIN_DIR, LOW);
// запуск последовательного порта
Serial.begin(9600);
// запуск SoftwareSerial
RS485Serial.begin(9600);
}
void loop() {
dataRS485Event0();
if (dataComplete0) {
Serial.print(0);
if(inputData0.charAt(0) == '1' ) {
// в режим передачи данных
digitalWrite(PIN_DIR, HIGH);
delay(10);
RS485Serial.print("OK");
delay(10);
// в режим получения данных
digitalWrite(PIN_DIR, LOW);
}
inputData0 = "";
dataComplete0 = false;
}
}
// получение данных
void dataRS485Event0() {
if (RS485Serial.available() > 0) {
// получить байт
char c = (char)RS485Serial.read();
// добавить в строку
inputData0 += c;
// конец передачи
if (с == '*') {
dataComplete0 = true;
}
}
}
Установим на компьютеру программу терминал com-порта, например ComPortToolkit и попробуем отправлять команды на Arduino. Если первый байт (адрес) – "1", arduino посылает ответ "OK" (см. рис. 4).
Рисунок 4. Отправка-получение данных между компьютером и Arduino по RS485.
Рисунок 5. Схема в сборе.
Соединение двух плат Arduino по RS485
Теперь соединим 2 платы Arduino по RS485. Первая плата Arduino по нажатии кнопки отправляет данные для переключения состояния светодиода, подключенного ко второй плате Arduino.
Нам потребуются следующие компоненты:
- Плата Arduino Uno – 2;
- Плата прототипирования – 1;
- Модуль TTL – RS485 – 2;
- Светодиод – 1;
- Кнопка – 1;
- Резистор 10 кОм – 1;
- Резистор 220 Ом – 1;
- Провода.
Схема соединения представлена на рисунке 6. Соединение приемопередатчиков обязательно по витой паре.
Рисунок 6. Схема соединений двух плат Arduino по протоколу RS485.
Скетч для первой платы представлен в листинге 2.
Листинг 2
// подключение библиотеки SoftwareSerial
#include <SoftwareSerial.h>
// создание экземпляра SoftwareSerial
// на RX-7, TX-6
SoftwareSerial RS485Serial(7, 6);
// пин Arduino, к которому подключены выводы RE и DE
// конвертирующего модуля (выбор передача/получение)
const int PIN_DIR = 10;
// Контакт 2 для подключения кнопки
const int BTN=12;
// предыдущее состояние кнопки
boolean prevBTN = 0;
// текущее состояние кнопки
boolean curBTN = 0;
// состояние светодиода
boolean ledOn = false;
void setup(){
pinMode(PIN_DIR,OUTPUT);
// в режим передатчика
digitalWrite(PIN_TX_RX, HIGH);
// запуск последовательного порта
Serial.begin(9600);
// запуск SoftwareSerial
RS485Serial.begin(9600);
}
void loop() {
curBTN = debounce(prevBTN);
if (prevBTN == LOW && curBTN == HIGH) // при нажатии
{
// изменить значение состояния светодиода
ledOn = !ledOn;
if(ledOn)
RS485Serial.println("1=1");
else
RS485Serial.println("1=0");
}
}
prevBTN = curBTN;
}
// сглаживание дребезга
boolean debounce(boolean prev) {
boolean cur = digitalRead(BTN);
if (prev != cur)
{// ждем 5мс
delay(5);
cur = digitalRead(BTN);
return cur;
}
}
Вторая плата Arduino получает строку данных, анализирует их и устанавливает состояние светодиода. Скетч для второй платы представлен в листинге 3.
Листинг 3.
// подключение библиотеки SoftwareSerial
#include <SoftwareSerial.h>
// создание экземпляра SoftwareSerial
// на RX-7, TX-6
SoftwareSerial RS485Serial(7, 6);
// пин Arduino, к которому подключены выводы RE и DE
// конвертирующего модуля (выбор передача/получение)
const int PIN_DIR = 10;
unsigned long millis1,millis2;
// получаемые данные
String inputData0 = "";
// признак конца передачи
boolean dataComplete0 = false;
// Контакт подключения светодиода
const int LED=12;
// статус светодиода
int stLed=0;
void setup(){
pinMode(PIN_DIR,OUTPUT);
// в режим получения данных
digitalWrite(PIN_DIR, LOW);
// запуск последовательного порта
Serial.begin(9600);
// запуск SoftwareSerial
RS485Serial.begin(9600);
}
void loop() {
dataRS485Event0();
if (dataComplete0) {
Serial.print(inputData0);
if(inputData0.charAt(0) == '1' && inputData0.charAt(1) == '=') {
if(inputData0.charAt(2) == '0')
stLed=0;
else
stLed=1;
digitalWrite(LED,stLled);
}
inputData0 = "";
dataComplete0 = false;
}
}
// получение данных
void dataRS485Event0() {
if (RS485Serial.available() > 0) {
// получить байт
char c = (char)RS485Serial.read();
// добавить в строку
inputData0 += c;
// конец передачи
if (с == '*') {
dataComplete0 = true;
}
}
}
Загружаем скетчи на платы и проверяем работоспособность.
Рисунок 7. Схема в сборе.
Часто задаваемые вопросы
1. Нет связи между платами Arduino.
- Проверьте питание плат Arduino и модулей TTL – RS485.
- Проверьте правильность подключения плат Arduino и модулей TTL – RS485.
- Проверьте, чтобы соединение приемопередатчиков было обязательно по витой паре.
- Проверьте, что одно из устройств на шине RS485 должно быть master, остальные – slave.