#1 2018-02-04 21:54:40

Blaze
Учасник
Зареєстрований: 2018-01-31
Повідомлень: 13

Разные сигналы с ИК пульта с одной кнопки

Всем привет. Нужна помощь и совет с кодом для ИК приемника.. Я долго мучаюсь, пытаюсь сделать прогу в которой можно будет переключать режимы освещения диодной ленты. Соответственно я использовал прерывание, так как в любой момент захочу переключить режим. Почитал как работает приемник ИК. В общем суть в том что если сделать код который просто выводит коды кнопок то все ок. Но как только включается лента то сигнал с кнопки рассчитывается крайне не правильно. Подскажите есть вариант что надо поправить чтоб сигнал приходил правильно? В итоге хотелось бы сделать лампу и если так влияет свет, то получается у меня безвыходная ситуация?

Неактивний

#2 2018-02-04 23:09:09

Blaze
Учасник
Зареєстрований: 2018-01-31
Повідомлень: 13

Re: Разные сигналы с ИК пульта с одной кнопки

У программы забавное поведение. Вот моя программа.

#include <Adafruit_NeoPixel.h>
#include <IRremote.h>
#define PIN 11
int Leds = 160;

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(Leds, PIN, NEO_RGBW + NEO_KHZ800);

unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
int mode = 1;

int fade_g = 0;
int fade_r = 0;
int fade_b = 255;
int dir_g = 1;
int dir_r = 1;
int dir_b = 1;

int color[] = {0, 0, 0, 0};



void recievesignal() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
//    if (results.value == 0xFF1AE5 or results.value == 0xFF9A65 or results.value == 0xFFA25D or results.value == 0xFF02FD)
//      mode = results.value;
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  strip.begin();
  strip.show();
  irrecv.enableIRIn(); // Start the receiver
  attachInterrupt (0, recievesignal, CHANGE);
}

void loop() {
//calmmode(); // светодиоды медленно меняют яркость от большего к меньшему и наоборот

  //Serial.println(results.value, HEX);
//  switch (mode) {
//    case 0xFF1AE5:
//      calmmode();
//      break;
//    case 0xFF9A65:
//      thunderburst();
//      break;
//    case 0xFFA25D:
//      colour_fade();
//      break;
//    case 0xFF02FD:
//      reset();
//      break;
//  }

}

Конечно я не добавлял сами режимы светодиодов, они работают нормально. В данном виде программа работает отлично и коды считываются шикарно. НО больше ничего не происходит. Если просто включить режим свечения calmmode(); то код приходит не правильный именно в моменты когда свет становится ярким.

И второй вариант если в цикле loop ничего не добавлять но раскомментировать две строки:
//    if (results.value == 0xFF1AE5 or results.value == 0xFF9A65 or results.value == 0xFFA25D or results.value == 0xFF02FD)
//      mode = results.value;

То с этими строками коды считываются опять очень очень плохо.
Как можно уловить помехи от светодиодов? Это от напряжения подаваемого на ленту? Питание идет от 5В и на светодиоды и на приемник.

Остання редакція Blaze (2018-02-04 23:09:59)

Неактивний

#3 2018-02-04 23:55:59

Blaze
Учасник
Зареєстрований: 2018-01-31
Повідомлень: 13

Re: Разные сигналы с ИК пульта с одной кнопки

подключил светодиодную ленту от другого юсб. В ардуионо остался только провод контроллера. И все равно с работающей лентой код постоянно не правильный.

Неактивний

#4 2018-02-05 00:16:46

Blaze
Учасник
Зареєстрований: 2018-01-31
Повідомлень: 13

Re: Разные сигналы с ИК пульта с одной кнопки

Целый день искал ответ на свой вопрос.. И вот наконецто нашел.

The timing protocol for WS2812 leds requires disabling interrupts while writing out led data, and the IR library relies on interrupts to read the IR data, which means that if you're using the remote while the library is writing out led data, then it is going to miss part of the ir signal and misinterpret it.

There isn't really any way around this - switch to 4-wire leds (like the APA102 (adafruit sells them as Dotstars) or the LPD8806 or WS2801) or, alternatively, use the teensy 3/3.1 as your controller, where I have a solution that allows interrupts to run, even while using WS2812 leds.


Судя по всему это аппаратно не совсем возможно. sad Мои диоды типа WS2812 не работают с IR приемником. А я так надеялся sad

Остання редакція Blaze (2018-02-05 13:48:14)

Неактивний

#5 2018-02-05 10:21:34

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Разные сигналы с ИК пульта с одной кнопки

teensy

add  ) не сделал вычитку текста
можете использовать все то есть - поддерживающее DMA + i2S/SPI/PWM

Остання редакція NoName (2018-02-05 10:25:02)

Неактивний

#6 2020-12-22 11:50:45

koncert-master
Гість

Re: Разные сигналы с ИК пульта с одной кнопки

