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

Коммуникация по последовательному порту, по умному называемая как универсальный асинхронный прием / передача (UART), как правило, используется для программирования и отладки Arduino через порт USB. Существуют разные датчики и приборы, которые используют UART как метод основной связи, и иногда нам нужно объединять два и больше Arduino между собой для обмена информацией.

Тем не менее, у большинства Arduino имеется только один последовательный порт, который используется при связи по USB. Но как же связать такой контроллер с другим? Конечно использование Arduino типа Mega или подобного решает эту задачу, ведь у него до четырех последовательных портов, но если нужна связь с простыми платами из линейки Ардуино, тут нужно искать другой выход. Существует особая программная библиотека, которая имитирует UART порт на других цифровых контактах. У нее имеются несколько недостатков, но в общем она работает.

Так что нам понадобится для демонстрации подобной коммуникации:

2 Arduino контроллера

Соединительные провода

Выполните следующие шаги, для подключения двух Arduino UNO, с помощью программного последовательного порта:

1. Например, воспользуемся выводами 8 и 9 для RX и TX на обоих Arduino, соедините контакт 8 на одном Arduino с контактом 9 на другом, и контакт 9 на первом Arduino подключить с контактом 8 на втором.

2. Соедините общий провод GND обеих Arduino вместе.

3. Подключите один Arduino к USB компьютера, и соедините вывод 5В этого контроллера с таким же выводом другого или подайте на второй отдельное питание.

Вот реализация с использованием выводов 8 и 9 для RX и TX:




Следующий код разделен на две части. Arduino мастер будет получать команды от компьютера и передавать их по программному последовательному порту. Вот первая часть кода:


// Подключаем библиотеку Software Serial

#include <SoftwareSerial.h>

// Объявляем задействованные дискретные каналы контроллера для связи

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

void setup(){

Serial.begin(9600); // Обычная скорость передачи данных

softSerial.begin(9600); // инициализация программного последовательного порта

}

void loop(){

// Проверяем получение команд от компьютера

if (Serial.available()){

// Отправляем полученную команду компьютера на программный UART

softSerial.write(Serial.read());

}

}


А вот и код подчиненного (слейва), который интерпретирует символы, отправленные от мастера. Если пришол символ «а», он включит встроенный светодиод. Если получен символ «х», то светодиод будет потушен:


// Подключение библиотеки Software Serial

#include <SoftwareSerial.h>

// Назначение задействованных дискретных каналов

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

// Дискретный канал, на котором висит встроенный светодиод

int LED = 13;

void setup(){

softSerial.begin(9600); // Инициализация программного последовательного порта

pinMode(LED, OUTPUT); // Определение светодиодного вывода как выход

}

void loop(){

// Проверяем, есть ли что-нибудь в буфере программного последовательного порта

if (softSerial.available()){

// Читаем один символ из буфера программного последовательного порта и сохраняем его переменную com

int com = softSerial.read();

// Действуем соответственно полученному символу

if (com == 'x'){

// Выключение светодиода

digitalWrite(LED, LOW);

}

else if (com == 'a'){

// Включение светодиода

digitalWrite(LED, HIGH);

}

}

}


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

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

Разбор кода

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


#include <SoftwareSerial.h>


Дальше нам нужно объявить объект нашей библиотеки. Это делается соответственно следующему синтаксису:


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


Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо

Новое

Логический анализатор 8 каналов

Логический анализатор 8 каналов

Цифровой логический анализатор на 8 каналовПодключается к USB-порту компьютера и работает с родной п..

Линейный подшипник 8мм

Линейный подшипник 8мм

Подшипник для линейного скольжения рабочего органа 3D-принтера или CNC по своим осям.Одевается на ци..

Подшипник для зубчатого ремня GT2 без зубьев

Подшипник для зубчатого ремня GT2 без зубьев

Подшипник для натяжения зубчатого ремня GT2 6мм на ось 5 ммПрименяется в 3D-принтерах и CNCШирина 10..

Подшипник для зубчатого ремня GT2 20 зубьев

Подшипник для зубчатого ремня GT2 20 зубьев

Подшипник для натяжения зубчатого ремня GT2 6мм на ось 5 мм20 зубьевШирина 10 мм..

HTTP запрос через GSM GPRS модуль NEOWAY M590

HTTP запрос через GSM GPRS модуль NEOWAY M590

Постановка задачи. В этом проекте посмотрим на практический пример отправки http get запроса при по..

GSM GPRS модуль A6

GSM GPRS модуль A6

Один из самых продвинутых модулей GSM для использования в любительских проектахК контроллеру подключ..

Модуль твердотельного реле 1-канальный

Модуль твердотельного реле 1-канальный

Модуль предназначен для коммутации нагрузки с переменным напряжением питания 75 ... 264 ВМаксимальны..

Модуль твердотельного реле 2-канальный

Модуль твердотельного реле 2-канальный

Модуль предназначен для коммутации двух нагрузок с переменным напряжением питания 75 ... 264 ВМаксим..

Светодиод ультраяркий 5мм

Светодиод ультраяркий 5мм

Сверхяркий светодиод диаметром 5 ммКорпус прозрачный у светодиодов разного цвета свечения. То есть р..

Радиомодуль NRF24L01+PA+LNA 2,4 ГГц

Радиомодуль NRF24L01+PA+LNA 2,4 ГГц

Модуль радио-приемника, -передатчика 2,4 ГГц для экономной безпроводной связи между любительскими ко..

Кусачки PLATO 170

Кусачки PLATO 170

Долгоиграющие кусачки с удобными мощными ручкамиПрименяются при монтаже любительских электронных про..

Направляющая с линейным подшипником 8 мм ширина 30 мм

Направляющая с линейным подшипником 8 мм ширина 30 мм

Направляющая в составе 3D-принтера или CNC для крепления подвижного рабочего органа к направляющим ц..

Модуль часов реального времени DS1302 + батарейка

Модуль часов реального времени DS1302 + батарейка

Модуль часов для любительских контроллеров на основе специализированной микросхемы DS1302Напряж..

Датчик влажности и температуры DHT21

Датчик влажности и температуры DHT21

Это точный и готовый к вывешиванию прямо на улице датчик относительной влажности и температуры со ст..

Твердотельное реле 240В 2А

Твердотельное реле 240В 2А

Реле без механических переключающихся контактов на основе симистораТакие реле из-за их быстродействи..

Кулиса с подшипником 3х10х4 мм

Кулиса с подшипником 3х10х4 мм

Подшипник с ограничительным кольцом применяется в качестве колеса для движущихся рабочих органов 3D-..