4.07.2. Лабораторная работа №4.7.2.md


ИК-пульт и ИК-приемник

Тема работы

В этой лабораторной работе мы сделаем наши проекты по-настоящему беспроводными! Мы познакомимся с инфракрасным (ИК) пультом и ИК-приёмником — технологией, которая используется в пультах от телевизоров, кондиционеров и музыкальных центров. Мы научимся считывать и декодировать сигналы от пульта, чтобы управлять Рудироном на расстоянии, и разберёмся, как правильно обрабатывать не только одиночные нажатия, но и зажатие кнопок.

Цель

  • Понять принцип работы ИК-связи.
  • Научиться использовать библиотеку Rudiron_IRremote для приёма и декодирования ИК-сигналов.
  • Определять уникальные коды кнопок пульта.
  • Реализовать управление светодиодом, включая правильную обработку зажатия кнопки.

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

  • Отладочная плата Рудирон.
  • Макетная плата.
  • ИК-приёмник.
  • ИК-пульт.
  • Соединительные провода.
  • USB-кабель для подключения Рудирона.
  • Компьютер с Arduino IDE и установленной библиотекой Rudiron_IRremote.

Ход работы

  1. Как работает ИК-управление?

    1. Пульт (передатчик). Когда вы нажимаете кнопку, ИК-светодиод на пульте начинает очень быстро мигать (обычно с частотой 38 кГц), отправляя закодированную последовательность импульсов. У каждой кнопки — своя уникальная «морзянка».
    2. Приёмник. Он отфильтровывает видимый свет, «очищает» сигнал от несущей частоты 38 кГц и на своём выходе (Signal) выдаёт микроконтроллеру чистую последовательность импульсов.

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

  2. Установка библиотеки и сборка схемы

    • Скачайте архив с библиотекой Rudiron_IRremote из нашего репозитория: Rudiron Libraries.
    • Установите её через Arduino IDE (Sketch → Include Library → Add .ZIP Library…).
    • Подключите ИК-приёмник:
      • GND (или ) — к пину GND Рудирона.
      • VCC (или +) — к пину 5V Рудирона.
      • Signal (или OUT) — к пину 2 Рудирона.
  3. Этап 1. Узнаём коды кнопок

    Сначала нам нужно узнать, какие коды отправляет каждая кнопка нашего пульта.

    • Загрузите на Рудирон следующий код-декодер:

      #include <Rudiron_IRremote.h>
      #define IR_RECEIVE_PIN 2
      
      void setup() {
        Serial.begin(115200);
        IrReceiver.attach(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Включаем приёмник
        Serial.println("Наведите пульт и нажимайте кнопки...");
      }
      
      void loop() {
        if (IrReceiver.decode()) {
        // Выводим полученный код в шестнадцатеричном формате
        Serial.print("Код: 0x");
        Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
      
        // Готовимся к приёму следующей команды
        IrReceiver.resume(); 
        }
      }
      
    • Откройте монитор порта (скорость 115200 бод).
    • Направляйте пульт на приёмник и нажимайте кнопки «+» и «-». Запишите их коды.
    • Обратите внимание! Если зажать кнопку, сначала отправится её уникальный код, а затем — многократно код повтора FFFFFFFF.
  4. Этап 2. Программа управления

    Теперь напишем программу, которая будет управлять яркостью встроенного светодиода L1.

    • Сотрите предыдущий код и введите новый, подставив ваши коды кнопок:

      #include <Rudiron_IRremote.h>
      
      #define IR_RECEIVE_PIN 2
      
      // Вставьте сюда ВАШИ коды кнопок!
      #define PLUS_CODE     0xFFA857 // Пример кода для кнопки «+»
      #define MINUS_CODE    0xFFE01F // Пример кода для кнопки «-»
      #define REPEAT_CODE   0xFFFFFFFF 
      
      int brightness = 0; // Текущая яркость светодиода L1
      unsigned long lastDecodedValue = 0; // Хранит последний РЕАЛЬНЫЙ код кнопки
      
      void setup() {
        Serial.begin(115200);
        IrReceiver.attach(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
        pinMode(LED_BUILTIN_1, OUTPUT);
      }
      
      void loop() {
        if (IrReceiver.decode()) {
        unsigned long currentCode = IrReceiver.decodedIRData.decodedRawData;
        unsigned long codeToProcess;
      
        // --- Логика обработки зажатия ---
        if (currentCode != REPEAT_CODE)
            // Если пришел новый, уникальный код, запоминаем его
            lastDecodedValue = currentCode;
      
        // --- Управление на основе кода ---
        switch (lastDecodedValue) {
            case PLUS_CODE:
              brightness += 10;
              break;
            case MINUS_CODE:
              brightness -= 10;
              break;
        }
      
        // Ограничиваем яркость в пределах 0-255
        brightness = constrain(brightness, 0, 255);
      
        // Применяем новую яркость
        analogWrite(LED_BUILTIN_1, brightness);
        Serial.print("Яркость: ");
        Serial.println(brightness);
      
        IrReceiver.resume();
        }
      }
      
    • Загрузите код на плату и проверьте: кнопки «+» и «-» должны плавно менять яркость светодиода L1. Если зажать кнопку, яркость будет меняться непрерывно.

Результаты

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

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

  • Библиотека Rudiron_IRremote. Она работает в фоновом режиме. Функция IrReceiver.decode() просто проверяет, не появилось ли в её внутреннем буфере новое, полностью принятое и расшифрованное сообщение. Это идеальный пример псевдопараллелизма.
  • Обработка зажатия: Наш алгоритм работает так:

    1. Мы ждём новый сигнал от приёмника.
    2. Если пришедший код — не код повтора, мы считаем его новой командой и запоминаем в переменной lastDecodedValue.
    3. Если пришедший код — это код повтора (FFFFFFFF), мы игнорируем его и используем для обработки последнюю запомненную команду из lastDecodedValue.

    Это позволяет корректно реагировать на зажатие - действие (увеличение или уменьшение яркости) будет продолжаться, пока мы держим кнопку.

Выводы

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

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

  1. Как пульт передаёт информацию о том, какая кнопка нажата?
  2. Что такое код повтора и зачем он нужен?
  3. Объясните, как работает наша логика обработки зажатия с переменной lastDecodedValue.
  4. Что делает команда IrReceiver.resume()?
  5. Как изменить программу, чтобы по нажатию на кнопку «POWER» светодиод либо выключался (0), либо включался на полную яркость (255)?

Вы научились создавать устройства с дистанционным управлением!