Урок 35. Универсальный ИК-пульт дистанционного управления

В этом уроке мы создадим универсальный ИК-пульт дистанционного управления. Шесть кнопок универсального ИК-пульта позволяют запрограммировать себя на передачу команды любого* другого ИК-пульта. Код кнопок сохраняется в энергонезависимую область памяти Arduino — EEPROM . Это значит, что Вам не придётся программировать кнопки при каждом включении универсального ИК-пульта.
*Универсальный ИК-пульт может воспроизводить сигналы только тех ИК-пультов, которые передают данные одним информационным пакетом не длиннее 32 бит, а также имеют (или нет) одинаковые пакеты удержания (пакеты повторов).
Нам понадобится:
- Arduino Uno х 1шт.
- Trema модуль — ИК-приёмник x 1шт.
- Trema модуль — ИК-передатчик x 1шт.
- Trema модуль — кнопка (синяя) x 7шт.
- Trema модуль — зуммер x 1шт.
- Trema Shield x 1шт.
- Конструктор для создания каркаса.
Для реализации проекта нам необходимо установить библиотеку:
- iarduino_IR для работы с ИК-приёмопередатчиками.
- EEPROM — входит в стандартный набор Arduino IDE.
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .
Видео:
Схема подключения:
Все используемые в уроке модули, можно подключать к любым выводам Arduino, как цифровым, так и аналоговым. Номера выводов к которым подключены модули, указываются в скетче.
- Trema-кнопки подключены к цифровым выводам 2-8.
- Trema ИК-приёмник подключён к цифровому выводу 9.
- Trema ИК-передатчик подключён к цифровому выводу 10.
- Trema-зуммер подключён к цифровому выводу 11.
- Все модули подключены к Arduino Uno через Trema Shield.
Алгоритм работы:
Отправка команд:
- При нажатии на одну из 6 кнопок универсального ИК-пульта, он отправит команду, соответствующую нажатой кнопке.
- Если нажатой кнопке команда не присвоена, то ИК-пульт издаст звуковой сигнал, сигнализирующий об ошибке.
Назначение команд кнопкам:
- Для назначения команд кнопкам универсального ИК-пульта, нужно выполнить следующие действия:
- Нажать на кнопку «запись команды» и, не отпуская её, нажать на ту кнопку универсального ИК-пульта, которой мы хотим присвоить команду с другого ИК-пульта.
- Универсальный ИК-пульт издаст два коротких звуковых сигнала, сигнализируя о готовности принять данные.
- Нажать на кнопку другого ИК-пульта, код которой мы хотим считать.
- Как только код будет считан, универсальный ИК-пульт издаст короткий звуковой сигнал, сигнализирующий об успешной записи кода. Теперь можно отпустить все кнопки.
Код программы:
#include // Подключаем библиотеку для работы с ИК-приёмником #include // Подключаем библиотеку для работы с ИК-передатчиком #include // Подключаем библиотеку для работы с EEPROM (энергонезависимой областью памяти) // Указываем выводы к которым подключены модули: const uint8_t PinButton1= 2; // Объявляем константу с указанием вывода к которому подключена кнопка 1 const uint8_t PinButton2= 3; // Объявляем константу с указанием вывода к которому подключена кнопка 2 const uint8_t PinButton3= 4; // Объявляем константу с указанием вывода к которому подключена кнопка 3 const uint8_t PinButton4= 5; // Объявляем константу с указанием вывода к которому подключена кнопка 4 const uint8_t PinButton5= 6; // Объявляем константу с указанием вывода к которому подключена кнопка 5 const uint8_t PinButton6= 7; // Объявляем константу с указанием вывода к которому подключена кнопка 6 const uint8_t PinButton7= 8; // Объявляем константу с указанием вывода к которому подключена кнопка 7 (запись) iarduino_IR_RX IR_Read ( 9); // Объявляем объект IR_Read с указанием вывода к которому подключён ИК-приёмник iarduino_IR_TX IR_Write (10); // Объявляем объект IR_Write с указанием вывода к которому подключён ИК-передатчик const uint8_t PinBuzzer= 11; // Объявляем константу с указанием вывода к которому подключен зуммер // Объявляем для хранения временных данных: uint8_t ValButton= 0; // Объявляем переменную для хранения номера нажатой кнопки uint32_t ValCode; // Объявляем переменную для хранения кода кнопки char ValProtocol[26]; // Объявляем строку для хранения 25 символов протокола передачи данных + символ конца строки void setup() < // Инициируем работу с ИК-приёмником и ИК-передатчиком: IR_Read.begin(); // Инициируем работу с ИК-приёмником IR_Write.begin(); // Инициируем работу с ИК-передатчиком // Конфигурируем выводы: pinMode(PinButton1, INPUT); // Конфигурируем вывод с подключенной кнопкой №1 в режим входа pinMode(PinButton2, INPUT); // Конфигурируем вывод с подключенной кнопкой №2 в режим входа pinMode(PinButton3, INPUT); // Конфигурируем вывод с подключенной кнопкой №3 в режим входа pinMode(PinButton4, INPUT); // Конфигурируем вывод с подключенной кнопкой №4 в режим входа pinMode(PinButton5, INPUT); // Конфигурируем вывод с подключенной кнопкой №5 в режим входа pinMode(PinButton6, INPUT); // Конфигурируем вывод с подключенной кнопкой №6 в режим входа pinMode(PinButton7, INPUT); // Конфигурируем вывод с подключенной кнопкой №7 в режим входа pinMode(PinBuzzer, OUTPUT); // Конфигурируем вывод с подключенным зуммером в режим выхода >void loop()< // Проверяем состояние кнопок: if(digitalRead(PinButton1))< ValButton=1;>else // Если нажата кнопка 1, записываем число 1 в переменную ValButton if(digitalRead(PinButton2))< ValButton=2;>else // Если нажата кнопка 2, записываем число 2 в переменную ValButton if(digitalRead(PinButton3))< ValButton=3;>else // Если нажата кнопка 3, записываем число 3 в переменную ValButton if(digitalRead(PinButton4))< ValButton=4;>else // Если нажата кнопка 4, записываем число 4 в переменную ValButton if(digitalRead(PinButton5))< ValButton=5;>else // Если нажата кнопка 5, записываем число 5 в переменную ValButton if(digitalRead(PinButton6))< ValButton=6;>else // Если нажата кнопка 6, записываем число 6 в переменную ValButton // Если кнопки 1-6 не нажаты, записываем число 0 в переменную ValButton и подавляем дребезг // Выполняем действия при нажатии на кнопку: if(ValButton) < // Если нажата кнопка 1-6 // Чтение данных: if(digitalRead(PinButton7))< // Если нажата кнопка 7 (запись), то . myTone(100); delay(100); myTone(100); // Выводим два коротких звуковых сигнала, сигнализирующих о готовности считать данные while(digitalRead(PinButton7))< // Входим в цикл while, пока не будет отпущена кнопка 7 (запись) if(IR_Read.check())< // Если в буфере имеются данные, принятые с другого пульта // Получаем данные, принятые с пульта strcpy(ValProtocol, IR_Read.protocol()); // Получаем протокол передачи данных пульта в строку ValProtocol ValCode = IR_Read.data; // Получаем код кнопки в переменную ValCode // Записываем принятые данные в EEPROM for(uint8_t i=0; i// Первые 26 байт заполняем данными из строки ValProtocol (это протокол передачи данных) else
>((29-i)*8)));> // Последние 4 байта заполняем данными из переменной ValCode (это код кнопки) > myTone(100); // Выводим короткий звуковой сигнал, сигнализирующий об успешной записи > > // Отправка данных: >else < // Если не нажата кнопка 7, то . // Читаем протокол передачи данных и код кнопки из EEPROM: for(uint8_t i=0; i// Первые 26 байт записываем в строку ValProtocol (это протокол передачи данных) else // Последние 4 байта записываем в переменную ValCode (это код кнопки) > // Отправляем код кнопки с использованием указанного протокола передачи данных: if (IR_Write.protocol(ValProtocol))< // Устанавливаем прочитанный протокол передачи данных ValProtocol IR_Write.send(ValCode, true); // Передаём прочитанный код кнопки ValCode >else // Если строка ValProtocol не является протоколом передачи данных, то выводим звуковой сигнал, сигнализирующий об ошибке > > > // Функция генерирующая звуковой сигнал на выводе PinBuzzer void myTone(uint32_t i)< i+=millis(); while(i>millis()) > Для генерации звука написана функция myTone(), вместо стандартной функции tone(), так как стандартная функция использует 2 аппаратный таймер, который уже используется библиотекой iarduino_IR.
Ссылки:
- Библиотека iarduino_IR.
- Wiki — Установка библиотек в Arduino IDE .
- Wiki — ИК-приёмник (Trema-модуль).
- Wiki — Trema Shield.
- Код программы.
Подключение IR приемника и пульта к Ардуино

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

