При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими arduino.
В этом уроке мы научимся соединять две arduino по стандарту RS485 через аппаратную шину UART.
Преимущества:
- Простота реализации.
- Реализуется возможность подключения более двух arduino.
- Любая arduino на линии связи может работать ведущим и/или ведомым.
- Передача данных осуществляется на большие расстояния (длина линии связи до 1,2 км).
- Не требуется отключать модули от шины UART при загрузке скетча.
Недостатки:
- Связь осуществляется в полудуплексном режиме (одновременно может отправлять данные только одна arduino).
- Используется дополнительный цифровой вывод arduino, для управления конвертирующим модулем.
Нам понадобится:
- Arduino х 2шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 2шт.
- Trema Shield х 2шт.
- Эластичная клавиатура 4x4 х 2шт.
- Шлейф «мама-мама» (4 провода) для шины I2С х 2шт.
- Витая пара «мама-мама» (2 провода) - линия связи x 1шт.
- Конвертирующий модуль на базе чипа MAX485 х 2шт.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_KB (для подключения матричных клавиатур).
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.
Видео:
Схема подключения:
Подключение LCD дисплея осуществляется к аппаратным выводам шины I2C.
Клавиатура подключается к любым цифровым выводам, в примере используются выводы 2-9.
Конвертирующий модуль подключается к шине UART:
| Конвертирующий модуль | Arduino |
|---|---|
| DI (Driver Input - вход передатчика) | TX (transmit - передать) |
| RO (Receiver Out - выход приёмника) | RX (receive - получить) |
| Vcc (Voltage constant current - напряжение постоянного тока) | Vcc |
| GND (GrouND - земля) | GND (GrouND - земля) |
| DE (Driver Enable - разрешение работы передатчика) | D10 (Digital - цифровой) |
| ~RE (Receiver Enable - разрешение работы приёмника) | D10 (Digital - цифровой) |
На рисунке приведён пример подключения двух и более устройств.
Схемы устройства-1, устройства-2, ... - идентичны.
Все конвертирующие модули на линии соединяются одноименными выводами: «A» с «A», «B» с «B».
Код программы:
// Подключаем библиотеки:
#include <Wire.h> // подключаем библиотеку для работы с шиной I2C
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для работы с LCD дисплеем
#include <iarduino_KB.h> // подключаем библиотеку для работы с матричной клавиатурой
// Объявляем переменные и константы:
LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
iarduino_KB KB(9,8,7,6,5,4,3,2); // объявляем переменную для работы с матричной клавиатурой, указывая номера aeduino подключенные к шлейфу клавиатуры, начиная с первого вывода шлейфа
const uint8_t PIN_direction_TX_RX = 10; // указываем номер вывода arduino, к которому подключены выводы RE и DE конвертирующего модуля
void setup(){
pinMode(PIN_direction_TX_RX, OUTPUT); // устанавливаем режим работы вывода PIN_direction_TX_RX, как "выход"
digitalWrite(PIN_direction_TX_RX, LOW); // устанавливаем уровень логического «0» на выводе PIN_direction_TX_RX (переводим модуль в режим приёма данных)
Serial.begin(9600); // открываем последовательный порт на скорости 9600 бод
KB.begin(KB1); // инициируем клавиатуру (KB1 - эластичная матричная клавиатура 4х4)
lcd.init(); // инициируем LCD дисплей
lcd.backlight(); // включаем подсветку LCD дисплея
lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0
lcd.print("iArduino.ru"); // выводим текст "iArduino.ru"
lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1
lcd.print("Received data:"); // выводим текст "Received data:"
}
void loop(){
if(KB.check(KEY_DOWN)){ // если нажимается кнопка (KEY_DOWN - нажимается, KEY_UP - отпускается, KEY_PRESS - удерживается), то ...
digitalWrite(PIN_direction_TX_RX, HIGH); // переводим модуль в режим передачи данных
delay(1);
Serial.print(KB.getChar); // отправляем символ кнопки в последовательный порт (для вывода цифры кнопки используйте KB.getNum)
delay(1);
digitalWrite(PIN_direction_TX_RX, LOW); // переводим модуль в режим приёма данных
}
if(Serial.available()>0){ // если в последовательном порту есть данные для чтения, то ...
lcd.setCursor(15, 1); // устанавливаем курсор в позицию: столбец 15, строка 1
lcd.print(char(Serial.read())); // выводим байт данных в виде символа, из последовательного порта на LCD дисплей
}
}
Настройка параметров линии связи:
Конвертирующий модуль только преобразует сигналы TTL в стандарт RS485 и обратно. Параметры линии: скорость передачи данных, количество бит в минимальной посылке, длина стопового бита, проверка на чётность/нечётность, зависят от настроек шины UART, см. раздел «Настройка параметров шины UART» в уроке 26.1.
Настройки шины UART всех arduino подключённых к линии должны быть идентичны!


Обсуждение