IR ПЕРЕДАТЧИК

igorcds
Offline
Зарегистрирован: 03.12.2013

Доброго времени суток.

Народ, помогите разобраться с работой ir передатчика.

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

{убрал метку старта, 8850, 4350, 600, 500, 600, 500, 600, 500 ,600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 500, 600, 550, 550, 550, 550, 550, 550, 1600, 550, 550, 550, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1600, 600, 1600, 550, 1600, 600, 1600, 550, 1650, 550, 1600, 600, 1600, 550, 1600, 600}

Передаю этот массив, вот весь код программы - передатчика:

#include <IRremote.h>
int RECV_PIN = 11;
int BUTTON = 10;
int LED = 12;
int STATBUTTON = 0;

IRsend irsend;
IRrecv irrecv(RECV_PIN);
decode_results results;

//Unknown encoding: F4BA2988 (32 bits)
unsigned int TV[68] = {8850, 4350, 600, 500, 600, 500, 600, 500 ,600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 500, 600, 550, 550, 550, 550, 550, 550, 1600, 550, 550, 550, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1600, 600, 1600, 550, 1600, 600, 1600, 550, 1650, 550, 1600, 600, 1600, 550, 1600, 600};

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(BUTTON, INPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
  STATBUTTON=0;
}

void loop() 
{    
     STATBUTTON= digitalRead(BUTTON);

if (STATBUTTON==HIGH)
   {

//  поочередно закоментривано первую или вторую команду на передачу
 
     irsend.sendRaw(TV, 68, 32);   // команда включения ТВ.
     //irsend.sendNEC(0x800FF, 32); // тоже самое NEC
     delay(200);
   } 
     

}

 

Передатчик подсоединяю на пин3.

Аппаратура на этот код не реагирует, соответственно вторая ардуино которая принимает этот код выдает совершенно другой код и массив  [66], всегда 66. Т.е код передаю вышеуказанный, а принимает массив [66] , массив принимается другой, но содержимое массива всегда одинаково.  NEC передает(смотрел фотоаппаратом), но приемник нечего не выдает.

IR приемник  TL 1838 VS1838B infared receiver куплен на ebay.

IR передатчик ir led и транзистор s8050.

IR LED включен в цепь коллектора, информационный вход - база, через ограничивающий резистор и в цепи эммитера еще один резистор.

IR LED и транзистор выпаял из пульта, может дело в транзисторе. Нашел на него кучу даташитов - в одном он идет как pnp, а в другом npn транзистор.

Транзистор должен быть же npn? (когда на базе положительный импульс- транзистор открывается...)

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

 

 

 

igorcds
Offline
Зарегистрирован: 03.12.2013

помоему я перемудрил с ir передатчиком и транзистором...надо просто IR LED через ограничивающий резистор подсоединять к пин 3? правильно?

igorcds
Offline
Зарегистрирован: 03.12.2013

Народ помогите.

Чет то я запутался...

установил ir led через ограничивающий диод.

передаю вот что:

unsigned int TV[68] = {8850, 4350, 600, 500, 600, 500, 600, 500 ,600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 500, 600, 550, 550, 550, 550, 550, 550, 1600, 550, 550, 550, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1600, 600, 1600, 550, 1600, 600, 1600, 550, 1650, 550, 1600, 600, 1600, 550, 1600, 600};

и     irsend.sendNEC(0x800FF, 32) (тоже самое).

принимаю вот что:

Unknown encoding: 15E7F51B (32 bits)
Raw (66): -6950 1000 -800 950 -800 950 -800 1000 -750 1000 -750 1000 -750 1000 -750 1000 -850 900 -750 1050 -800 950 -850 900 -850 900 -2500 950 -850 900 -850 900 -900 950 -750 1000 -800 950 -800 1000 -750 1000 -750 1000 -800 950 -800 1000 -850 900 -2500 1000 -2550 900 -2550 950 -2550 900 -2600 850 -2550 1000 -2550 900 -2550 950

15E7F51B
Unknown encoding: 15E7F51B (32 bits)
Raw (66): -8050 1100 -950 1050 -1000 1050 -950 1050 -950 1050 -1000 1050 -950 1050 -1000 1050 -950 1050 -1000 1050 -950 1050 -950 1050 -1000 1000 -2900 1050 -950 1050 -1000 1000 -1000 1050 -1000 1050 -950 1050 -1000 1050 -950 1050 -1000 1050 -950 1050 -1000 1000 -1000 1050 -2850 1050 -2850 1050 -2850 1050 -2850 1050 -2850 1000 -2900 1050 -2850 1000 -2900 1000

 