ИК-приемник на Ардуино способен принимать и обрабатывать инфракрасный сигнал, в виде импульсов заданной длительности и частоты. Используется при изготовлении датчика препятствия и дальномера для Arduino. Обычно ИК-приемник имеет три ножки и состоит из следующих элементов: PIN-фотодиод, усилитель, полосовой фильтр, амплитудный детектор, интегрирующий фильтр и выходной транзистор.
Под действием инфракрасного излучения в фотодиоде, у которого между p и n областями создана дополнительная область из полупроводника (i-область), начинает течь ток. Сигнал поступает на усилитель и далее на полосовой фильтр, который настроен на фиксированную частоту: 30; 33; 36; 38; 40 и 56 килогерц и защищает приемник от помех. Помехи могут создавать любые бытовые приборы.
Как подключить ИК приемник к Ардуино
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- IR приемник и пульт ДУ;
- макетная плата;
- 1 светодиод и резистор 220 Ом;
- севомотор;
- провода «папа-папа» и «папа-мама».
Корпуса инфракрасных приемников содержат оптический фильтр для защиты прибора от внешних электромагнитных полей, изготавливаются они специальной формы для фокусировки принимаемого излучения на фотодиоде. Для подключения IR приемника к Arduino UNO используют три ножки, которые соединяют с — GND, 5V и A1. Советуем для начала использовать 3,3 Вольта, чтобы не сжечь ИК датчик при настройке.

