При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими Arduino.
В этом уроке мы научимся соединять две Arduino по аппаратной шине UART.
Преимущества:
- Простота реализации.
- Дуплексная связь, обе Arduino могут одновременно передавать данные друг другу.
Недостатки:
- Нет возможности «залить» скетч, при наличии устройств на аппаратной шине UART.
- Реализуется соединение только двух устройств (при отсутствии доп. модулей).
Нам понадобится:
- Arduino х 2шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 2шт.
- Trema Shield х 2шт.
- Эластичная клавиатура 4x4 х 2шт.
- Шлейф «мама-мама» (4 провода) для шины I2С х 2шт.
- Шлейф «мама-мама» (3 провода) для шины UART x 1шт.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_KB (для подключения матричных клавиатур).
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.
Видео:
Схема подключения:
Подключение LCD дисплея осуществляется к аппаратным выводам шины I2C.
Клавиатура подключается к любым цифровым выводам, в примере используются выводы 2-9.
Соединение двух arduino осуществляется по шине UART:
Arduino 1 | Arduino 2 |
---|---|
TX (transmit - передать) | RX (receive - получить) |
RX (receive - получить) | TX (transmit - передать) |
GND (ground - земля) | GND (ground - земля) |
Код программы:
// Подключаем библиотеки: #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 подключенные к шлейфу клавиатуры, начиная с первого вывода шлейфа void setup(){ 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 - удерживается), то ... Serial.print(KB.getChar); // отправляем символ кнопки в последовательный порт (для вывода цифры кнопки используйте KB.getNum ) } if(Serial.available()>0){ // если в последовательном порту есть данные для чтения, то ... lcd.setCursor(15, 1); // устанавливаем курсор в позицию: столбец 15, строка 1 lcd.print(char(Serial.read())); // выводим байт данных в виде символа, из последовательного порта на LCD дисплей } }
Настройка параметров шины UART:
Максимальная, аппаратно реализуемая частота передачи данных, может достигать 1/8 от тактовой частоты.
Настройка шины осуществляется вызовом функции begin() класса Serial, с передачей ей до двух аргументов. Первый аргумент устанавливает частоту передачи данных (в примере 9600 бод), второй (необязательный) аргумент устанавливает количество битов, наличие проверки на четность/нечетность, длину стопового бита (по умолчанию SERIAL_8N1).
Допустимые значения второго аргумента функции begin() класса Serial:
- SERIAL_5N1
- SERIAL_6N1
- SERIAL_7N1
- SERIAL_8N1
- SERIAL_5N2
- SERIAL_6N2
- SERIAL_7N2
- SERIAL_8N2
- SERIAL_5E1
- SERIAL_6E1
- SERIAL_7E1
- SERIAL_8E1
- SERIAL_5E2
- SERIAL_6E2
- SERIAL_7E2
- SERIAL_8E2
- SERIAL_5O1
- SERIAL_6O1
- SERIAL_7O1
- SERIAL_8O1
- SERIAL_5O2
- SERIAL_6O2
- SERIAL_7O2
- SERIAL_8O2
Значения отличаются последними тремя символами, которые означают следующее:
- Первая цифра: указывает количество бит в минимальной посылке (от 5 до 8).
- Буква N/E/O: E-проверка четности, O-проверка нечетности, N-без проверки.
- Последняя цифра: указывает длину стопового бита (1 или 2 битовых интервала)
Таким образом значение по умолчанию SERIAL_8N1 означает, что в минимальной посылке 8 бит (без учёта стартового и стопового битов), данные передаются без проверки на чётность/нечётность, длина стопового бита равна 1 битовому интервалу.
Настройки шины UART обеих arduino должны быть идентичны!
Обсуждение