Управление arduino пультом ик

Содержание

ИК-приемник VS1838B и arduino

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

Пульт дистанционного управления являться передатчиком информации, а в качестве приемника можно использовать инфракрасный датчик VS1838B, который продается совсем за смешные деньги.

Приемник работает на частоте 38 кГц, данная частота является самой распространенной среди ИК-пультов, используемых в домашней технике.

Подключение ИК-датчика VS1838B к arduino

Для считывания ИК-сигнала и преобразования его к человеческому виду – числу, можно воспользоваться библиотекой IRremote, с ее помощью весь скетч займет всего несколько строк.Ссылка на библиотеку: IRremote .

Но прежде, чем начать писать программу, необходимо разобраться с подключением приемника VS1838B. Датчик имеет всего три ноги, две из них – это питание, и третья передает полученный сигнал.

Ниже приведена фотография VS1838B с подписанными ножками:

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

Код скетча для ИК-приемника VS1838B

Каждая кнопка ИК-пульта имеет уникальный код, который мы будем получать с помощью датчика VS1838B. В первую очередь запишем скетч, который выводит в консоль коды кнопок, после чего уже дополнить программу условиями на конкретные кнопки.Ниже приведет скетч для работы с ИК-приемником VS1838B и arduino, скачать его можно тут: скачать.

#include // подключаем библиотеку int ledPin = 13; // светодиод int reciverPin = 11; // пин, к котрому подключен ИК-приемник IRrecv irrecv(reciverPin); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // запуск приемника pinMode(ledPin, OUTPUT); } void loop() { // постоянно считываем данные с приемника if (irrecv.decode(&results)) { // выводим в консольку, что получили, число в 16-ричном виде Serial.println(results.value, HEX); // проверяем сигналы – и если это те, что нам нужны, то вкл или выкл светодиод if(results.value == 0x926DC837) digitalWrite(13, HIGH); if(results.value == 0x926D48B7) digitalWrite(13, LOW); irrecv.resume(); // готовы принимать следующий сигнал } }

Пример работы ИК-датчика VS1838B и arduino можно посмотреть ниже на видео.

Взаимодействие nRF24L01 с Arduino

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

Принципиальная схема подключения модуля nRF24L01 к Arduino приведена ниже. Для разнообразия я использовал UNO для приемной части и Nano для предающей части. Но для других плат Arduino, таких как Mini и Mega, логика подключения остается неизменной.

Подключаем Arduino к Интернету.

Общая суть всей затеи, это на контролере поднять web сервер, и при отправки GET запроса на Arduino, создать событие включение кондиционера. Для подключение Arduino к сети Интернет, используем модуль Enc28j60. Подключаем его к контроллеру по следующей схеме:
Arduino — Enc28j60
10 — CS
11 — SI (ST)
12 — SO
13 — SCK
5V — 5V
GND — GND
Хочу остановиться на такой проблеме: сам чип модуля Enc28j60 работает с напряжением 3.3V. Я использую контроллер Arduino Pro Mini 5V, соответственно и модуль Enc28j60 я использую с штатным стабилизатором AMS1117. То есть, по идеи, я могу сразу подавать питание к пину на Enc28j60 — 5V, и все будет нормально. Но при таком подключении, у меня модуль отказывался работать! Потеряв более полдня на танцы с бубном, решил попробовать подключить питание на пин 3.3v, с использованием еще одного стабилизатора AMS1117, и все заработало. Как оказалось, штатный стабилизатор вышел из строя.
Итак, после подключения модуля к контроллеру, нужно скачать еще одну библиотеку ETHER_28J60, и установить.
Создаем новый скетч, и вставляем следующий код

