IR приемник

Иван_123
Offline
Зарегистрирован: 17.01.2018

Здравствуйте.

Очень странный(а может, нет?) приём ИК сигнала с обычного пульта. При нажатии на любую кнопку выводятся неоднозначные данные(или так и должно быть?..). При этом 8-разрядный код, виновник торжества(он мне и нужен, как вы поняли), не появляется вовсе, хотя раньше он выводился с этого самого пульта, хоть и чередовался с "левыми" значениями. Теперь же выводятся только "левые" значения. Вот скрин монитора порта и скетч:

#include <IRremote.h> // подключаем библиотеку для IR приемника

IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник
decode_results results;

void setup() // процедура setup
{
  irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
  pinMode(A0, INPUT); // пин A0 будет входом (англ. «intput»)
  
  Serial.begin(9600); // подключаем монитор порта
}

void loop() // процедура loop
{
  if (irrecv.decode(&results)) // если данные пришли выполняем команды
  {
    Serial.println(results.value); // отправляем полученные данные на порт
    irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
  }
}

 

Приемник подключен к А0. Что это? Так и должно быть?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

На скорость не влияет, но строка 9 лишняя - уберите.

По делу же. Проверьте правильность соединения и батарейку в пульте.

Иван_123
Offline
Зарегистрирован: 17.01.2018

 Строку убрал. Взял другой пульт из набора ардуино. Батарейка - 3,2 V, только что проверил. 8-разрядный десятичный код приходит, но между ним влезают 9,10-разрядные "нечто". При удержании кнопки пульта выдает один и тот же для всех кнопок 10-разрядный код. Проблема в соединении?

Иван_123
Offline
Зарегистрирован: 17.01.2018

И еще: разве код не должен быть шестнадцатеричным? Даже если мне приходит 8-разрядный десятичный код, то при переводе получается лишь 7-разрядный шестнадцатеричный, а нужен 8-разрядный.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, может быть. проверяйте

Иван_123
Offline
Зарегистрирован: 17.01.2018

Хорошо, предположим, при использовании другого пульта выдает раз ( через десять фальсификата) 16769565. Как теперь подать этот сигнал с инфракрасного диода? Вот так не получается:

#include <IRremote.h>
IRsend irsend;
void setup()
{
}
 
void loop() {
    for (int i = 0; i < 3; i++) {
        irsend.sendSony(16769565, 3);
        delay(40);
    }
    delay(1000);
}

Хотя ИК диод в камеру мигает.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Делайте так и будет вам шестнадцетеричный без лидирующих нулей.

Serial.println(results.value, HEX);

И лампочки всякие люминисцентные выключите во время испытаний.

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

Иван_123
Offline
Зарегистрирован: 17.01.2018

Наконец то дельный совет! Выяснил, что "левые" значения - FFFFFFFF (при удержании кнопки только он и выходит) и 10EFD02F. Очевидно, максимальное 8-разрядное шестнадцатеричное значение выходит неспроста. Что это за "неспроста", которое перекрывает мне основное значение?

sadman41
Offline
Зарегистрирован: 19.10.2016

Это признак того, что последняя нажатая кнопка (напр. 10EFD02F) всё еще не отпущена.

Иван_123
Offline
Зарегистрирован: 17.01.2018

То есть залипла кнопка? Но ведь в коде указано: если есть сигнал то.... Если я не нажимаю на кнопки, в монитор порта ничего не выводится. 

Иван_123
Offline
Зарегистрирован: 17.01.2018

Ну да ладно, спасибо. Вроде разобрался. Надо было HEX написать и все. Сбили с толку десятичные показатели. Единственное, осталось FFFFFFFF, но это несложно обойти. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Проведите простой эксперимент:

Нажмите "1" и держите. Отпустите. Нажмите "2" и держите. Отпустите. Первый код будет разный, а потом будет повторяться FFFFFFF. Это значит, что вы кнопку не отпустили. Когда отпустите - фффффф прекратит передаваться.

Иван_123
Offline
Зарегистрирован: 17.01.2018

Определил наконец код с кнопки выключения телевизора. ИК диод подключен к 3 пину, на камеру мигает с установленным интервалом, но тускловато.

Но телевизор ноль реакции. 

#include <IRremote.h>
 
IRsend irsend;
 
void setup()
{
}
 
void loop() {
    for (int i = 0; i < 3; i++) {
        irsend.sendSony(0x10EFD02F, 3);
        delay(40);
    }
    delay(5000); //5 second delay between each signal burst
}

Резистор стоит 100 Ом. Ошибка в коде? Или резистор поменять?

Иван_123
Offline
Зарегистрирован: 17.01.2018

Собственно, замена резистора уже на 50 Ом не увенчалась успехом

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну так телевизор на каком расстоянии? Поднесите прямо ему к приемнику - скорее всего заловит. Если правильно определили типа посылки (Sony). Резистор рассчитывать надо (по закону Ома). 

Иван_123
Offline
Зарегистрирован: 17.01.2018

Еще один момент. Тип посылки - это что? Для каждого прибора свой?

Иван_123
Offline
Зарегистрирован: 17.01.2018

Тыкаю прямо в приемник. Не реагирует

Иван_123
Offline
Зарегистрирован: 17.01.2018

Хорошо, рассчитаю

sadman41
Offline
Зарегистрирован: 19.10.2016

Иван_123 пишет:

Еще один момент. Тип посылки - это что? Для каждого прибора свой?