Подключите IR приемник по схеме, представленной выше, и подключите светодиоды к 12 и 13 пину. Перед загрузкой программы, вам потребуется установить библиотеку IRremote.h, если она не была еще установлена. Данная библиотека не относится к стандартным библиотекам среды программирования Arduino IDE. Скачать библиотеку IRremote.h и готовый скетч можно одним архивом с Google Диск по ссылке здесь.
Скетч для ИК датчика Ардуино со светодиодом
#include "IRremote.h" // подключаем библиотеку для ик датчика IRrecv irrecv(A1); // указываем пин, к которому подключен ик датчик decode_results results; void setup() < irrecv.enableIRIn(); // запускаем прием инфракрасного сигнала Serial.begin(9600); // подключаем монитор порта pinMode(12, OUTPUT); // пин 12 будет выходом (англ. «output») pinMode(A1, INPUT); // пин A1 будет входом (англ. «intput») > void loop() < if (irrecv.decode(&results)) // если данные пришли выполняем команды < Serial.println(results.value); // отправляем полученные данные на порт // включаем и выключаем светодиод, в зависимости от полученного сигнала if (results.value == 16718055) < digitalWrite(12, HIGH); > if (results.value == 16724175) < digitalWrite(12, LOW); > irrecv.resume(); // принимаем следующий сигнал на ИК приемнике > >
Пояснения к коду:
- библиотека IRremote.h содержит набор команд и позволяет упростить скетч;
- оператор decode_results присваивает получаемым сигналам от пульта дистанционного управления имя переменной results .
ИК датчик можно применять во многих устройствах на микроконтроллере Ардуино, в том числе, можно сделать дистанционное управление сервоприводом на Ардуино от ИК приемника. При настройке следует включить монитор порта Arduino IDE и узнать какой сигнал отправляет та или иная кнопка на пульте ДУ. Полученные коды следует использовать в скетче после знака двойного равенства в условиях if () .

Скетч для ИК приемника Ардуино и серовомотора
#include "IRremote.h" // подключаем библиотеку для ик пульта IRrecv irrecv(A1); // указываем пин, к которому подключен ик датчик decode_results results; #include "Servo.h" // подключаем библиотеку для серво Servo myservo; // создаем объект для управления серво void setup() < irrecv.enableIRIn(); // запускаем прием инфракрасного сигнала Serial.begin(9600); // подключаем монитор порта myservo.attach(9); // указываем пин для подключения серво > void loop() < if (irrecv.decode(&results)) // если данные пришли выполняем команды < Serial.println(results.value); // отправляем полученные данные на порт // поворачиваем серво, в зависимости от ИК сигнала if (results.value == 16718055) < myservo.write(0); > if (results.value == 16724175) < myservo.write(90); > irrecv.resume(); // принимаем следующий сигнал на ИК приемнике > >
Пояснения к коду:
- в условиях if (results.value == 16724175) следует поставить свои значения, они будут появляться на мониторе порта при нажатии кнопок на пульте ду.
Заключение. Чтобы сигнал от пульта ДУ принимался ИК приемником Ардуино, пульт должен быть с той же частотой, на которую настроен фильтр в IR приемнике. Поэтому не каждый пульт дистанционного управления подойдет для работы. Следует подбирать IR приемник и IR передатчик с одной частотой. После фильтра сигнал поступает на амплитудный детектор, интегрирующий фильтр и выходной транзистор.
Ардуино: инфракрасный пульт и приемник
Инфракрасный пульт дистанционного управления — один из самых простых способов взаимодействия с электронными приборами. Так, практически в каждом доме есть несколько таких устройств: телевизор, музыкальный центр, видеоплеер, кондиционер. Но самое интересное применение инфракрасного пульта — дистанционное правление роботом. Собственно, на этом уроке мы попытаемся реализовать такой способ управления с помощью популярного контроллера Ардуино Уно.
ИК-пульт
Что нужно для того, чтобы научить робота слушаться инфракрасного (ИК) пульта? Во-первых, нам потребуется сам пульт. Можно использовать обычный пульт от телевизора, а можно приобрести миниатюрный пульт от автомагнитолы. Именно такие пульты часто используются для управления роботами.