#include <enc28j60.h>
#include <etherShield.h>
#include <ETHER_28J60.h>
#include <ip_arp_udp_tcp.h>
#include <net.h>
#include <IRremote.h>
IRsend irsend;
static uint8_t mac = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};
static uint8_t ip = {192, 168, 4, 45};
static uint16_t port = 80;
ETHER_28J60 e;
void setup()
{
  e.setup(mac, ip, port);
}
void loop()
{
  int khz = 38;
  unsigned int irSignal[] = {4400,4350, 550,1550, 550,500, 550,1600, 550,1550, 550,500, 550,550, 550,1550, 550,500, 550,550, 550,1550, 550,500, 550,550, 550,1550, 550,1600, 550,500, 550,1550, 550,1600, 550,500, 550,500, 550,1600, 550,1550, 550,1600, 550,1550, 550,1600, 550,500, 550,1550, 550,1600, 550,500, 550,500, 550,550, 550,500, 550,500, 550,500, 550,1600, 550,500, 550,500, 550,1600, 550,1550, 550,550, 550,500, 550,1550, 550,550, 550,1550, 550,1550, 550,550, 550,500, 550,1550, 550,1600, 550};
  char* params;
  if (params = e.serviceRequest()){
    e.print("<H1>Web Remote</H1>");
    e.print("<A HREF='?cmd=power'>Power</A></br>");
    if (strcmp(params, "?cmd=power") == 0) irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal), khz);
e.respond();
  }
}

Ссылки для скачивания библиотек:
— IRremote
— ETHER_28J60
Продолжение статьи: Создания универсального ИК пульта из Arduino. Работа над ошибками

1Описание и принцип действия ИК датчика препятствий

Инфракрасное (ИК) или infrared (IR) излучение – это невидимое человеческим глазом электромагнитное излучение в диапазоне длин волн от 0,7 до 2000 мкм. Вокруг нас существуют огромное количество объектов, которые излучают в данном диапазоне. Его иногда называют «тепловое излучение», т.к. все тёплые предметы генерируют ИК излучение.

Длины волн разных типов электромагнитного излучения

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

Если оснастить, для примера, своего робота несколькими такими ИК модулями, можно определять направление приближения препятствия и менять траекторию движения робота в нужном направлении.

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

Модуль с ИК излучателем и ИК приёмником

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

Помимо инфракрасного свето- и фотодиода важная часть модуля – это компаратор LM393 (скачать техническое описание на LM393 можно в конце статьи). С помощью компаратора сенсор сравнивает интенсивность отражённого излучения с некоторым заданным порогом и устанавливает «1» или «0» на выходе. Потенциометр позволяет задать порог срабатывания ИК датчика (и, соответственно, дистанцию до препятствия).

Работа с беспроводным приемопередающим модулем nRF24L01+

Однако для того, чтобы наш nRF24L01 работал без проблем, мы могли бы рассмотреть следующие вещи. Я долгое время работал с этим nRF24L01+ и изучил следующие моменты, которые могут помочь вам избежать препятствий. Вы можете попробовать это, когда модули не работают в нормальном режиме.

Большинство модулей nRF24L01+ на рынке являются поддельными. Самые дешевые, которые мы можем найти на Ebay и Amazon, являются худшими (не волнуйтесь, с помощью нескольких ухищрений мы можем заставить их работать).
Основная проблема – источник питания, а не ваш код

Большинство примеров кода в интернете работают правильно.
Обратите внимание, что модули, которые промаркированы как NRF24L01+, на самом деле это Si24Ri (да, это китайский продукт).
Клоны и поддельные модули будут потреблять больше энергии, поэтому разрабатывайте свою схему питания не на основе технического описания nRF24L01+, поскольку Si24Ri будет иметь высокое потребление тока, около 250 мА.
Остерегайтесь пульсаций напряжения и скачков тока, эти модули очень чувствительны и могут легко выйти из строя (я пока поджарил 2 модуля).
Добавление пары конденсаторов (10 мкФ и 0,1 мкФ) между Vcc и Gnd модуля помогает очистить питание, и это работает с большинством модулей.

Тестирование основной схемы

Когда у вас будет собранная на макетной плате схема, подключенные к ней Arduino и аудиоколонки со встроенным усилителем, вы сможете запустить тестовую программу, которая приведена в архиве в конце статьи (Si4844_Quick_Test.ino). Эта программа выполняет простой тест, который включает питание устройства, устанавливает диапазон FM (УКВ) и предоставляет информацию о версии микросхемы. Если всё пройдет хорошо, вы сможете настроить частоту радиоприемника, повернув ручку VR1, увидите частоту, динамически отображаемую на экране и, конечно, услышите то, что выдает радиоприемник.

Скриншот экрана с результатами вывода тестовой программы

Если основная схема и ее подключение к Arduino работают, то можно собирать полноценный радиоприемник.

