Андрей Смирнов
Время чтения: ~8 мин.
Просмотров: 62

Обмен данными между двумя Arduino при помощи программного UART

Простой проект в котором происходит передача значения датчика, подключенного к одной Arduino, в другую с получением требуемого результата.

Компоненты

Для реализации данного урока нам потребуется набор компонентов. Обратите внимание, что нам понадобится две платы Ардуино:

Проект

Цель этого проекта проста — понять, как передавать данные с одной платы Arduino на другую. В этом случае передаваемое значение поступает от потенциометра, подключенного к первой плате Arduino. Если значение пересекает определенный порог, включается светодиод, подключенный ко второй плате Arduino.

Как перенести значения с одной платы Arduino на другую?

Существует много разных протоколов, которые могут быть реализованы для достижения вышеупомянутой цели. Здесь мы собираемся использовать протокол I2C с конфигурацией Master Writer / Slave.

Что такое протокол I2C?

Проще говоря, в протоколе связи I2C у вас есть 2 устройства, главное и подчиненное, которые связаны между собой двумя линиями, линией данных и линией синхронизации. В Arduino Uno линией данных является аналоговый вывод 4 (A4) и для тактового сигнала — аналоговый вывод 5 (A5), что может отличаться для разных плат.

Когда тактовый вывод переключается с низкого на высокий уровень, через вывод данных передается 1 бит данных. Затем подчиненная плата может либо отправлять обратно данные через тот же вывод данных, либо выполнять задачу (как в нашем случае). Однако первые 8 бит зарезервированы для адреса ведомой платы Arduino, на которую мастер отправляет значения.

Как работает проект и что он делает?

Используется аналоговое считывание на основной (главной) плате Arduino, чтобы получить значение подключенного к нему потенциометра. Затем это значение передается на подчиненную плату Arduino, и если оно превышает пороговое значение, загорается светодиод, подключенный к подчиненному Arduino.

Схема соединения

dannie-ot-arduino-k-arduino.jpg

Схема соединения представлена на рисунке выше. Схемы такого плана очень удобно создавать в программном обеспечении Fritzing. Две платы должны иметь общее заземление, поэтому соедините заземления обеих плат вместе.

Скачать файл программы Fritzing .zip

Как это получается в реальности можно посмотреть на фотографиях ниже.

Код проекта

Ниже представлены две программы: одна для главной платы и вторая для ведомой. Напоминаем, что директива #include ничего умного не делает, она просто целиком подставляет файл, который передан параметром директиве.

Для работы нам нужно обязательно загрузить библиотеку Wire, которую можно взять здесь.

Мастер код

// Код для Основной платы  #include  // Эта библиотека используется для связи I2C  int x;  void setup() {    Wire.begin();     Serial.begin(9600);  }  void loop() {    x = analogRead(A0); // Чтение значения с потенциометра    x/=4;    Wire.beginTransmission(9); // Цифра 9 - адрес ведомой платы     Wire.write(x); // Передает значение потенциометра на ведомую плату               Wire.endTransmission();     Serial.print(x);    delay(1000);  }  

Наследник

// Код для ведомой платы  #include   int x;  void setup() {    pinMode (13, OUTPUT); // Светодиод на пин (pin) 13    Wire.begin(9); // 9 здесь адрес (упоминается также в коде основной платы)     Wire.onReceive(receiveEvent);    Serial.begin(9600);  }  void receiveEvent(int bytes) {    x = Wire.read(); // Получите значения от основной платы    Serial.print(x);  }  void loop() {    if (x > 88) { // Взято пороговое значение 88, вы можете изменить его на своё      digitalWrite(LED, HIGH);      delay(200);    }    else{      digitalWrite(LED, LOW);      delay(400);    }  }  

Чтобы подытожить идею проекту, нужно сказать, что есть много приложений для связи I2C, особенно в области IoT (Интернет вещей). Кроме того, этот пример также может быть использован в случае, когда не хватает контактов на плате для конкретного проекта и имеется несколько плат под рукой.

Как это работает

Программный последовательный порт имитирует стандартный последовательный порт на различных цифровых выводах Arduino. Это довольно удобно в целом, но нужно понимать, что это программная имитация, не поддержанная аппаратно. Это означает, что при этом тратятся общие ресурсы контроллера, в частности время выполнения цикла программы и памяти. А вообще, оно работает просто как обычный последовательный порт. Все функции, присутствующие в нормальном последовательном порте также присутствуют и в программном.

Разбор кода