На таком пульте есть 10 цифровых кнопок и 11 кнопок для манипуляции с музыкой: громкость, перемотка, play, stop, и т.д. Для наших целей более чем достаточно.
ИК-датчик
Во-вторых, для приема сигнала с пульта нам потребуется специальный ИК-датчик. Вообще, мы можем детектировать инфракрасное излучение обычным фотодиодом/фототранзистором, но в отличие от него, наш ИК-датчик воспринимает инфракрасный сигнал только на частоте 38 кГц (иногда 40кГц). Именно такое свойство позволяет датчику игнорировать много посторонних световых шумов от ламп освещения и солнца.
Для этого урока воспользуемся популярным ИК-датчиком VS1838B, который обладает следующими характеристиками:
- несущая частота: 38 кГц;
- напряжение питания: 2,7 — 5,5 В;
- потребляемый ток: 50 мкА.
Можно использовать и другие датчики, например: TSOP4838, TSOP1736, SFH506.
Список необходимых компонентов
Для выполнения простого примера с VS1838B, кроме самого датчика, потребуется Ардуино-совместимый контроллер, макетная плата и немного проводов вилка-вилка. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
Подключение
Датчик имеет три вывода (три ноги). Если посмотреть на датчик со стороны приёмника ИК сигнала, как показано на рисунке,
- то слева будет — выход на контроллер,
- по центру — отрицательный контакт питания (земля),
- и справа — положительный контакт питания (2.7 — 5.5В).
Принципиальная схема подключения

Внешний вид макета

Программа
Подключив ИК-датчик будем писать программу для Ардуино Уно. Для этого воспользуемся стандартной библиотекой IRremote, которая предназначена как раз для упрощения работы с приёмом и передачей ИК сигналов. С помощью этой библиотеки будем принимать команды с пульта, и для начала, просто выводить их в окно монитора последовательного порта. Эта программа нам пригодится для того, чтобы понять какой код дает каждая кнопка.
#include "IRremote.h" IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() < Serial.begin(9600); // выставляем скорость COM порта irrecv.enableIRIn(); // запускаем прием >void loop() < if ( irrecv.decode( &results )) < // если данные пришли Serial.println( results.value, HEX ); // печатаем данные irrecv.resume(); // принимаем следующую команду >>Загружаем программу на Ардуино. После этого, пробуем получать команды с пульта. Открываем монитор последовательного порта (Ctrl+Shift+M), берём в руки пульт, и направляем его на датчик. Нажимая разные кнопочки, наблюдаем в окне монитора соответствующие этим кнопкам коды.