How to Connect an IR Receiver to the Arduino

There are several different types of IR receivers, some are stand-alone, and some are mounted on a breakout board. Check the datasheet for your particular IR receiver since the pins might be arranged differently than the HX1838 IR receiver and remote set I am using here. However, all IR receivers will have three pins: signal, ground, and Vcc.

Lets get started with the hardware connections. The pin layout on most breakout boards looks like this:

The pinout of most stand-alone diodes is like this:

To connect a breakout board mounted IR receiver, hook it up to the Arduino like this:

To connect a stand-alone receiver diode, wire it like this:

Схема подключения передатчика и приемника 433 МГц к Arduino UNO

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

Поскольку мы будем передавать данные между двумя платами Arduino, нам, конечно, понадобятся две платы Arduino, две макетные платы и пара соединительных проводов.

Схема для передатчика довольно проста. У него всего три соединения. Подключите контакт VCC к контакту 5 В и минус к Arduino. Контакт Data-In должен быть подключен к цифровому контакту Arduino № 12. Вы должны использовать  контакт 12, так как по умолчанию библиотека, которую мы будем использовать в нашем скетче, использует этот контакт для ввода данных.

На следующем рисунке показана схема соединения.

После подключения передатчика вы можете перейти к приемнику. Подключение приемника так же просто, как и передатчика.

Так же нужно сделать только три соединения. Подключите контакт VCC к контакту 5 В и минус на Arduino. Любой из двух средних выводов Data-Out должен быть подключен к цифровому выводу № 11 на Arduino.

Вот так должна выглядеть схема соединения для приемника.

Теперь, когда передатчик и приемник подключены, нам нужно написать код и отправить его на соответствующие платы Arduino. Поскольку у вас, вероятно, только один компьютер, мы начнем с передатчика. Как только код будет загружен, мы перейдем к приемнику. Arduino, к которому подключен передатчик, может питаться от источника питания или батареи.

Добавление дисплея

Теперь, когда у нас есть устройство ввода, нам необходима возможность отображать настройки радиоприемника. Я не смог придумать ничего лучше, чем использовать дисплей от старых мобильных телефонов Nokia 5110/3310.

Дисплей Nokia 5110/3310

При работе с этим дисплеем необходимо учитывать два важных момента. Во-первых, существует несколько разновидностей этих дисплеев, и у них могут быть разные распиновки. Вы должны проверить распиновку на своем дисплее, убедиться, что он на самом деле работает от 3,3 В, и проверить правильность подключения к Arduino Pro Mini. Во-вторых, поскольку все входы/выходы Arduino используют напряжение 3,3 В, мне не пришлось использовать понижающие резисторы, которые вы обычно видите, когда эти дисплеи используются 5-вольтовыми платами Arduino, например, Uno.

Подключение дисплея Nokia 5110/3310 к Arduino
Вывод дисплея / Назначение Вывод Arduino или точка на схеме
1-RST D3
2-CE D4
3-DC D5
4-DIN D6
5-CLK D7
6-VCC Vcc (3.3v)
7-LIGHT GND
8-GND GND

В программе я решил использовать библиотеку LCD5110_Basic, которая быстра и очень проста в использовании.

На рисунке ниже показан заполненный данными дисплей радиоприемника.

Дисплей Nokia 5110/3310 при использовании в радиоприемнике (на скриншоте некорректно показаны единицы измерения частоты mHz, в прошивке это исправлено MHz)

Начиная с левого верхнего угла, мы показываем:

  • строка 1 – режим (AM/FM/SW) и номер диапазона;
  • строка 2 – частотный диапазон;
  • строка 3 – уровни громкости и баса/тембра;
  • строка 4 – текущая частота (МГц или кГц);
  • строка 1 – индикаторы стерео (только для FM) и выключения звука (если активно).

Разумеется, эта информация постоянно обновляется, чтобы показывать изменения в настройках или вводе с клавиатуры.

Библиотеки для работы с IR

Для работы с ИК устройствами можно использовать библиотеку IRremote, которая позволяет упростить построение систем управления. Скачать библиотеку можно здесь.  После загрузки скопируйте файлы в папку \arduino\libraries. Для подключения в свой скетч библиотеки нужно добавить заголовочный файл #include <IRemote.h>.

