Найти в Дзене
Электроника, ESP32, Arduino

Как работать с UART на Arduino без Arduino Wiring

А зачем, когда в среде Arduino IDE полно готовых функций для работы с Serial ? Разберемся на конкретном примере. Потребуется любая Arduino подобная платформа на контроллере ATMega328P (Nano, UNO) - вторая часть примера будет написана на C и для адаптации под другую платформу придется заглянуть в документацию на микроконтроллер который стоит в Вашей плате, чтобы узнать названия используемых регистров.

Напишем простенькую программу которая будет зажигать встроенный светодиод при отправке символа "A" и гасить его при отправке символа "B" через монитор порта встроенный в среду Arduino IDE и самое главное отправлять полученный символ обратно. С практической точки зрения отправка символа обратно нужна для того, чтобы знать точно, поступила ли команда? Пригодится такая реализация может в том случае если Arduino находится на расстоянии 1-2 км (на Ali без проблем можно найти радио-модули на такую дальность связи) и нам необходимо точно знать, дошла и выполнилась наша команда или нет.

Алгоритм работы программы написанный на Arduino Wiring будет следующий:

Алгоритм работы программы написанной на языке Arduino Wiring
Алгоритм работы программы написанной на языке Arduino Wiring

Сама программа будет выглядеть следующим образом.

Скетч на Arduino  Wiring
Скетч на Arduino Wiring
Отправили символ A, светодиод светится, получили символ A обратно
Отправили символ A, светодиод светится, получили символ A обратно
Светодиод L зажегся
Светодиод L зажегся
Отправили символ B, светодиод гаснет получили символ B обратно
Отправили символ B, светодиод гаснет получили символ B обратно
Светодиод L погас
Светодиод L погас

Как будет работать данная программа если кроме светодиода потребуется в основном цикле loop () выполнять какие-нибудь трудоемкие операции (например вывод данных на какой-нибудь e-Paper дисплей занимающий 2-4 секунды) ?

Дисплей я цеплять не буду, сымитируем вывод на дисплей оператором delay (); который какое то время выполняет бесполезные операции.

Добавляем светодиод на 5-й ПИН и мигаем им 1 раз в секунду
Добавляем светодиод на 5-й ПИН и мигаем им 1 раз в секунду

Алгоритм работы:
Алгоритм работы:
Ч
Ч

Если в момент мигания светодиодом придет байт, то он никуда не пропадет, а будет сохранен во внутреннем буфере, но задержка обработки этой команды и отправка ответа составит до 2-х секунд в зависимости от того в какой момент времени мы этот байт отправим.

Профессиональные "мигальщики" светодиодом разумеются легко перепишут данный код используя оператор millis() или таймер, но если в самоделке будет работа с "железкой" требующая больших ресурсов или сложная математика - такой подход не прокатит. Поэтому грамотное мигание светодиодом оставим профессионалам, поработаем с Arduino как домохозяйка или ребенок без использования ардуиновских функций.

Для начала необходимо сконфигурировать порт

Секция setup
Секция setup

Переменную мы будем обновлять в прерывании, поэтому необходимо использовать ключевое слово volatile. Её в дальнейшем можно будет использовать и в основном цикле loop в качестве флага для включения чего-нибудь ресурсоемкого.

Секция loop и процедура прерывания
Секция loop и процедура прерывания

В бесконечном цикле loop осталась только изменение состояния светодиода на ПИН 5.

Как только Arduino получит байт:

  • выполнение основного цикла будет приостановлено
  • будет вызвана процедура прерывания ISR(USART_RX_vect) {}
  • состояние встроенного светодиода будет изменено, а сам байт будет отправлен обратно.
  • выполнение основного цикла будет продолжено

Теперь в основном цикле можно делать математические расчеты, выводить на дисплей картинку, обрабатывать данные с каких-либо датчиков - Arduino всегда будет моментально отвечать по первому запросу. Используя данный механизм можно и получать какую-нибудь телеметрию с устройства если вносить данные с датчика в переменную b непосредственно в основном цикле.

Если "на пальцах" механизм работы с UART достаточно простой. Приходящий сигнал от компа через встроенный в плату Arduino USB-UART преобразователь занимается, "ногодрыгом" ножки Rx. Аппаратное обеспечение микроконтроллера, анализирует этот "ногодрыг", и укладывает полученные биты в 8-ми битный регистр UDR. После того как пришла вся посылка - вызывается прерывание, говорящее о том, что данные можно забирать. Для отправки данных мы пишем в регистр UDR байт, аппаратное обеспечение микроконтроллера дрыгает ножкой Tx пока не отправит байт целиком. Приводить графики сигналов, схему аппаратной части, форматы посылок в статье, нет ни какого смысла - лучше ознакомиться с этим в специализированной литературе.

Как видно из примера - решать практические задачи на голом С гораздо проще, чем с использованием встроенного в среду Arduino IDE языка Arduino Wiring, а учитывая то, что вместо компьютера можно подключить другую плату и любой китайский радио-модуль, легко организовать умную, полностью автономную радиосвязь с радиусом действия в несколько километров.

Проводное соединение, радио модули 433Мгц (до 2км) , Bluetooth HC-05  (защищенный канал)
Проводное соединение, радио модули 433Мгц (до 2км) , Bluetooth HC-05 (защищенный канал)

Но это уже совсем другая история, которую все равно не кому не покажут так как, это не скопированное чужое видео с Тик-Ток )))

Полный список статей доступен по этой ссылке:

Список всех статей канала ESP32 и Arduino

Всем удачи!