Проблема с загрузкой программы
В некоторых случаях, при попытке загрузить программу в контроллер, может появиться ошибка:
TDK2 was not declared In his scope
Чтобы ее исправить, достаточно удалить два файла из папки библиотеки. Заходим в проводник. Переходим в папку, где установлено приложение Arduino IDE (скорее всего это «C:\Program Files (x86)\Arduino»). Затем в папку с библиотекой:
, и удаляем файлы: IRremoteTools.cpp и IRremoteTools.h. Затем, перезапускаем Arduino IDE, и снова пробуем загрузить программу на контроллер.
Управляем светодиодом с помощью ИК-пульта
Теперь, когда мы знаем, какие коды соответствуют кнопкам пульта, пробуем запрограммировать контроллер на зажигание и гашение светодиода при нажатии на кнопки громкости. Для этого нам потребуется коды (могут отличаться, в зависимости от пульта):
- FFA857 — увеличение громкости;
- FFE01F — уменьшение громкости.
В качестве светодиода, используем встроенный светодиод на выводе №13, так что схема подключения останется прежней. Итак, программа:
#include "IRremote.h" IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() < irrecv.enableIRIn(); // запускаем прием >void loop() < if ( irrecv.decode( &results )) < // если данные пришли switch ( results.value ) < case 0xFFA857: digitalWrite( 13, HIGH ); break; case 0xFFE01F: digitalWrite( 13, LOW ); break; >irrecv.resume(); // принимаем следующую команду > >Загружаем на Ардуино и тестируем. Жмем vol+ — светодиод зажигается. Жмем vol- — гаснет. Теперь, зная как это все работает, можно вместо светодиода управлять двигателями робота, или другими самодельными микроэлектронными устройствами!
К размышлению
Несмотря на то, что инфракрасные пульты всё еще сильно распространены, этот способ передачи данных сильно проигрывается более современным подходам. Для управления устройствами удобнее использовать bluetooth, wi-fi или zigbee. Также для создания самодельных устройств с дистанционным управлением подойдут низкоуровневые передатчики: самый простой RF433 или RF315, а также более серъёзный NRF24L01.
Изменено: 19 Фев, 2015 13:06
Ардуино: инфракрасный пульт и приемник : 75 комментариев
Alexandr говорит 09.09.2015 в 19:11 :
Во-первых спасибо за пример!
но он не работал у меня( пришлось его доделать=) #include «IRremote.h» IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results;
int Relay = 4; void setup()
pinMode(Relay, OUTPUT);
irrecv.enableIRIn(); // запускаем прием
>
void loop() if ( irrecv.decode( &results )) < // если данные пришли
switch ( results.value ) case 0x40BF807F:
digitalWrite( Relay, HIGH );
break;
case 0x40BF40BF:
digitalWrite( Relay, LOW );
break;
>
irrecv.resume(); // принимаем следующую команду
>
>Данило говорит 21.03.2019 в 18:45 :
робосайпен говорит 16.08.2019 в 15:52 :у меня тоже не заработал скетч . вот скетч который у меня
заработал. #include // подключаем библиотеку для IR приемника IRrecv irrecv(6); // указываем пин, к которому подключен IR приемник
decode_results results; void setup() // процедура setup
irrecv.enableIRIn(); // запускаем прием инфракрасного сигнала pinMode(11, OUTPUT); // пин 13 будет выходом (англ. «output»)
pinMode(12, OUTPUT); // пин 12 будет выходом (англ. «output»)
pinMode(A0, INPUT); // пин A0 будет входом (англ. «intput») Serial.begin(9600); // подключаем монитор порта
> void loop() // процедура loop
if (irrecv.decode(&results)) // если данные пришли выполняем команды
Serial.println(results.value); // отправляем полученные данные на порт // включаем и выключаем светодиоды, в зависимости от полученного сигнала if (results.value == 12535991) digitalWrite(11, HIGH);
>
if (results.value == 12574751 ) digitalWrite(11, LOW);
>
if (results.value == 16718055) digitalWrite(12, HIGH);
>
if (results.value == 16724175) digitalWrite(12, LOW);
>
irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
>
>А какая библиотека?
Даниил говорит 15.07.2022 в 19:50 :
Виталий говорит 08.04.2016 в 16:32 :Большое спасибо за познавательный урок, я бы хотел попросить вас усложнить задачку и сделать при помощи ШИМ плавное вкл/откл светодиода. Спасибо!
Сергей говорит 12.06.2016 в 21:15 :
Дополнить программу кодом в данном месте (для увеличения яркости)
case 0xFFA857:
// например
int val = 0;
val += 50; // значение может быть любым
// или val++; для более плавного перехода
if (val > 255) val = 255
analogWrite( 13, val );
break;Евгений говорит 07.04.2017 в 22:47 :
не работает
Евгений говорит 07.04.2017 в 22:49 :
при этом коде светодиод просто включается, плавности нет.
Случайный прохожий говорит 22.09.2017 в 02:26 :
Нужно подключать к выходам с ШИМ (PWM)
Никита говорит 30.07.2018 в 12:26 :У вас ошибка в коде. При таком алгоритме значение val всегда будет 50, так как постоянно при нажатии на кнопку пульта у вас будет переопределяться переменная val. Во избежание этого следует добавить слово «static» к типу данных val.
Alex говорит 02.07.2016 в 14:54 :
надо добавить, чтобы работало
pinMode(13, OUTPUT);
kek говорит 09.07.2016 в 03:54 :Подключил как в гайде, но все равно не работает( Имею в виду что монитор не показывает что я нажал пультом) но это не такой пульт как в этом гайде. В чем может быть проблема?
Олег Евсегнеев говорит 13.07.2016 в 03:21 :
Скетч залился успешно, без ошибок? Причины могут быть разные. Например, пульт дает сигнал на частоте 40КГц, а приемник скорее всего 38КГц.
Я пробовал и таким же пультом и пультом от телевизора все работает. Посмотри все ли у тебя подключено правильно.
Конституция говорит 10.10.2019 в 14:52 :
Как сделать так что бы ик приемник получал один и тот же сигнал, у меня он принимает с одной кнопки разные коды
070610 говорит 03.06.2021 в 18:21 :
у меня просто нули пишет какую бы кнопку ни не нажимал.
Ivan_dem говорит 18.06.2020 в 19:42 :
У разных пультов разный код.
Кирилл говорит 31.07.2016 в 20:49 :А почему на схеме и на внешнем виде макета отличается подключение выводов? На схеме у вас (слева направо) идёт земля выход вход, а на макете земля вход выход. Я просмотрел уже несколько сайтов по подключению этого приёмника — везде подключают по разному, у одних левый вывод это выход, у других земля. Чепуха какая-то.
Олег Евсегнеев говорит 01.08.2016 в 16:46 :
Спасибо за замечание! Оказалось, что в редакторе схем fritzing ИК-датчик отображается неверно. Заменили на правильный вариант. Теперь всё как надо. Если не заработает, ищите проблему в другом.
разные выводы на сенсоре и на плате ky-022
вносите корректировку.
Дмитрий говорит 23.11.2016 в 18:12 :
Можно ссылочку на деталь в Fritzing
Олег Евсегнеев говорит 24.11.2016 в 02:43 :
Вот тут можно взять:
http://git.robotclass.ru/download/Fritzing/
Константин говорит 10.12.2016 в 16:08 :Я пишу скетч на управление сервой с помощью ик приёмника и вылетает ошибка:
‘results’ was not declared in this scope Скетч:
#include
#include
#include Servo MyServo; IRrecv irrecv(2); void setup() Serial.begin(9600);
irrecv.enableIRIn(); // запускаем прием
MyServo.attach(4); > void loop() if ( irrecv.decode( &results )) switch ( results.value ) case 0xFFA25D:
MyServo.write(0);
break;
case 0xFF629D:
MyServo.write(90); //поворот на 90 градусов
break;
>
irrecv.resume(); // принимаем следующую команду
>Роман говорит 18.05.2019 в 15:23 :
Пропишите #include
Роман говорит 18.05.2019 в 15:24 :
Константин говорит 10.12.2016 в 16:10 :
Почему- то не прописалось:
#include <>
#include <>
#include <>
Николай говорит 25.12.2016 в 22:59 :
Спасибо за пример! Заработал с первого раза. Очень доходчиво и просто. Спасибо.
Антон говорит 30.12.2016 в 13:10 :Добрый день! Использовал скетчи из этой темы для того, что бы сделать лазертаг мишень: принимает ИК сигнал выстрела, загорается и гаснет, но вот какие вопросы:
1. Как только программа загружается в Ардуино — диод горит сразу.
2. Что надо сделать, что бы принял сигнал — моргнул 500 мсек — погас? #include «IRremote.h» IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() Serial.begin(9600); // выставляем скорость COM порта
irrecv.enableIRIn(); // запускаем прием
pinMode(3, OUTPUT);
> void loop() if ( irrecv.decode( &results )) < // если данные пришли
switch ( results.value ) case 0x2FD58A7:
digitalWrite ( 3, HIGH );
delay (10);
case 0x2FDD827:
digitalWrite ( 3, LOW);
delay (100);
>
Serial.println( results.value, HEX ); // печатаем данные
irrecv.resume(); // принимаем следующую команду
> >Му-му Герасим говорит 29.10.2017 в 00:56 :
Автору респект.
Alexandr, отдельная благодарность.
Светодиод горел на авторском скетче вполнакала,
с Вашей поправкой все заработало отлично.Дамир говорит 29.11.2017 в 15:35 :
Добрый день.
Не подскажете, в чем может быть проблема?
#include «IRremote.h»
void setup() <>
void loop()<>
Не компилируется:
IRremote.h: No such file or directory Спасибо.Павел говорит 13.12.2017 в 22:15 :
Скобки поставь одинарные #include
Павел говорит 13.12.2017 в 22:17 :
#include скобки щдинарные
Name Secret говорит 09.01.2019 в 23:11 :
Скачайте библиотеку IRremote.h
Денис говорит 11.11.2019 в 23:03 :
вместо «IRremote.h» напиши «IRremote.h»
Михаил говорит 02.01.2018 в 23:38 :Использую код из ваших примеров, но среда упорно пишет «Ошибка компиляции для платы Arduino/Genuino Uno». Никаких подробностей не указано больше. В чем проблема может быть?
Михаил говорит 02.01.2018 в 23:43 :
Походу проблема в библиотеке
ArduinoTester говорит 20.07.2018 в 14:08 :Проблема в библиотеке, В новой версии поддержка для UNO Выключена, Попробуйте скачать другую версию.
Я пользуюсь библиотекой от сюда https://www.arduinolibraries.info/libraries/i-rremoteАртем говорит 25.03.2019 в 14:24 :
Бывает такое при подключении платы с уже запущенным приложением Arduino IDE. Закрой ИДЕшку, извлеки провод, с помощью которого прошиваешь плату, запусти ИДЕ, подключи плату(ардуинку). PROFIT
Максим говорит 02.08.2019 в 20:39 :
Можно сделать проще: зайти в программу, Инструменты, Порт и выбираем
Сергей говорит 23.01.2018 в 16:06 :Добрый день? возможно ли подключить к uno серво шилд и wi-fi шилд? если нет, то какой вариант возможен?
Антон говорит 02.03.2018 в 16:12 :
извините,но в вашем коде какая то фигня… Вставте ваш код в word и вы поймёте.
Иван говорит 24.05.2018 в 17:07 :
собрал все по схеме светодиодом моргать получается а когда вместо светодиода цепляю реле неработает
mindstation говорит 29.05.2018 в 12:57 :
Скорее всего тока не хватает для управления реле.
Какое реле подключаете?
Alex говорит 25.06.2018 в 00:32 :Доброго времени суток!
Господа, я новичок в освоении Ардуино, Но!
Получаю команды с пульта всегда в двух числах, исходя из этого
хотел бы спросить профессионалов — Почему 2 цифры?
Как я понял одна из них и есть код сигнала, а вторая преселектор (т.е доп сигнал, для считывания нажатия комбинации кнопок в момент времени),.
Так, как в моем случае, мне нужна быстрая реакция на нажатие, я включил их в обработку
Пример ниже… Текст Кода #include «IRremote.h» IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
Serial.begin(9600); // выставляем скорость COM порта
irrecv.enableIRIn(); // запускаем прием
> void loop() if ( irrecv.decode( &results )) < // если данные пришли
Serial.println( results.value ); // печатаем данные if (results.value ==32||results.value==2080)
digitalWrite( 13, HIGH );
>
if (results.value ==33||results.value==2081)
digitalWrite( 13, LOW );
>
if (results.value ==17||results.value==2065)
digitalWrite( 12, HIGH );
>
if (results.value ==16||results.value==2064)
digitalWrite( 12, LOW );
>
irrecv.resume(); // принимаем следующую команду
>
>Артём говорит 17.07.2018 в 11:33 :
У меня при case пишет что неуказонное значение.Помогите
ArduinoTester говорит 20.07.2018 в 14:10 :
Покажите свой скетч
Роман говорит 16.12.2018 в 22:33 :
Допишите 0x Например у вас код кнопки получился CE1972FD, значит пишем case 0xCE1972FD
ПОМОГИТЕ УМОЛЯЮ! ЗАГРУЖАЮ СКЕТЧ И ПИШЕТ ОШИБКУ!
Роман говорит 16.12.2018 в 22:35 :
Какая ошибка? case неверный? Допишите перед вашим значением кода 0x Например case 0xCE1972FD
Виталий говорит 09.11.2018 в 09:05 :Почему приёмник иногда пишет в консоль разные коды на одну и ту же кнопку? Как эти коды можно контролировать в понятный для Android вид чтобы создать программный пульт?
АРСЕНИЙ говорит 02.01.2019 в 13:25 :
ТЫ НА ПУЛЬТЕ НАЖИМАЕШЬ РАЗНЫЕ КНОПКИ ПРОСТО СМОТРИ НА ПУЛЬТ И НАЖИМАЙ НОГТЕМ НА ОДНУ КНОПКУ НЕ УДЕРЖИВАЯ ПРИМЕРНО МЕНЬШЕ СЕКУНДЫ!
Михаил говорит 01.12.2018 в 00:24 :
Почему светодиод не на полную мощность работает?
Роман говорит 09.05.2019 в 22:56 :
Может, сопротивление поменьше поставьте
АРСЕНИЙ говорит 02.01.2019 в 13:22 :ГДЕ ВЫ ПОКАЗАЛИ КАК ПОДКЛЮЧАТЬ ИК ДАТЧИК ТАМ НЕ ПРАВИЛЬНО МОЖНО БЫЛО ПОДКЛЮЧИТЬ НА 3 ВОЛЬТА А МОТОР НА 5 ИЛИ НА СЕМЬ ВОЛЬТ МЕНЬШЕ ПЯТИ ВОЛЬТ МОТОРУ НЕ ХВАТАЕТ МОЩНОСТИ!
AlexeySamoilov говорит 28.01.2019 в 02:44 :
Если использовать в одном скрипте + tone для пищалки, то вылетает ошибка
>>
Arduino: 1.8.8 (Windows XP), Плата:»Arduino/Genuino Uno»
Tone.cpp.o (symbol from plugin): In function `timer0_pin_port’:
(.text+0x0): multiple definition of `__vector_7′
libraries\IRremote\IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
Куда копать?Роман говорит 09.05.2019 в 22:54 :
Функция tone () использует таймер 2, который по умолчанию IRremote также использует при использовании чипа ATmega2560.
В файле IRremoteInt.h вы можете определить, какой таймер использовать. Или скачайте библиотеку TonePlayerвова говорит 26.03.2019 в 15:33 :
#include «IRremote.h»
вот эту строка пишет что не правельная что делать?
Роман говорит 18.05.2019 в 15:20 :
Скобки одинарные поставьте.
Шурик говорит 03.04.2019 в 18:21 :копировал, поменял на сигнал для своего пульта, закинул, выдает
Arduino: 1.8.9 Hourly Build 2019/03/18 11:33 (Windows 10), Плата: «Arduino BT, ATmega328P» Скетч використовує 6502 байтів (22%) місця зберігання для програм. Межа 28672 байтів.
Глобальні змінні використовують 236 байтів (11%) динамічної пам’яті, залишаючи 1812 байтів для локальних змінних. Межа 2048 байтів.
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x78
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x86
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x60
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x66
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x86
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x78
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x06
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x18
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x60
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xe6
Сталася помилка при вивантаженні скетча Цей звіт міститиме більше інформації, якщо
в меню Файл -> Налаштування увімкнути опцію
«Показати докладний звіт при компіляції».Олег Евсегнеев говорит 06.04.2019 в 18:00 :
Судя по ошибке, Arduino IDE не может залить скетч на плату по каким-то причинам. При этом скетч скомпилирован, к программе уже претензий нет. Проверьте кабель, подключение. Может загрузчик слетел с ардуины, такое тоже бывает.
Универсальный IR пульт своими руками

