4.08.1. Лабораторная работа №4.8.1.md


Командный центр

Тема работы

До сих пор мы использовали последовательный порт (Serial) в основном для односторонней связи — Рудирон отправлял нам отладочную информацию. В этой лабораторной работе мы организуем полноценный двусторонний диалог! Мы создадим свой собственный текстовый протокол и напишем программу, которая будет принимать команды с компьютера и управлять целой группой устройств: светодиодом, RGB-светодиодом и вентилятором.

Цель

  • Научиться принимать и обрабатывать команды, отправленные с компьютера через монитор порта.
  • Разработать и реализовать простой текстовый протокол для управления устройствами.
  • Освоить функции Serial.readStringUntil() и String.substring() для парсинга (разбора) команд.
  • Создать многофункциональное устройство, управляемое удалённо.

Оборудование и материалы

  • Отладочная плата Рудирон.
  • Макетная плата и модуль питания, батарея 9В.
  • 1 вентилятор и 1 биполярный NPN-транзистор (например, BC337).
  • 1 RGB-светодиод и 3 резистора по 220 Ом.
  • 1 обычный светодиод и 1 резистор 220 Ом.
  • 1 резистор на 1 кОм (для базы транзистора).
  • Соединительные провода и USB-кабель.
  • Компьютер с Arduino IDE.

Ход работы

  1. Разработка нашего протокола

    Чтобы Рудирон понимал наши команды, нужен строгий формат — протокол. Наш протокол будет очень простым - команда состоит из одной буквы-идентификатора и числовых параметров.

    • L<яркость> — управление обычным светодиодом. Пример: L128 — установить яркость 128 (из 255).
    • V<скорость> — управление вентилятором. Пример: V255 — включить вентилятор на полную скорость.
    • C<красный>,<зелёный>,<синий> — управление цветом RGB-светодиода. Пример: C255,0,128 — установить пурпурный цвет.
  2. Сборка схемы

    Мы соберём большую схему, объединяющую несколько наших прошлых проектов.

    • Питание. Используйте внешний источник 5В от модуля питания. Соедините земли (GND) Рудирона и модуля питания.
    • Вентилятор. Подключите через NPN-транзистор к пину 20.
      • Красный провод (+) вентилятора — к шине 5V.
      • Чёрный провод () вентилятора — к Коллектору (C) транзистора.
      • Эмиттер (E) транзистора — к GND.
      • Базу (B) транзистора через резистор 1 кОм — к пину 20 Рудирона.
    • RGB-светодиод. Подключите красный, зелёный и синий каналы через резисторы 220 Ом к ШИМ-пинам 5, 7, 8. Общий катод — к GND.
    • Обычный светодиод. Подключите через резистор 220 Ом к ШИМ-пину 12.

    Рис. 1. Общая схема подключения всех компонентов

  3. Написание и загрузка кода

    • Установите перемычку PRG | RUN в положение PRG.
    • В Arduino IDE введите следующий код:

      // Пины для устройств
      const int ledPin = 12;
      const int fanPin = 20;
      const int redPin = 5;
      const int greenPin = 7;
      const int bluePin = 8;
      
      void setup() {
        Serial.begin(115200); // Используем высокую скорость
        pinMode(ledPin, OUTPUT);
        pinMode(fanPin, OUTPUT);
        pinMode(redPin, OUTPUT);
        pinMode(greenPin, OUTPUT);
        pinMode(bluePin, OUTPUT);
        Serial.println("Командный центр Рудирон готов!");
        Serial.println("Примеры команд: L128, V255, C255,0,128");
      }
      
      void loop() {
        // Проверяем, пришла ли новая команда с компьютера
        if (Serial.available() > 0) {
        // Читаем всю строку до символа новой строки
        String input = Serial.readStringUntil('\n');
        // Удаляем возможные пробелы в начале и конце
        input.trim(); 
      
        // Получаем первый символ - это наша команда
        char command = input.charAt(0);
        // Получаем остальную часть строки - это параметры
        String params = input.substring(1);
      
        // Используем switch для выбора действия
        switch (command) {
            case 'L': {
              int brightness = params.toInt();
              analogWrite(ledPin, brightness);
              Serial.println("OK! Яркость светодиода изменена.");
              break;
            }
            case 'V': {
              int speed = params.toInt();
              analogWrite(fanPin, speed);
              Serial.println("OK! Скорость вентилятора изменена.");
              break;
            }
            case 'C': {
              // Парсинг RGB - это чуть сложнее
              int firstComma = params.indexOf(',');
              int secondComma = params.indexOf(',', firstComma + 1);
      
              if (firstComma > 0 && secondComma > 0) {
                String r_str = params.substring(0, firstComma);
                String g_str = params.substring(firstComma + 1, secondComma);
                String b_str = params.substring(secondComma + 1);
      
                int r = r_str.toInt();
                int g = g_str.toInt();
                int b = b_str.toInt();
      
                analogWrite(redPin, r);
                analogWrite(greenPin, g);
                analogWrite(bluePin, b);
                Serial.println("OK! Цвет RGB изменен.");
              } else {
                Serial.println("Ошибка! Неверный формат цвета. Пример: C255,0,128");
              }
              break;
            }
            default:
              Serial.println("Ошибка! Неизвестная команда.");
              break;
        }
        }
      }
      
    • Нажмите кнопку «Upload», чтобы загрузить код на плату.
  4. Проверка работы

    • Откройте Монитор последовательного порта (Tools → Serial Monitor).
    • В правом нижнем углу установите скорость 115200 бод и режим Newline.
    • Вводите команды в строку отправки и нажимайте Enter:
      • L255 — светодиод загорится на полную яркость.
      • V128 — вентилятор закрутится на половине скорости.
      • C0,255,255 — RGB-светодиод станет голубым.
      • V0 — вентилятор остановится.

Результаты

Вы создали универсальный пульт управления! Ваша программа принимает текстовые команды, анализирует их и выполняет соответствующие действия, управляя сразу несколькими устройствами.

Анализ результатов

  • Serial.readStringUntil('\n'). Эта удобная функция читает все символы из порта, пока не встретит символ новой строки, который отправляется при нажатии Enter в мониторе порта.
  • input.charAt(0). Получаем первый символ строки-команды.
  • input.substring(1). «Вырезаем» из строки всё, кроме первого символа, чтобы получить параметры.
  • params.toInt(). Преобразует строку с параметрами в целое число.
  • params.indexOf(','). Для команды C мы ищем позиции запятых, чтобы разделить строку на три части — для красного, зелёного и синего.

Выводы

В этой лабораторной работе вы освоили двусторонний обмен данными с Рудироном через UART. Вы научились создавать простые текстовые протоколы, которые являются основой для взаимодействия с другими микроконтроллерами, компьютерами или даже веб-сервисами.

Вопросы для самопроверки

  1. Что такое протокол связи?
  2. Почему для этого проекта мы выбрали высокую скорость порта (115200)?
  3. Как работает парсинг команды для RGB-светодиода?
  4. Как можно улучшить наш протокол? (Подсказка, что, если пользователь введёт L500 или C100,200 без третьей цифры?).
  5. Придумайте и опишите новую команду для нашего протокола. Например, команду B (Blink), которая заставит обычный светодиод мигнуть 5 раз.

Вы научились создавать собственный язык для общения с Рудироном! В следующем параграфе мы изучим интерфейс I2C, который позволяет подключить к микроконтроллеру целую гирлянду датчиков, используя всего два провода.