Для чтения информации используется пример IRrecvDumpV2 из библиотеки. Если пульт уже существует в списке распознаваемых, то сканирование не потребуется. Для считывания кодов нужно запустить среду ARduino IDE и открыть пример IRrecvDemo из IRremote.

Существует и вторая библиотека для работы с ИК сигналами – это IRLib. Она похожа по своему функционалу на предыдущую. По сравнению с IRremote в IRLib имеется пример для определения частоты ИК датчика. Но первая библиотека проще и удобнее в использовании.

После загрузки библиотеки можно начать считывать получаемые сигналы. Для этого используется следующий код.

Оператор decode_results  нужен для того, чтобы присвоить полученному сигналу имя переменной results .

В коде нужно переписать «HEX» в «DEC».

Затем после загрузки программы нужно открыть последовательный монитор и нажимать кнопки на пульте. На экране будут появляться различные коды. Нужно сделать пометку с тем, к какой кнопке соотносится полученный код. Удобнее полученные данные записать в таблицу. После этот код можно записать в программу, чтобы можно было управлять прибором. Коды записываются в память самой платы ардуино EEPROM, что очень удобно, так как не придется программировать кнопки при каждом включении пульта.

Бывает, что при загрузке программы выдается ошибка «TDK2 was not declared In his scope». Для ее исправления нужно зайти в проводник, перейти в папку, в которой установлено приложение Arduino IDE и удалить файлы IRremoteTools.cpp и IRremoteTools.h. После этого нужно произвести перезагрузку программы на микроконтроллер.

How IR Remotes and Receivers Work

A typical infrared communication system requires an IR transmitter and an IR receiver. The transmitter looks just like a standard LED, except it produces light in the IR spectrum instead of the visible spectrum. If you have a look at the front of a TV remote, you’ll see the IR transmitter LED:

The same type of LED is used in IR transmitter breakout boards for the Arduino. You can see it at the front of this Keyes IR transmitter:

The IR receiver is a photodiode and pre-amplifier that converts the IR light into an electrical signal. IR receiver diodes typically look like this:

Some may come on a breakout board like this:

IR Signal Modulation

IR light is emitted by the sun, light bulbs, and anything else that produces heat. That means there is a lot of IR light noise all around us. To prevent this noise from interfering with the IR signal, a signal modulation technique is used.

In IR signal modulation, an encoder on the IR remote converts a binary signal into a modulated electrical signal. This electrical signal is sent to the transmitting LED. The transmitting LED converts the modulated electrical signal into a modulated IR light signal. The IR receiver then demodulates the IR light signal and converts it back to binary before passing on the information to a microcontroller:

The modulated IR signal is a series of IR light pulses switched on and off at a high frequency known as the carrier frequency. The carrier frequency used by most transmitters is 38 kHz, because it is rare in nature and thus can be distinguished from ambient noise. This way the IR receiver will know that the 38 kHz signal was sent from the transmitter and not picked up from the surrounding environment.

The receiver diode detects all frequencies of IR light, but it has a band-pass filter and only lets through IR at 38 kHz. It then amplifies the modulated signal with a pre-amplifier and converts it to a binary signal before sending it to a microcontroller.

IR Transmission Protocols

The pattern in which the modulated IR signal is converted to binary is defined by a transmission protocol. There are many IR transmission protocols. Sony, Matsushita, NEC, and RC5 are some of the more common protocols.

The NEC protocol is also the most common type in Arduino projects, so I’ll use it as an example to show you how the receiver converts the modulated IR signal to a binary one.

Logical ‘1’ starts with a 562.5 µs long HIGH pulse of 38 kHz IR followed by a 1,687.5 µs long LOW pulse. Logical ‘0’ is transmitted with a 562.5 µs long HIGH pulse followed by a 562.5 µs long LOW pulse:

This is how the NEC protocol encodes and decodes the binary data into a modulated signal. Other protocols differ only in the duration of the individual HIGH and LOW pulses.

IR Codes

Each time you press a button on the remote control, a unique hexadecimal code is generated. This is the information that is modulated and sent over IR to the receiver. In order to decipher which key is pressed, the receiving microcontroller needs to know which code corresponds to each key on the remote.