Сегодня я задумал сделать ИК пульт на Ардуино.
Давайте определимся с аббривиатурой «ИК».
ИК — в расшифровке означает Инфракрасный.
Что такое инфра и почему оно красное, если его не видно?
Все дело в спектре цвета, который мы видим и нет:Инфра означает выше чем что-либо, значит инфракрасный — это выше чем красный.
Взгляните на рисунок, там показаны длины волн, так вот длины волн, значение которых выше чем 700, по рисунку, и есть ИК (IR) излучение.
Но зачем же требуется мой пульт:- если основной пульт утерян, а устройство популярного типа, то можно с помощью всем известных кодов восстановить его;
- копирование пульта. Это нужно в тех случаях, когда вам нужно отдавать кому-то путь, но при этом требуется и самому доступ к дистанционному управлению этого устройства;
- управление ИК пультом в остальных Ардуино-проектах с доступом к настройке кодов.
Коды. Коды. Так что же такое информационные коды для пульта?
Коды ИК пульта — это порядок цифр, тактируемый передатчиком и принимающийся приемником.
Чаще всего они передаются в 16-символьной системе счисления.Для того, что бы Ардуино понимала, что это не набор символов, а число в 16-символьной системы счисления, нужно к коду добавлять приписку 0x, думаю это мы уяснили.
Что из себя представляет передатчик ИК кода?
Это устройство, похожее на обычный светодиод, но при подключении питания — не светит.
И тут возникает вопрос: как же проверить такой ИК светодиод? Ответ прост.
Мы, люди, не видим ИК излучение, но зато его отлично видят камеры наших устройств. Для того что бы проверить такой светодиод, нужно:- Подать напряжение на его катод и анод соответственно.
- Навести камеру любого устройства, имеющую ее.
- Посмотреть: если светит, то светодиод рабочий и наоборот.
Как получить эти ИК коды? Для этого нужно устройство, о котором мы в целом говорить сейчас не будем, это будет рассмотрено в следующей моей статье.
Итак, я преступил к реализации своей идеи.
Как и остальные мои проекты, этот считается бюджетным, так как практически не нуждается в затратах на компоненты. Нам понадобится:- 4 тактовые, нормально разомкнутые, кнопки.
- ИК светодиод (его можно достать из старых пультов).
- любой светодиод (у меня красный), для сигнализации
- Резистор на 220 Ом.
- Ардино нано (или любая другая, которая Atmega 328).
- Аккумулятор и к нему плата TP4056.
Вскоре продолжил собирать все вот по этой схеме:
Но в этот раз я решил начать с корпуса свою сборку. Найдя такую пластмаску, я понял, что из этого может получиться отличный корпус:
После я просверлил отверстия для кнопок:
Там то и будут находиться мои 4 тактовые кнопки. Их я решил приклеить на термоклей, это очень удобно.

