Проект 26: Вентилятор с ИК-пультом

Введение в проект

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

Аппаратная часть проекта

Для выполнения проекта потребуются следующие компоненты:

  1. Плата разработки UNO R3 (CH340) × 1

  2. ИК-пульт дистанционного управления × 1

  3. ИК-приёмный модуль × 1 (если используется голый компонент, добавьте конденсаторы 100нФ и 10μФ по необходимости)

  4. Микросхема драйвера мотора L293D × 1

  5. Двигатель постоянного тока 130 × 1

  6. Батарейка 9В и держатель для батарейки × 1 (для независимого питания мотора)

  7. Макетная плата × 1 и несколько проводов Dupont

Принцип работы проекта

Проект включает скоординиренную работу двух независимых систем:

  1. Декодирование инфракрасного сигнала (ИК-декодирование):
    ИК-пульт излучает инфракрасные световые сигналы, модулированные несущей частотой 38 кГц, через передний ИК-светодиод. ИК-приёмник улавливает этот свет, фильтрует помехи окружающей среды и преобразует его обратно в электрические сигналы. Arduino с помощью библиотеки IRremote декодирует эти сигналы по протоколу NEC, преобразуя их в уникальные шестнадцатеричные (HEX) коды. Каждая кнопка соответствует уникальному коду.

  2. Управление мотором:
    После получения декодированного кода кнопки Arduino выполняет логическую проверку (например, нажата ли кнопка «вверх»?). После подтверждения команды Arduino посылает соответствующий PWM-сигнал скорости и сигналы высокого/низкого уровня направления на микросхему L293D. Используя внутреннюю схему H-моста L293D, он безопасно управляет вращением мотора вперёд, назад или торможением.

Установка библиотеки (Установка библиотеки IRremote)

Перед написанием кода необходимо установить специальную библиотеку для ИК-пульта:

  1. В Arduino IDE нажмите в меню Инструменты -> Управление библиотеками….

  2. В появившемся окне менеджера библиотек в поле поиска введите IRremote.

  3. Найдите библиотеку с названием IRremote, выберите версию 2.0.1 из выпадающего списка версий (чтобы соответствовать синтаксису этого урока, не устанавливайте последнюю версию), затем нажмите «Установить».

  4. Дождитесь, пока статус не изменится на «Установлено», затем закройте окно.

Схема подключения

1. Контакты ИК-приёмника

  • VCC ➔ Подключить к 5V Arduino

  • GND ➔ Подключить к общему GND макетной платы

  • OUT (сигнальный пин) ➔ Подключить к Arduino D2

2. Контакты драйвера мотора L293D

  • Pin 1 (Enable 1) ➔ Подключить к Arduino D10 (управление скоростью PWM)

  • Pin 2 (Input 1) ➔ Подключить к Arduino D11 (направление 1)

  • Pin 7 (Input 2) ➔ Подключить к Arduino D9 (направление 2)

  • Pin 3 (Output 1) ➔ Подключить к одному из выводов двигателя постоянного тока

  • Pin 6 (Output 2) ➔ Подключить к другому выводу двигателя постоянного тока

  • Pin 16 (VCC1) ➔ Подключить к 5V Arduino (питание логики микросхемы)

  • Pin 8 (VCC2) ➔ Подключить к положительному выводу батарейки 9V (независимое питание вентилятора)

  • Pin 4, 5 (GND) ➔ Подключить к общему GND макетной платы (Важно: GND Arduino и отрицательный вывод батарейки 9V должны иметь общий общий провод)
    Img

Пример кода

Примечание: У разных пультов разные коды кнопок. Шестнадцатеричные коды, используемые ниже (например, 0xFF629D), являются примерами с распространённых пультов на рынке. Если кнопки вашего пульта не реагируют, откройте Монитор порта, нажмите кнопку, запишите отображаемый HEX-код и замените соответствующие операторы case в коде.

/*

Electronics Learning Starter Kit for Arduino

Project 26

IR Remote Fan

Edit By Keyes

*/

