4.08. Интерфейсы связи - UART.md
До сих пор мы учили Рудирон
работать автономно: мигать светодиодами, читать данные с датчиков, издавать звуки. Но настоящая сила микроконтроллеров раскрывается тогда, когда они начинают общаться — друг с другом, с компьютером или с целой армией периферийных устройств. Для этого существуют интерфейсы связи.
Представьте, что интерфейс — это язык, на котором устройства договариваются об обмене информацией. Один из самых старых, простых и распространённых «языков» в мире электроники — это UART (Universal Asynchronous Receiver-Transmitter), или универсальный асинхронный приёмопередатчик.
Что такое UART и как он работает?
UART — это последовательный интерфейс. Это означает, что он передаёт данные бит за битом, друг за другом, по одному проводу. Это как разговор по рации: вы не можете говорить и слушать одновременно по одному каналу.
Для связи по UART нужно всего два провода:
- TX (Transmit) — передающий провод. По нему микроконтроллер отправляет данные.
- RX (Receive) — принимающий провод. По нему микроконтроллер получает данные.
Чтобы два устройства могли общаться, их нужно соединить «крест-накрест»: TX одного устройства подключается к RX другого, и наоборот. Также им нужен общий «фундамент» — провод GND (земля), чтобы у них было единое представление об уровнях напряжения.
Ключевое слово в названии UART — «асинхронный». Это значит, что у него нет отдельного провода для синхронизации (тактового сигнала). Как же тогда устройства понимают, где начинается и где заканчивается каждый байт данных? Они заранее договариваются о нескольких правилах — параметрах соединения: 1. Скорость передачи (Baud Rate): Количество бит, передаваемых в секунду. Оба устройства должны быть настроены на одну и ту же скорость. Стандартные скорости: 9600, 57600, 115200 бод. 2. Формат кадра: Устройства договариваются, что каждый байт данных будет «обёрнут» в специальную рамку: стартовый бит (сигнал о начале передачи), 8 бит данных и стоповый бит (сигнал об окончании).
UART на плате Рудирон
На плате Рудирон
есть два аппаратных UART, что даёт большие возможности.
Serial
: Этот порт подключён к USB-преобразователю и используется для связи с компьютером. Именно через него мы работаем с Монитором порта вArduino IDE
. На плате он выведен на пины 36 (RX) и 37 (TX).Serial1
: Это свободный порт, который идеально подходит для подключения внешних модулей. На плате он выведен на пины 10 (RX2) и 9 (TX2).
Протоколы: как научить устройства понимать друг друга
Представьте, что вы управляете роботизированной рукой. У неё есть несколько команд: сжать клешню
, разжать клешню
, повернуть основание
. Если вы просто отправите роботу по UART число 90
, что он должен сделать? Повернуть основание на 90 градусов? Сжать клешню с силой 90%? Непонятно.
Чтобы избежать такой путаницы, устройства должны общаться по заранее оговорённым правилам — протоколу. Протокол — это как грамматика и синтаксис языка: он определяет структуру сообщений, чтобы принимающая сторона точно знала, что от неё хотят.
Давайте создадим свой простой протокол для управления нашей роботизированной рукой. Договоримся, что каждое сообщение (пакет) будет состоять из трёх байтов:
- Стартовый байт: Всегда
0xFF
. Увидев его, робот понимает: «Внимание, пришла команда!». - Байт команды: Определяет, какое действие нужно выполнить.
0x01
— команда «Повернуть основание».0x02
— команда «Сжать/разжать клешню».
- Байт данных: Уточняет команду.
- Для команды
0x01
это будет угол поворота (0-180 градусов). - Для команды
0x02
это будет состояние клешни (1 — сжать, 0 — разжать).
- Для команды
Теперь наши команды становятся осмысленными:
- Пакет
[0xFF, 0x01, 90]
означает: «Робот, поверни основание на 90 градусов». - Пакет
[0xFF, 0x02, 1]
означает: «Робот, сожми клешню».
Это и есть суть протокола. В реальном мире они сложнее (включают проверку целостности данных, адресацию и т.д.), но принцип тот же. По такому же принципу общаются банкоматы с процессинговым центром или GPS-модуль со спутниками.
Общение с Рудироном
: класс Serial
Для работы с UART в среде Arduino
используется объект Serial
.
Инициализация порта — Serial.begin()
void setup() {
Serial.begin(9600); // Инициализируем UART на скорости 9600 бод
}
Отправка данных: print()
vs write()
-
Serial.print("Error code: 10")
: Эта функция предназначена для отправки человекочитаемых данных. Она преобразует числа и строки в последовательность ASCII-символов. Это удобно для отладки, но неэффективно для общения машин. -
Serial.write(0xFF)
: Эта функция отправляет один байт «как есть», без преобразований. Именно её следует использовать для отправки данных по протоколу, когда вы организуете связь между двумя микроконтроллерами. Она гораздо быстрее и эффективнее, чемprint()
.
Чтение данных: read()
и parseInt()
-
byte data = Serial.read()
: Считывает один байт из буфера приёма. Если буфер пуст, возвращает -1. Это основной и самый быстрый способ получить данные. -
int number = Serial.parseInt()
: Эта функция-помощник сама читает входящие ASCII-символы и собирает из них целое число. Это удобно, если вы отправляете числа с компьютера через Монитор порта, но медленно и не подходит для быстрого обмена данными по протоколу.
Пример (управление светодиодом по протоколу): Отправляем с компьютера через Монитор порта команду “1” или “0”. Рудирон
её принимает и включает или выключает светодиод.
const int ledPin = LED_BUILTIN_1;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.println("Отправьте '1', чтобы включить светодиод, или '0', чтобы выключить.");
}
void loop() {
// Проверяем, пришли ли данные
if (Serial.available() > 0) {
// Читаем входящий символ (как байт)
char command = Serial.read();
if (command == '1') {
digitalWrite(ledPin, HIGH);
Serial.println("Светодиод включен");
} else if (command == '0') {
digitalWrite(ledPin, LOW);
Serial.println("Светодиод выключен");
}
}
}
Зачем это нужно?
UART — это универсальный и простой способ наладить связь:
- С компьютером: для отладки, управления и визуализации данных.
- С другими микроконтроллерами: для создания распределённых систем.
- С периферийными модулями: GPS-приёмники, Bluetooth-модули, GSM-модемы и многие другие устройства используют UART для обмена данными.
Освоив UART, вы сделали огромный шаг к созданию сложных, взаимосвязанных проектов. Если вы хотите закрепить эти знания, переходите к лабораторным работам. А если вам интересно, как можно подключить к Рудирону
целую гирлянду датчиков, используя всего два провода, то отправляйтесь в следующий параграф, где мы изучим интерфейс I2C
.
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home