Different remotes send different codes for the keypresses, so you’ll need to determine the code generated for each key on your particular remote. If you can find the datasheet, the IR key codes should be listed. If not though, there is a simple Arduino sketch that will read most of the popular remote controls and print the hexadecimal codes to the serial monitor when you press a key. I’ll show you how to set that up in a minute, but first we need to connect the receiver to the Arduino…

Комплектующие

Ниже перечислим все комплектующие для нашего урока.

Arduino Uno R3

Arduino Uno R3 — это плата, которая поможет вам обработать код и заставить вашу схему работать. Вы также можете купить данную плату в любом удобном магазине.

Макетная плата

Макетная плата поможет вам собрать схему без необходимости паять детали.

Кабель для Arduino

Этот кабель поможет вам подключить Ардуино к вашему ноутбуку.

ИК-приемник

ИК-приемник поможет вам получить ИК-сигнал и отправить информацию в Arduino.

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

ИК-пульт отправляет ИК-сигнал на ИК-приемник.

Перемычки «мама-мама»

Перемычки помогут соединить различные комплектующие на макетной плате.

Светодиоды

Светодиод включается и светится, когда на него подается электричество.

Резисторы 1 КОм и 220 Ом

Резисторы помогают уменьшить количество тока, протекающего в цепи. Они нужны для того, чтобы обезопасить многие детали от поломки.

Protocol=UNKNOWN

If you see something like as output of e.g. the ReceiveDemo example, you either have a problem with decoding a protocol, or an unsupported protocol.

  • If you have an odd number of bits received, it is likely, that your receiver circuit has problems. Maybe because the IR signal is too weak.
  • If you see timings like then one 450 µs space was split into two 150 and 100 µs spaces with a spike / error signal of 200 µs between. Maybe because of a defective receiver or a weak signal in conjunction with another light emitting source nearby.
  • If you see timings like , then marks are generally shorter than spaces and therefore (specified in your ino file) should be negative to compensate for this at decoding.
  • If you see it may be that the space after the initial mark is longer than . This was observed for some LG air conditioner protocols. Try again with a line e.g. before the line in your ino file.
  • To see more info supporting you to find the reason for your UNKNOWN protocol, you must enable the line in IRremoteInt.h.

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

После этого необходимо подключить заголовочный файл библиотеки в программу.

Arduino

#include <IRremote.h>

1 #include <IRremote.h>

Затем в программе необходимо указать контакт платы Arduino, к которому подключен контакт данных (Data pin) инфракрасного приемника. В нашем случае он подключен к контакту D2 платы Arduino.

Arduino

int IRPIN = 2;

1 intIRPIN=2;

После этого необходимо создать объект для работы с инфракрасным приемником.

Arduino

IRrecv irrecv(IRPIN);

1 IRrecvirrecv(IRPIN);

Далее объявим объект класса decode_results – он будет использоваться инфракрасным приемником для передачи декодированной информации.

Arduino

decode_results result;

1 decode_resultsresult;

Внутри функции setup() инициализируем последовательную связь и инфракрасный приемник при помощи вызова функции irrecv.enableIRIn().

Arduino

void setup()
{
Serial.begin(9600);
Serial.println(«Enabling IRin»);
irrecv.enableIRIn();
Serial.println(«Enabled IRin»);
Initialize_streamer();
}

1
2
3
4
5
6
7
8

voidsetup()

{

Serial.begin(9600);

Serial.println(«Enabling IRin»);

irrecv.enableIRIn();

Serial.println(«Enabled IRin»);

Initialize_streamer();

}

В функции loop() мы с помощью функции irrecv.decode будем непрерывно проверять наличие нового сигнала и если новый сигнал был принят, то его код мы будем сохранять в переменной result.value.

Arduino

void loop()
{
if (irrecv.decode(&result))
{
Serial.print(«Value: «);
Serial.println(result.value, HEX);
Write_streamer();
irrecv.resume();
}
delay(500);
}

1
2
3
4
5
6
7
8
9
10
11

voidloop()

{

if(irrecv.decode(&result))

{

Serial.print(«Value: «);

Serial.println(result.value,HEX);

Write_streamer();

irrecv.resume();

}

delay(500);

}