#include <IRremote.h> // Include IR library (version 2.0.1 required)

// --- 1. IR Receiver Pin Definition and Object Creation ---
const int RECV_PIN = 2; // IR receiver signal pin D2
IRrecv irrecv(RECV_PIN); // Create IR receiver object
decode_results results;  // Object to store decoding results

// --- 2. L293D Motor Control Pin Definition ---
const int enablePin = 10; // D10: motor speed control (PWM)
const int in1Pin = 11;    // D11: motor direction 1
const int in2Pin = 9;     // D9:  motor direction 2

void setup() {
  Serial.begin(9600);      // Initialize serial port at 9600 baud
  irrecv.enableIRIn();     // Start the IR receiver

  // Set motor pins as outputs
  pinMode(enablePin, OUTPUT);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  
  Serial.println("System initialized, waiting for IR signals...");
}

void loop() {
  // If an IR signal is received and decoded successfully
  if (irrecv.decode(&results)) { 
    // Print the received hexadecimal IR code to the serial monitor
    Serial.print("Received IR code: 0x");
    Serial.println(results.value, HEX); 

    // Execute corresponding action based on received button code
    switch (results.value) {
      
      // Button 1 (example code): Forward rotation (replace with your remote's "up" key code)
      case 0xFF629D: 
        setMotor(255, false); // Full speed forward
        Serial.println("Action: Fan forward (FORWARD)");
        break;

      // Button 2 (example code): Reverse rotation (replace with your remote's "down" key code)
      case 0xFFA857: 
        setMotor(255, true);  // Full speed backward
        Serial.println("Action: Fan backward (BACKWARD)");
        break;

      // Button 3 (example code): Stop (replace with your remote's "OK" or "stop" key code)
      case 0xFF02FD: 
        setMotor(0, false);   // Speed zero, stop
        Serial.println("Action: Fan stop (STOP)");
        break;
        
      default:
        // Unknown button, do nothing
        break;
    }
    
    // Prepare to receive the next signal
    irrecv.resume(); 
  }
  
  delay(100); // Slight delay to avoid excessive reading from rapid button presses
}

// --- 3. Custom Motor Control Function ---
void setMotor(int speed, boolean reverse) {
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, !reverse); 
  digitalWrite(in2Pin, reverse);  
}

Объяснение кода

  1. Подключение и инициализация: #include <IRremote.h> импортирует библиотеку. В setup() функция irrecv.enableIRIn() активирует приёмник для прослушивания сигнала 38 кГц на пине D2.

  2. Декодирование и обнаружение: irrecv.decode(&results) — основная функция. Она постоянно слушает и возвращает true, когда нажата кнопка пульта, сохраняя декодированный уникальный код в results.value.

  3. Логика switch-case: После получения кода программа использует оператор switch для сопоставления. Если совпадает case 0xFF629D:, программа понимает, что нужно включить вентилятор, и вызывает пользовательскую функцию setMotor(255, false).

  4. Сброс приёмника: irrecv.resume() — часто забываемая, но критически важная строка. Она очищает буфер и готовит приёмник к приёму следующей команды. Без неё приёмник работает только один раз.

Наблюдения при эксперименте

  1. После подключения и загрузки кода откройте Монитор порта в Arduino IDE и установите скорость передачи в правом нижнем углу на 9600.

  2. Направьте пульт на ИК-приёмник и нажимайте кнопки. В Мониторе порта будут отображаться шестнадцатеричные коды, например, 0xFF629D.

  3. Важный шаг отладки: Измените значения 0xFFxxxx в операторе switch в примере кода согласно фактическим кодам вашего пульта, затем заново загрузите код.

  4. После отладки: при нажатии определённой кнопки вентилятор будет вращаться вперёд на полной скорости; при нажатии другой — назад на полной скорости; при нажатии кнопки стоп — плавно тормозить и останавливаться. Теперь у вас есть умный вентилятор, управляемый пультом от телевизора!

P26