Для начала взглянем на программу мастера, который получает команды по обычному последовательному порту с компьютера и отправляет подчиненному контроллеру. В начале кода мы подключаем библиотеку SoftwareSerial.h

#include

SoftwareSerial softSerial(8, 9); // RX, TX

При этом будет вызвана параллельная связь, в данном случае программная. Она будет использовать вывод 8 для чтения (RX) и вывод 9 для передачи (TX). Далее подробнее остановимся на том, какие именно выводы следует выбирать.

Используя объявленный объект библиотеки, мы можем использовать все функции, характерные для обычного аппаратного параллельного порта, такие как softSerial.read(), softSerial.write() и так далее. В следующей части кода мы проверяем пришло ли что-нибудь с аппаратного порта. И если что-то пришло, мы считываем это и отправляем в программный порт:

if (Serial.available()){

softSerial.write(Serial.read());

}

В коде подчиненного контроллера использована самая простая реализация управления светодиодом командами через последовательный порт с одной только разницей, что тут используются команды с программного порта. Меняется только синтаксис и вместо привычных функций Serial.read(), Serial.available() и так далее нужно писать softSerial.read() и softSerial.available().

Программный UART имеет некоторые важные ограничения и недостатки. Вот некоторые из них.

Использование выводов

Мы не можем использовать любые дискретные выводы плат Arduino для организации программного порта. Для Tx, вообще-то можем использовать любые, но для Rx можно использовать только те, которые поддерживают внешние прерывания. У плат Arduino Leonardo и Micro могут быть использованы только выводы 8, 9, 10, 11, 14, 15 и 16, в то время как у Mega или Mega 2560 могут быть использованы только выводы 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68 и 69.

Другие программные параллельные коммуникации

Можно организовывать и более одной программной последовательной связи, однако одновременно данные может получать только одно соединение. Это может становиться причиной потери данных. Но существует альтернативная библиотека программного параллельного порта, написанная Полом Стофрегеном, которая призвана решить как раз данную проблему. http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

</span>

IRF4905 P-канальный MOSFET-транзистор 74А 55В

Мощный полевой транзистор пятого поколения для коммутации нагрузки до 74 А напряжением до 55 ВСопрот..

16.68грн.

220V_60W_Soldering_Iron_Tool_1-228x228.png

Паяльник 60Вт с регулятором

Удобный лёгкий паяльник с регулировкой мощности и набором сменных насадок..

163.21грн.

nabor_tranzistorov-228x228.png

Набор транзисторов 10 х 10 шт.TO-92

В наборе следующие биполярные транзисторы по 10 штук каждого типа:BC337 BC327 2N2222 2N2907 2N3904 2..

84.60грн.

sound_and_informatics_3-228x228.jpg

Звук и музыкальная информатика

Попросту говоря, мы представляем звук, как вибрация, проходящая через среду (как правило, в воздухе)..

Stepper_Motor_17HS4401_3-228x228.jpg

Шаговый двигатель NEMA17

Две фазыСила удержания 40N.cmМаксимальный ток  потребления 1,7 ААктивное сопротивление фаз..

274.89грн.

1163f6bfc3f64f429ecd0676311436d0.jpg

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими Arduino.

В этом уроке мы научимся соединять две Arduino по аппаратной шине UART.

Преимущества:

  • Простота реализации.
  • Дуплексная связь, обе Arduino могут одновременно передавать данные друг другу.

Недостатки:

  • Нет возможности «залить» скетч, при наличии устройств на аппаратной шине UART.
  • Реализуется соединение только двух устройств (при отсутствии доп. модулей).

Нам понадобится:

  • Arduino х 2шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 2шт.
  • Trema Shield х 2шт.
  • Эластичная клавиатура 4×4 х 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 — земля)

38a23d16fcacd03413f00485278a77aa.jpg

Код программы:

Скачать

Настройка параметров шины 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 должны быть идентичны!

Ссылки:

  • Код программы.
  • Библиотека iarduino_KB.
  • Библиотека LiquidCrystal_I2C_V112.
  • Wiki — Установка библиотек в Arduino IDE.
  • WiKi — Работа с символьными ЖК дисплеями.
  • Wiki — Trema Shield.

Используемые источники:

  • https://arduinoplus.ru/peredacha-dannyh-zi-odnoi-arduino-v-druguiu/
  • http://geekmatic.in.ua/arduino_software_uart
  • https://lesson.iarduino.ru/page/urok-26-1-soedinyaem-dve-arduino-po-shine-uart

Рейтинг автора
5
Подборку подготовил
Андрей Ульянов
Наш эксперт
Написано статей
168
Ссылка на основную публикацию
Похожие публикации