Естественно. IRDump в примерах смотрите.

Иван_123
Offline
Зарегистрирован: 17.01.2018

Decoded NEC. То есть sendNEC ?

Иван_123
Offline
Зарегистрирован: 17.01.2018

Вместо sendSony?

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну вот видите - всё просто. Не тот тип посылки.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Иван_123 пишет:

Decoded NEC. То есть sendNEC ?

Чисто из любопытства - а телевизор-то какой?

Иван_123
Offline
Зарегистрирован: 17.01.2018

NYUNDAI

Иван_123
Offline
Зарегистрирован: 17.01.2018
#include <IRremote.h>
 
IRsend irsend;
 
void setup()
{
}
 
void loop() {
    for (int i = 0; i < 3; i++) {
        irsend.sendNEC(0x10EFD02F, 3);
        delay(40);
    }
    delay(5000); //5 second delay between each signal burst
}

ИК диод мигает, телевизор - не реагирует. Эхх

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну вы хоть посмотрите в примерах, как sendNEC() вызывается,  особенно на второй параметр обратите внимание.

Иван_123
Offline
Зарегистрирован: 17.01.2018

В примерах sendNEC(число, 32)

32?

Иван_123
Offline
Зарегистрирован: 17.01.2018

Ну, понятно, битность. А как же пин, к которому подключается IR диод? Где его указывать?

sadman41
Offline
Зарегистрирован: 19.10.2016
IRremoteInt.h:
 
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
#else
//#define IR_USE_TIMER1   // tx = pin 9
#define IR_USE_TIMER2     // tx = pin 3

#endif

 

 

Иван_123
Offline
Зарегистрирован: 17.01.2018

http://forum.amperka.ru/threads/ИК-передатчик.3305/

Здесь такая же проблема. И вроде как библиотеку меняют. Может, и в этом проблема?.

sadman41
Offline
Зарегистрирован: 19.10.2016

А что, другая библиотека вдует в светодиод больше мощи что ли? У меня самсунг уверенно ловит с 20 см с обычным IR + килоомный резистор, подключенным напрямую к пину. Если надо больше - раскачивайте диод транзистором.

Иван_123
Offline
Зарегистрирован: 17.01.2018

АААААААА. ЗАРАБОТАЛ. СПАСИБО!!! define помог. Только откуда это? Почему я не нашел этого?

Иван_123
Offline
Зарегистрирован: 17.01.2018

Если кому то нужно будет, вот рабочий код:

#include <IRremote.h>
 
IRsend irsend;
#define IR_USE_TIMER2
 
void setup()
{
}
 
void loop() {
    for (int i = 0; i < 3; i++) {
        irsend.sendNEC(0x10EFD02F, 32);
        delay(40);
    }
    delay(5000); //5 second delay between each signal burst
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, три раза передавать код NEC-у не надо, он не такой тупой. 

А дефайн заменяется на #include <IRremoteInt.h>

 
Иван_123
Offline
Зарегистрирован: 17.01.2018

А это пример из библиотеки. Ее создатель считает код тупым. 

Где вы находите описание библиотек? Набрав в поисковик "IRremote библиотека описание" ничего толкового не нашел. 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Иван_123 пишет:

А это пример из библиотеки. Ее создатель считает код тупым. 

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

Иван_123
Offline
Зарегистрирован: 17.01.2018

Все вопросы - к создателю IRremote :)

Иван_123
Offline
Зарегистрирован: 17.01.2018

Код я исправлю, хорошо

sadman41
Offline
Зарегистрирован: 19.10.2016

Иван_123 пишет:

А это пример из библиотеки. Ее создатель считает код тупым. 

Где вы находите описание библиотек? Набрав в поисковик "IRremote библиотека описание" ничего толкового не нашел. 

Не знаю, что хотел продемонстрировать писатель примера, но вот тут, например, нет никакого троекратного посылания: http://led-displays.ru/ir/sony_sirc_protocol.html , https://www.sbprojects.net/knowledge/ir/sirc.php

 

SSSRMaster
Offline
Зарегистрирован: 25.12.2017

Я подключал к цифровому входу D, и считывал через digitalRead, все работало.

SSSRMaster
Offline
Зарегистрирован: 25.12.2017

Иван_123 пишет:

Здравствуйте.

Очень странный(а может, нет?) приём ИК сигнала с обычного пульта. При нажатии на любую кнопку выводятся неоднозначные данные(или так и должно быть?..). При этом 8-разрядный код, виновник торжества(он мне и нужен, как вы поняли), не появляется вовсе, хотя раньше он выводился с этого самого пульта, хоть и чередовался с "левыми" значениями. Теперь же выводятся только "левые" значения. Вот скрин монитора порта и скетч:

#include <IRremote.h> // подключаем библиотеку для IR приемника

IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник
decode_results results;

void setup() // процедура setup
{
  irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
  pinMode(A0, INPUT); // пин A0 будет входом (англ. «intput»)
  
  Serial.begin(9600); // подключаем монитор порта
}

void loop() // процедура loop
{
  if (irrecv.decode(&results)) // если данные пришли выполняем команды
  {
    Serial.println(results.value); // отправляем полученные данные на порт
    irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
  }
}

 

Приемник подключен к А0. Что это? Так и должно быть?

 

#include <IRremote.h>
 
int RECV_PIN = 11;
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}
 
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}
SSSRMaster
Offline
Зарегистрирован: 25.12.2017

не дописана конвертацмия в HEX или DEC