Т.е принимает одинаковый код, но что то не то...

подскажите где ошибка может быть.

вот код:

#include <IRremote.h>
int RECV_PIN = 11;
int BUTTON1 = 10;
int BUTTON2 = 9;
int LED = 12;
int STATBUTTON1 = 0;
int STATBUTTON2 = 0;

IRsend irsend;
IRrecv irrecv(RECV_PIN);
decode_results results;

//Unknown encoding: F4BA2988 (32 bits)
unsigned int TV[68] = {8850, 4350, 600, 500, 600, 500, 600, 500 ,600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 500, 600, 550, 550, 550, 550, 550, 550, 1600, 550, 550, 550, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1600, 600, 1600, 550, 1600, 600, 1600, 550, 1650, 550, 1600, 600, 1600, 550, 1600, 600};

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(BUTTON1, INPUT);
  pinMode(BUTTON2, INPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
  STATBUTTON1=0;
  STATBUTTON2=0;
}

void loop() 
{    
     STATBUTTON1= digitalRead(BUTTON1);
     STATBUTTON2= digitalRead(BUTTON2);
delay(200);

if (STATBUTTON1==HIGH)
   {
     irsend.sendRaw(TV, 68, 32); 
    
     delay(200);
   } 
   
if (STATBUTTON2==HIGH)
   {
     irsend.sendNEC(0x800FF, 32); 
     delay(200);   
   } 

}

Поможите.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

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

std
Offline
Зарегистрирован: 05.01.2012

Если будет только передаваться, то надо в setup() сделать irsend.enableIROut(38); (в скобках частота модуляции в кГц - лучше чтобы совпадало но если нет - не особо критично, влияет в основном на дальность приёма). потом есть смысл попробовать частоты 36, 38, 40 кГц и посмотреть с какой приём надёжнее.

Если будет и приниматься, и передаваться, то enableIROut(Fm) надо делать непосредственно перед send***(), и потом для возобновления возможности приёма снова вызвать enableIRIn().
igorcds
Offline
Зарегистрирован: 03.12.2013

спасибо. завтра буду попробовать.

я так понял, моя ошибка в том, что я не объявил процедуру   irsend.enableIROut() в setup, а объявлена в коде только irrecv.enableIRIn() (только обработка принятого кода)?

igorcds
Offline
Зарегистрирован: 03.12.2013

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

Сделал все по вашей рекомендации, всё работает. Огромное спасибо за помощь.

Возник вопрос по вашим словам про прием и передачу.

Имеется пульт из набора к ардуино, и к примеру взял пульт от ТВ.

ИК приемником считал коды с пульта ардуино(CH-, CH+, VOL-, VOL+, PWR), соответственные коды с пульта ТВ

ну и изучаю данный вопрос....

Вот код:

#include <IRremote.h>
//PIN IR LED 3
//PIN IRRECIV 11
int RECEIVE_PIN = 11;
IRrecv irrecv(RECEIVE_PIN);
IRsend irsend;
decode_results results;
 
void setup() 
{
    Serial.begin(9600);
    irrecv.enableIRIn();
}
 
void loop()
{
    if (irrecv.decode(&results)) 
    {
 
        switch (results.value) 
           {
            case 0xFFA25D:
            irsend.enableIROut(36);
            irsend.sendNEC(0x8A857, 32);
            Serial.println("CH-");
            irrecv.enableIRIn();
            break;          
              } 
        irrecv.resume();
    }
}   

Если отправляю irsend.sendNEC(0x8A857, 32) просто передатчиком, все работает, а если как в вышеизложенном коде, то не отправляется.

Как вы и рекомендовали - перед каждой отправкой делаю активацию передатчика irsend.enableIROut(36)

и после самой передачи активирую работу приемника irrecv.enableIRIn()

Приемник скорее всего работает, т.к все команды отображаются в Serial.print (ch-, ch+ и т.д..) а вот ретрансляции нет...

подскажите пожалуйсто где я ошибся.

В setup  irrecv.enableIRIn()

делать не надо, а надо все делать в loop ?

спасибо.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

enableIROut перед sendNEC бессмысленна, смотрим код библиотеки и видим:

void IRsend::sendNEC(unsigned long data, int nbits)
{
  enableIROut(38);
...

enableIRIn нужно делать в setup, иначе в loop будет нечего делать.

Вам нужно удостовериться, что строки 23-26 вызываются. Добавьте туда (вместо строки 23) что нибудь типа:

digitalWrite( 13, !digitalRead(13) );

Чтобы видеть, что этот код срабатывает. Да, только придется добавить в setup в конец строку pinMode( 13, OUTPUT );

 

igorcds
Offline
Зарегистрирован: 03.12.2013

 

25 строка Serial.print("CH-") отрабатывает, значит по идее строки 22-24 тоже проходят, я загонял не только эту одну команду, всего 5 штук( ch-+, vol-+, pwr) код однотипный, поэтому только экспереметирую с одной... везде Serial.print стоит после send, и везде принт отрабатывает....завтра посмотрю через фотоаппарат и запущу вторую ардуино(найду еще один приемник) посмотреть что она пинимает....

во #2 enableIROut  сделал в setup и только тогда код начал вещать и работать, а когда был в сетапе только IRIn вещал всякую абракадабру... есть ли смысл делать в сетапе и IROut и IRIn, а потом каким то образом в loop переключать?

спасибо

igorcds
Offline
Зарегистрирован: 03.12.2013

Код:


#include <IRremote.h>
int RECV_PIN = 11;
IRsend irsend;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
 //irrecv.enableIRIn();            // Start the IN
}

void loop() 
{    
     delay(2000);
     //irrecv.enableIRIn();         // IN
     irsend.enableIROut(36);        // OUT
     irsend.sendNEC(0x800FF, 32); 
     delay(1000);
}

 

Если объявлен irrecv.enableIRIn() в setup или loop   передатчик не вещает. причем irsend.enableIROut() работает и в сетапе и в луппе.

как програмно отключать приемник на момент передачи?

igorcds
Offline
Зарегистрирован: 03.12.2013

так то в принципе жду когда придет модуль голосового управления и там не будет использоваться пульт...но все равно интерестно...всеж таки может подскажет кто нибудь как програмно отключить ir приемник на время передачи ir сигнала?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если не выходит с этой либой, то можно использовать другую.

Ещё вариант - посмотреть исходники либы и разобраться.

Я бы посмотрел, но ик передатчик надо искать, не помню, вроде был. Но не обещаю, как получится.

igorcds
Offline
Зарегистрирован: 03.12.2013

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вот скетч, сделанный из IRecord из библиотеки IRemote:

/*
 * IRrecord: record and play back IR signals as a minimal 
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * An IR LED must be connected to the output PWM pin 3.
 * A button must be connected to the input BUTTON_PIN; this is the
 * send button.
 * A visible LED can be connected to STATUS_PIN to provide status.
 *
 * The logic is:
 * If the button is pressed, send the IR code.
 * If an IR code is received, record it.
 *
 * Version 0.11 September, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);
IRsend irsend;

decode_results results;

void setup()
{
  Serial.begin(57600);
}

/* Эти коды отправляются по кругу */
unsigned long code_array[] =
{
  0x5EA1E21C,
  0x3EC11DE2
};
byte code_array_len = sizeof( code_array ) / sizeof( unsigned long );

void loop()
{
  static byte l_index = 0;

  Serial.print("Sending: 0x"); Serial.println( code_array[ l_index ], HEX );
  /* Отправляем код */
  irsend.sendNEC( code_array[ l_index ], 32 );

  /* Разрешаем прием кодов */
  irrecv.enableIRIn();
  Serial.print("Wait input code.. ");
  /* Ждем код */
  delay(1000);
  /* Если код получен, то печатаем его */
  if (irrecv.decode(&results))
  {
    Serial.println( results.value, HEX );
    irrecv.resume(); // resume receiver
  }
  else
  {
    Serial.println( "No code" );
  }
  /* Подготовка отправки следующего кода */
  l_index++;
  if( l_index >= code_array_len )
  {
    l_index = 0;
  }
}

Вот что на выходе:

Sending: 0x5EA1E21C
Wait input code.. No code
Sending: 0x3EC11DE2
Wait input code.. No code
Sending: 0x5EA1E21C
Wait input code.. FE801AE4
Sending: 0x3EC11DE2
Wait input code.. No code
Sending: 0x5EA1E21C
Wait input code.. FE801AE4
Sending: 0x3EC11DE2
Wait input code.. FE80AA54
Sending: 0x5EA1E21C
Wait input code.. FE80DA24
Sending: 0x3EC11DE2
Wait input code.. FE808678

Скетч отправляет очередной код из массива кодов, затем ждет секунду приема кода (я нажимал на пульте кнопку несколько раз), если код получен, то выводит его в Serial, либо пишет "No code"

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

Вот фотоотчет. На левой беспаечной приемник, на нижней - передатчик (прозрачный светик от какого то пульта с транзистором оттуда же). Arduino Леонардо. Чуть приемник не сжег, успел выключить. Неправильно питание подключил :) Но он выжил и работает.

igorcds
Offline
Зарегистрирован: 03.12.2013

огромное спасибо. буду попробовать и разбираться

igorcds
Offline
Зарегистрирован: 03.12.2013

ваш скетч еще не пробовал, возник попутный вопрос- у вас строка 44 печатает один двух nec кодов,
в строке 46 sendNEC происходит, в строке 49 переходит в режим IRIn, далее принимает, декодирует
код и выводит в Serial.print принятый код с пульта.

А точно строка 46 выполняется и send происходит? я когда пытался на УНО принимать и при приеме
определенного нек кода вещать вещать нужный мне код - не получалось.

Т.е я также ставил print и перед и после команды sendNEC- принты все отрабатывали, а вот на
приемной ардуине была тишина(ардуино приемника точно работоспособно, т.к пульты она считывает).

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

Да, и у меня правильно вещает NEC только при включенном IROut, но если IRIn включен, передачи нет....
Вообщем завтра возьму вторую ардуину и посмотреть, что она примет при работе вашего кода...

код в посте 6, IR и Out делал в различный комбинациях..

igorcds
Offline
Зарегистрирован: 03.12.2013

если можно, разъесните что выполняет эта строка

	byte code_array_len = sizeof( code_array ) / sizeof( unsigned long );

вот эта

static byte l_index = 0;

и что выполняет эта конструкция

  l_index++;
  if( l_index >= code_array_len )
	  {
    l_index = 0;
     }

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

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

code_array_len - это длина массива, надо было в начале const добавить - это значение не меняется.
l_index - это статическая переменная, инициализируется один раз нулем, потом в конце loop увеличивается и при достижении длины массива обнуляется, Вы все правильно поняли.
Принимать код с ардуины я не пробовал, попробую, но времени мало, в общем день-два

E155
Offline
Зарегистрирован: 06.04.2013

Добрый день. 

Делаю автоматизацию в конференцзале.  По идее принимаем код с пульта и в зависимости от надатой кнопки выполняется определенный сценарий.  управляющие комманды раздаются по RS-232 и ИК кодами.

Написал скетч, залил возникла проблема, при вызове функции с передачей ИК - перестает читать ИК коды.

В чем может быть дело? 

Написал упрощенный скетч в котором только прием и вызов функции с передачей. Результат тот же.

Mega 2650

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value);
    if (results.value == 0xEC0733B3) {trans();}
    irrecv.resume(); // Receive the next value
  }
    Serial.print("1");
}

void trans()

{
 for (int i=0; i<=5; i++ )   {
    irsend.sendNEC(0x189710EF, 32);
 delay(100);
  }
  }

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

После отправки кода нужно всегда вызывать разрешение приема кода, он у тебя в строке 12. Для конкретного этого кода это можно сделать, напиример, скопировав строку 12 и вставив её перед строкой 31 (между 30 и 31), тогда после отправки 6 раз кода (после цикла) будет разрешен прием IR кода.

 

E155
Offline
Зарегистрирован: 06.04.2013

Спасибо. Заработало. Думал  irrecv.resume()  это решает.

Что странно скетч сегодня стал зависать на меге еще в void setup на выводе текста в serial. В коде в конце setup строка которая выводит в порт "Setup done". Выводится "Se" и зависон.

Причем даже не внес в него изменений.

Залил на uno там работает.  

Александр Спицын
Offline
Зарегистрирован: 06.03.2017

переатчик всегда устанавливается только на 3 пин?

 

Александр Спицын
Offline
Зарегистрирован: 06.03.2017

реально ли сделать передающими инфракрасный сигнал светодиоды подключенные с 13 по 8 пин .и что делать если я хочу использовать несколько светодиодов в качестве передатчика ик сигнала ?
обьясните структуру скетча для работы ик передатчика , более подробно что нужно прописывать чтобы передавать ик сигнал. буду благодарен, не серчайте на меня , я новичок в этом деле