Здравствуйте, устал уже разбираться и никак не пойму в чем дело. Китайские пистолеты для лазертага. Примники на частоте 38, спойокно принимают любые сигналы, но считать сам сигнал адекватно не получается каждый раз разные коды и всегда UNKNOWN Сравнивал уже по всякому. Друг с другом пистолеты работают корректно и все понимают, но смоделировать сигнал не получается. Тут два варианта кодов просканированных граббером из IR-Remote, в чем их отличие, и что надо изменить, чтобы их корректно считать?

Protocol=UNKNOWN Data=0xCC014102 (32 bits)

Result in internal ticks (50 us) - always without trailing gap

rawData[41]:

     +  32, -  8     +  8, -  8     +  6, -  10     +  8, -  8

     +  8, -  15     +  8, -  16     +  8, -  15     +  8, -  15

     +  7, -  9     +  8, -  8     +  8, -  8     +  7, -  9

     +  15, -  8     +  8, -  9     +  8, -  7     +  8, -  8

     +  16, -  8     +  7, -  9     +  8, -  7     +  16, -  15

     +  7

Result in microseconds - without trailing gap for IRremote versions >= 3.*

rawData[41]:

     +1600, - 400     + 400, - 400     + 300, - 500     + 400, - 400

     + 400, - 750     + 400, - 800     + 400, - 750     + 400, - 750

     + 350, - 450     + 400, - 400     + 400, - 400     + 350, - 450

     + 750, - 400     + 400, - 450     + 400, - 350     + 400, - 400

     + 800, - 400     + 350, - 450     + 400, - 350     + 800, - 750

     + 350



Result as internal ticks (50 us) array - always without trailing gap

uint8_t rawTicks[41] = {32,8, 8,8, 6,10, 8,8, 8,15, 8,16, 8,15, 8,15, 7,9, 8,8, 8,8, 7,9, 15,8, 8,9, 8,7, 8,8, 16,8, 7,9, 8,7, 16,15, 7};  // Protocol=UNKNOWN Data=0xCC014102 (32 bits)



Result as microseconds array - with trailing gap for IRremote versions 2.*

uint16_t rawData[42] = {21810, 1600,400, 400,400, 300,500, 400,400, 400,750, 400,800, 400,750, 400,750, 350,450, 400,400, 400,400, 350,450, 750,400, 400,450, 400,350, 400,400, 800,400, 350,450, 400,350, 800,750, 350};  // Protocol=UNKNOWN Data=0xCC014102 (32 bits)



Pronto Hex as string

char ProntoData[] = "0000 006D 0015 0000 003E 000F 000F 000F 000C 0013 000F 000F 000F 001D 000F 001F 000F 001D 000F 001D 000D 0011 000F 000F 000F 000F 000D 0011 001D 000F 000F 0011 000F 000D 000F 000F 001F 000F 000D 0011 000F 000D 001F 001D 000D 0806 "





Protocol=UNKNOWN Data=0x9F5121E0 (32 bits)

Result in internal ticks (50 us) - always without trailing gap

rawData[41]:

     +  31, -  8     +  8, -  9     +  7, -  8     +  8, -  8

     +  8, -  16     +  7, -  16     +  7, -  16     +  7, -  17

     +  8, -  8     +  8, -  8     +  6, -  10     +  7, -  9

     +  15, -  8     +  8, -  8     +  6, -  10     +  7, -  9

     +  15, -  8     +  8, -  8     +  7, -  9     +  15, -  16

     +  8

Result in microseconds - without trailing gap for IRremote versions >= 3.*

rawData[41]:

     +1550, - 400     + 400, - 450     + 350, - 400     + 400, - 400

     + 400, - 800     + 350, - 800     + 350, - 800     + 350, - 850

     + 400, - 400     + 400, - 400     + 300, - 500     + 350, - 450

     + 750, - 400     + 400, - 400     + 300, - 500     + 350, - 450

     + 750, - 400     + 400, - 400     + 350, - 450     + 750, - 800

     + 400



Result as internal ticks (50 us) array - always without trailing gap

uint8_t rawTicks[41] = {31,8, 8,9, 7,8, 8,8, 8,16, 7,16, 7,16, 7,17, 8,8, 8,8, 6,10, 7,9, 15,8, 8,8, 6,10, 7,9, 15,8, 8,8, 7,9, 15,16, 8};  // Protocol=UNKNOWN Data=0x9F5121E0 (32 bits)



Result as microseconds array - with trailing gap for IRremote versions 2.*

uint16_t rawData[42] = {21438, 1550,400, 400,450, 350,400, 400,400, 400,800, 350,800, 350,800, 350,850, 400,400, 400,400, 300,500, 350,450, 750,400, 400,400, 300,500, 350,450, 750,400, 400,400, 350,450, 750,800, 400};  // Protocol=UNKNOWN Data=0x9F5121E0 (32 bits)



Pronto Hex as string

char ProntoData[] = "0000 006D 0015 0000 003C 000F 000F 0011 000D 000F 000F 000F 000F 001F 000D 001F 000D 001F 000D 0021 000F 000F 000F 000F 000C 0013 000D 0011 001D 000F 000F 000F 000C 0013 000D 0011 001D 000F 000F 000F 000D 0011 001D 001F 000F 0806 "

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму