# Проект 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](../media/img-20260403134309.png) ## Пример кода *Примечание: У разных пультов разные коды кнопок. Шестнадцатеричные коды, используемые ниже (например, `0xFF629D`), являются примерами с распространённых пультов на рынке. Если кнопки вашего пульта не реагируют, откройте Монитор порта, нажмите кнопку, запишите отображаемый HEX-код и замените соответствующие операторы `case` в коде.* ```cpp /* Electronics Learning Starter Kit for Arduino Project 26 IR Remote Fan Edit By Keyes */ #include // 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 ` импортирует библиотеку. В `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](../media/P26.gif)