При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими 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 подключённых к линии должны быть идентичны!
Обсуждение