Технология инфракрасной связи (IR – Infrared) является очень простой, дешевой и широко распространенной в настоящее время технологией связи. Инфракрасный свет по своей сущности очень похож на видимый свет за исключением того, что длина волны у него немного больше, чем у видимого света. Это свойство делает инфракрасный свет невидимым для человеческого глаза и крайне удобным для осуществления беспроводной связи.
Существует множество примеров, в котором вам для управления устройствами с помощью инфракрасной связи необходимо сначала декодировать их инфракрасные сигналы. В данной статье мы рассмотрим создание на основе платы Arduino и инфракрасного приемника TSOP1838 инфракрасного декодера (IR Remote Decoder). Шестнадцатеричный код (hex code) каждой кнопки мы будем записывать в лист Microsoft Excel.
Ранее на нашем сайте мы уже рассматривали декодирование инфракрасных сигналов в следующих проектах:
- автоматизация дома с использованием инфракрасной связи и Arduino;
- автоматическое управление температурой кондиционера с помощью Arduino и DHT11;
- пульт управления кондиционером на основе Arduino и смартфона;
- универсальный инфракрасный пульт ДУ на основе Arduino и приложения для Android.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress) или Arduino Nano (купить на AliExpress).
- Инфракрасный приемник (IR Receiver) TSOP1838 (купить на AliExpress).
- Соединительные провода.
- Макетная плата.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Как работает инфракрасная связь
Как и другие системы связи, инфракрасная связь также имеет передатчик и приемник. Передатчик в инфракрасной связи похож на обычный светодиод, но он испускает свет в инфракрасном диапазоне, а не в видимом. А инфракрасный приемник представляет собой фотодиод с интегрированным в него предварительным усилителем, который преобразует инфракрасный свет в электрический сигнал. Для осуществления инфракрасной связи ее передатчик и приемник должны быть направлены друг на друга.
Когда на привычном нам пульте ДУ (дистанционного управления) вы нажимаете какую либо кнопку, инфракрасный светодиод (IR LED) испускает инфракрасный свет. Этот свет улавливается инфракрасным приемником, который обычно представляет собой фотодиод или фототранзистор. Но инфракрасный свет также формируется Солнцем, лампами накаливания и вообще любыми предметами, которые производят тепло. Это обстоятельство может помешать осуществлению инфракрасной связи. Чтобы этого не происходило, сигнал передатчика модулируется несущей частотой от 36 до 46 кГц. При приеме сигнала инфракрасный приемник производит демодуляцию сигнала и преобразует его в двоичный код перед подачей его на микроконтроллер.
В нашем проекте мы будем использовать пульт ДУ от телевизора для передачи инфракрасных сигналов и инфракрасный приемник TSOP1838 для их приема.
Схема проекта
Схема декодера инфракрасных сигналов на основе платы Arduino представлена на следующем рисунке.
Соединения в схеме очень просты поскольку инфракрасный приемник (IR Receiver) имеет всего 3 контакта. Его контакты Vs и GND подключаются к контактам 3.3V и GND платы Arduino, а его контакт данных (Data pin) подключается к контакту 2 платы Arduino.
Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом нам необходимо скачать библиотеку инфракрасной связи для Arduino по следующей ссылке и добавить ее в Arduino IDE выбрав в ней пункт меню Sketch > Include library > Add.Zip library. Выберите в открывшемся диалоговом окне файл со скачанной библиотекой и нажмите ‘Open’.
После этого необходимо подключить заголовочный файл библиотеки в программу.
1 |
#include <IRremote.h> |
Затем в программе необходимо указать контакт платы Arduino, к которому подключен контакт данных (Data pin) инфракрасного приемника. В нашем случае он подключен к контакту D2 платы Arduino.
1 |
int IRPIN = 2; |
После этого необходимо создать объект для работы с инфракрасным приемником.
1 |
IRrecv irrecv(IRPIN); |
Далее объявим объект класса decode_results – он будет использоваться инфракрасным приемником для передачи декодированной информации.
1 |
decode_results result; |
Внутри функции setup() инициализируем последовательную связь и инфракрасный приемник при помощи вызова функции irrecv.enableIRIn().
1 2 3 4 5 6 7 8 |
void setup() { Serial.begin(9600); Serial.println("Enabling IRin"); irrecv.enableIRIn(); Serial.println("Enabled IRin"); Initialize_streamer(); } |
В функции loop() мы с помощью функции irrecv.decode будем непрерывно проверять наличие нового сигнала и если новый сигнал был принят, то его код мы будем сохранять в переменной result.value.
1 2 3 4 5 6 7 8 9 10 11 |
void loop() { 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.
1 2 3 4 5 6 7 8 9 10 |
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(); //конец строки, переходим к следующей строке } |
После того как аппаратная и программная части проекта будут готовы, можно будет загружать программу в плату Arduino. После загрузки кода в плату направьте пульт ДУ на спроектированный нами декодер и начинайте нажимать на нем кнопки. Шестнадцатеричный код (hex code) каждой кнопки будет печататься в окне монитора последовательной связи (serial monitor).
Сохранение декодированных данных в лист Excel
Для передачи данных на лист Excel мы будем использовать плагин PLX-DAQ, который позволяет непосредственно передавать данные с Arduino в лист Excel на вашем компьютере. По приведенной ссылке скачайте данный плагин, извлеките его из архива и установите его на свой компьютер. После своей установки плагин создаст на вашем компьютере папку PLX-DAQ.
После этого откройте файл ‘PLX-DAQ spreadsheet’ из этой папки. Если в вашем Excel отключены макросы, то вы увидите предупреждающее сообщение как на следующем рисунке.
Включите макросы и после этого вы на своем экране должны увидеть следующее:
После этого выберите скорость “9600” и COM порт, к которому подключена плата Arduino к вашему компьютеру. Затем нажмите на Connect чтобы начать прием данных от Arduino – в результате вы на экране увидите примерно следующую картину:
Этот будет означать что наш проект декодера инфракрасных сигналов на основе платы Arduino успешно работает.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <IRremote.h> int IRPIN = 2; IRrecv irrecv(IRPIN); decode_results result; int button = 0; void setup() { Serial.begin(9600); Serial.println("Enabling IRin"); irrecv.enableIRIn(); Serial.println("Enabled IRin"); Initialize_streamer(); } void loop() { if (irrecv.decode(&result)) { button = button+1; Serial.print("Value: "); Serial.println(result.value, HEX); Write_streamer(); irrecv.resume(); } delay(500); } void Initialize_streamer() { Serial.println("CLEARDATA"); //очищаем все данные, оставшиеся от предыдущих проектов Serial.println("LABEL,Hex Code, Button"); //всегда вначале передавайте LABEL, чтобы показать что это первая строка } 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(); //конец строки, переходим к следующей строке } |