Для передачи данных из Arduino в лист Excel мы будем использовать плагин PLX-DAQ (ранее мы его уже использовали в проекте логгера данных температуры и влажности на основе Arduino). С помощью функции Write_streamer() мы будем передавать данные последовательно в специальном формате (фактически, это формат файлов .csv, которые можно считать с помощью Excel), которые нам будут затем необходимы для вывода информации в лист Excel.

Arduino

void Write_streamer()
{
Serial.print(«DATA»); //всегда передавайте «DATA» чтобы показать что следующая информация будет представлять собой данные
Serial.print(«,»); // переходим к следующему столбцу используя символ «,»
Serial.print(result.value, HEX); //сохраняем данные в Excel
Serial.print(«,»); // переходим к следующему столбцу используя символ «,»
Serial.print(button); // сохраняем данные в Excel
Serial.print(«,»); // переходим к следующему столбцу используя символ «,»
Serial.println(); //конец строки, переходим к следующей строке
}

1
2
3
4
5
6
7
8
9
10

voidWrite_streamer()

{

Serial.print(«DATA»);//всегда передавайте «DATA» чтобы показать что следующая информация будет представлять собой данные

Serial.print(«,»);// переходим к следующему столбцу используя символ «,»

Serial.print(result.value,HEX);//сохраняем данные в Excel

Serial.print(«,»);// переходим к следующему столбцу используя символ «,»

Serial.print(button);// сохраняем данные в Excel

Serial.print(«,»);// переходим к следующему столбцу используя символ «,»

Serial.println();//конец строки, переходим к следующей строке

}

После того как аппаратная и программная части проекта будут готовы, можно будет загружать программу в плату Arduino. После загрузки кода в плату направьте пульт ДУ на спроектированный нами декодер и начинайте нажимать на нем кнопки. Шестнадцатеричный код (hex code) каждой кнопки будет печататься в окне монитора последовательной связи (serial monitor).

Декодирование инфракрасных сигналов управления с помощью Arduino

Плата Arduino в рассматриваемом проекте выполняет сразу две функции: одна заключается в декодировании инфракрасных сигналов от пультов ДУ, а вторая — в управлении инфракрасным излучателем.

Для декодирования сигналов от инфракрасных пультов ДУ мы будем использовать заголовочный файл от Ken Shirriff’s IRremote, который значительно упрощает эти процессы. Для работы с этим заголовочным файлом вы должны сделать следующую последовательность действий:

Текст программы для декодирования сигналов от инфракрасных пультов ДУ:

После того как вы сумеете это реализовать аккуратно запишите все значения кодов и другую представленную информацию для всех кнопок со всех пультов ДУ, которые вы хотите реализовать в вашем универсальном пульте. Таким образом, вы создадите своеобразную базу данных кнопок и соответствующих им кодов.

Представленный пример программы для декодирования сигналов инфракрасных пультов ДУ был взят из подпапки ‘examples’ (примеры) папки IRremote (которую мы скачали по вышеприведенной ссылке). Также в подпапке ‘examples’ вы можете при желании изучить и другие примеры работы с устройствами инфракрасной связи.

Скетч Arduino для радиочастотного передатчика 433 МГц

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

Вот скетч, который мы будем использовать для нашего передатчика:

// Подключаем библиотеку RadioHead Amplitude Shift Keying
#include <RH_ASK.h>
// Подключаем библиотеку SPI Library 
#include <SPI.h> 
 
// Создаем объект управления смещением амплитуды
RH_ASK rf_driver;
 
void setup()
{
    // Инициализируем объект ASK
    rf_driver.init();
}
 
void loop()
{
    const char *msg = "Hello World";
    rf_driver.send((uint8_t *)msg, strlen(msg));
    rf_driver.waitPacketSent();
    delay(1000);
}

Это довольно короткий набросок, но это все, что вам нужно для передачи сигнала.

Код  начинается с подключения библиотеки RadioHead ASK. Мы также должны подключить библиотеку SPI Arduino,  так как от нее зависит библиотека RadioHead.

#include <RH_ASK.h>
#include <SPI.h>

Далее нам нужно создать объект ASK, чтобы получить доступ к специальным функциям, связанным с библиотекой RadioHead ASK.

// Создаем объект управления смещением амплитуды
RH_ASK rf_driver;

В функции setup() нам нужно инициализировать объект ASK.

// Инициализируем объект ASK
    rf_driver.init();

