Привет! Сегодня сделаем обзор на приемник ИК сигнала KY-022 для Ардуино. А также, соберем простую схему и напишем программу, чтобы обработать сигналы от пульта дистанционного управления и научиться управлять Ардуино с помощью таких пультов.
Содержание
В прошлый раз мы делали обзор на модуль фоторезистора. Пожалуйста, посмотрите его, если уже забыли или пропустили.
Сегодня возьмем новый датчик для Ардуино и попробуем расшифровать невидимые инфракрасные сигналы от пульта дистанционного управления.
Для выполнения этого урока нам понадобятся
- Ардуино UNO
- Макетная плата
- Перемычки
- IR модуль KY-022
- Пульт ДУ
- Кабель USB
Что такое инфракрасный свет
Инфракрасное излучение, это такой же свет, какой мы видим вокруг нас. Единственное отличие от простого дневного света, это частота и длина волны. Инфракрасное излучение находится за пределами видимого глазом человека диапазона света. Поэтому мы его не видим. Но, если бы видели, он был бы таким же светом, как луч фонарика или лампы.
Поскольку ИК свет, это вид света. Для работы приемника ИК сигналов требуется прямая видимость между приемником и источником. Он не может работать через стены как wifi или bluetooth.
ИК приемник KY-022
Модуль KY-022 это приемник ИК сигналов, сигнальный светодиод и сопротивление для него. У модуля три контакта. Питание 5 вольт, земля и контакт вывода данных. С него мы будем получать код сигнала.
Подключим модуль к Ардуино по схеме.
Библиотека IRremote.h
Для удобной работы с модулем для Ардуино уже готова библиотека IRremote.h. Скачайте и установите ее с помощью менеджера библиотек. И затем откройте код программы IRreceiveDump из примеров.
С помощью этой программы мы выведем в монитор порта данные, которые считает модуль с пульта управления.
Загрузим программу в Ардуино, подключим схему и попробуем пульт.
Кроме самого кода сигнала программа выводит имя протокола, который использует пульт ДУ. В нашем случае это NEC. Пульт от телевизора Samsung будет работать по своему протоколу. Вы можете прочитать подробнее про разные протоколы, например, здесь.
Полный текст программы
#include <IRremote.h>
#if defined(ESP32)
int IR_RECEIVE_PIN = 15;
#else
int IR_RECEIVE_PIN = 11;
#endif
IRrecv IrReceiver(IR_RECEIVE_PIN);
// On the Zero and others we switch explicitly to SerialUSB
#if defined(ARDUINO_ARCH_SAMD)
#define Serial SerialUSB
#endif
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
#if defined(__AVR_ATmega32U4__) || defined(SERIAL_USB) || defined(SERIAL_PORT_USBVIRTUAL)
delay(2000); // To be able to connect Serial monitor after reset and before first printout
#endif
// Just to know which program is running on my Arduino
Serial.println(F("START " __FILE__ " from " __DATE__));
IrReceiver.enableIRIn(); // Start the receiver
IrReceiver.blink13(true); // Enable feedback LED
Serial.print(F("Ready to receive IR signals at pin "));
Serial.println(IR_RECEIVE_PIN);
}
void dump() {
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
int count = IrReceiver.results.rawlen;
IrReceiver.printResultShort(&Serial);
Serial.print(" (");
Serial.print(IrReceiver.results.bits, DEC);
Serial.println(" bits)");
Serial.print("Raw [");
Serial.print(count, DEC);
Serial.print("]: ");
for (int i = 0; i < count; i++) {
if (i & 1) {
Serial.print(IrReceiver.results.rawbuf[i] * MICROS_PER_TICK, DEC);
} else {
Serial.write('-');
Serial.print((unsigned long) IrReceiver.results.rawbuf[i] * MICROS_PER_TICK, DEC);
}
Serial.print(" ");
}
Serial.println();
}
void loop() {
if (IrReceiver.decode()) {
Serial.println();
dump();
IrReceiver.resume(); // Receive the next value
}
}
Заключение
Мы научились считывать сигналы от инфракрасного излучения и обрабатывать их в программе на Ардуино. В будущих проектах это позволит нам использовать пульты для управления устройствами на Ардуино. Попробуем сделать простую схему, чтобы проверить это в следующем проекте.