Но мои кнопки были слишком коротки, поэтому я решил использовать винт от винтового зажима:
Немного откусив их, чтобы не были такими длинными, я их приклеил к кнопкам, вот что получилось:
На этом же фото вы можете видеть отверстие, которое нужно для сигнализирующего светодиода.
Был также вырезан вход для USB штекера, чтобы заряжать аккумулятор:
И да, отверстие для ИК светодиода, тоже было вырезано:

Мне, ради компактности устройства, пришлось отрезать уголки плате TP4056:
Наконец можно собирать остальную часть.
Собрав все по схеме, это выглядело так:
Этот процесс был не таким уж и долгим, но очень кропотливым, а чтобы вам не возиться со всей этой мелочью, была разведена плата:
Посмотреть ее вновь и получить гербер-исходники можно в моем гугл-диске, который находится ниже.
Теперь можно перейти к программной части, этот проект построен на библиотеке iarduino_IR_TX.h и на паре других, они будут на гугл-диске.
Я сделал небольшую программу и сейчас объясню ее работу.
Есть 3 вкладки:
- Основная, там происходят все процессы.
- Подсобная, нужна для разработчиков.
- Хранятся ваши странички с кодами.
Там есть образец и, сравнивая их с другими страничками, можно составить коды для своего устройства.
Конечно, по аналогии и с другими страничками, надо менять ее номер, меняется он тут:
Вместо цифры 4, другая цифра.

Когда добавляете новую функцию, добавьте новый case и номер который идет следующим, от прошлого числа.
Вот я и рассказал вам о своем проекте, следите за новостями в моем инстаграмме (там все подробности, а также находится актуальная информация про новые изобретения), с вами был Robozit, всем пока!
ссылка на Инстаграмм
ссылка на гугл дискНе пропустите обновления! Подписывайтесь на нашу группу Вконтакте.
Так же у нас есть Telegram канал.
Вам понравился наш материал? Поделитесь с коллегами!