В функции loop() мы начинаем с подготовки сообщения. Это простая текстовая строка, которая хранится в char с именем msg. Знайте, что ваше сообщение может быть любым, но не должно превышать 27 символов для лучшей производительности. И обязательно посчитайте количество символов в нем, так как вам понадобится это количество в коде получателя. В нашем случае у нас 11 символов.

// Готовим сообщение
const char *msg = "Hello World";

Затем сообщение передается с использованием функции send(). Он имеет два параметра: первый — это массив данных, а второй — количество байтов (длина данных), подлежащих отправке. За  send() функцией обычно следует  waitPacketSent() функция, которая ожидает завершения передачи любого предыдущего передаваемого пакета. После этого код ждет секунду, чтобы дать нашему приемнику время разобраться во всем.

rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(1000);

Устройство ИК приемника. Принцип работы

Приемники инфракрасного излучения получили сегодня широкое применение в бытовой технике, благодаря доступной цене, простоте и удобству в использовании. Эти устройства позволяют управлять приборами с помощью пульта дистанционного управления и их можно встретить практически в любом виде техники. Но, несмотря на это, постепенно Bluetooth модуль набирает все большую популярность.


Принцип работы IR ресивера. Обработка сигнала от пульта ДУ

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

Под действием инфракрасного излучения в фотодиоде, у которого между p и n областями создана дополнительная область из полупроводника (i-область), начинает течь ток. Сигнал поступает на усилитель и далее на полосовой фильтр, который настроен на фиксированную частоту: 30; 33; 36; 38; 40 и 56 килогерц и защищает приемник от помех. Помехи могут создавать любые бытовые приборы.

Управляем освещением при помощи ИК-пульта

В этом примере мы рассмотрим управление с помощью обычного пульта управления от телевизора. Для этого примера потребуется такое оборудование и ПО:

  • Arduino UNO — одна из разновидностей плат ардуино;
  • Блок твердотельного реле FOTEK SSR-25DA;
  • ИК-приемник TSOP1xxx;
  • Любой ИК-Пульт от телевизора;
  • Arduino IDE — программное обеспечение для загрузки микрокода в микроконтроллер Arduino;
  • Лампочка, подключаемая к сети 220 вольт.

https://github.com/z3t0/Arduino-Irremote/archive/master.zip

Загруженный архив нужно распаковать в папку «C:\Program Files\Arduino\libraries», где Arduino IDE хранит все библиотеки. Теперь можно запустить установленную ранее Arduino IDE. В запущенной программе нам нужно ввести код, изображенный ниже.

В нашем случае мы будем использовать пульт от телевизора Samsung. Ниже показано изображение используемого ИК-Пульта.

Из примера видно, что сделать систему управления светом на базе Arduino совсем несложно. Также стоит отметить, что для этого примера вы можете использовать практически любой ИК-Пульт. Саму же сборку лучше всего поместить в отдельный блок и разместить рядом с лампочкой. Таким образом, при наведении пульта на лампочку, ее можно будет включать и отключать. Еще хотелось бы отметить, что удобней использовать схему с беспроводным Bluetooth адаптером. Такая схема намного функциональней, поскольку передает сигнал через радиоволну, а управление светом производится через смартфон. Но такая схема будет намного дороже рассмотренной из-за стоимости беспроводного Bluetooth адаптера.

Using the IR Remote to Control Things

Now I’ll show you a simple demonstration of how you can use the IR remote to control the Arduino’s output pins. In this example, we will light up an LED when a particular button is pressed. You can easily modify the code to do things like control servo motors, or activate relays with any button press from the remote.

The example circuit has the IR receiver connected to the Arduino, with a red LED connected to pin 10 and a green LED connected to pin 11:

The code below will write digital pin 10 HIGH for 2 seconds when the “5” button is pressed, and write digital pin 11 HIGH for 2 seconds when the “2” button is pressed:

So far we have covered the properties of infrared radiation and how communication happens between the transmitter and receiver. We saw how to identify the IR key codes for a given remote control. We learned how to display key presses on serial monitor and on an LCD screen. Finally I showed you how to control the Arduino’s output with the remote. Have fun playing with this and be sure to let us know in the comments if you have any questions or trouble setting this up!

Krishna Pattabiraman is a frequent guest writer on Circuit Basics and the founder of www.codelectron.com.