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

Blaze
Участник
Зарегистрирован: 2018-01-31
Сообщений: 13

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

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

#2 2018-02-04 22:05:09

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 787

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

К сожалению, хрустального шара у меня нет, поэтому попробую угадать.
1 - могут быть банальные ошибки в программе, которые вы не видите,
2 - помехи, по цепи питания, от импульсного источника светодиодов могут вызывать сбои микропроцессора,
3 - и еще, что угодно. ,
Для устранения таких проблем используют разнообразные измериельные приборы, средства отладки программ, аналитическое мышление и услуги опытных специалистов.

#3 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)

#4 2018-02-04 23:35:44

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 787

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

Может. Это часто основная причина непредсказуемых сбоев. Попробуйте светодиодную ленту запитать от отдельного источника напряжения (стабилизатора) и повторите эксперимент. А еще я не используйте постоянно вывод на печать в обработчике прерываний, это может приводить к сбоям алгоритма приемника, ввиду большой длительности процесса печати.

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

Blaze
Участник
Зарегистрирован: 2018-01-31
Сообщений: 13

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

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

#6 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)

#7 2018-02-05 01:12:17

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 787

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

Да, это типичная ситуация при программной генерации и детектировании коротких импульсов. А я грешил на сериал-принт.  А светодиоды тут ни причем. Во многих контролерах есть аппартная поддержка детектирования сигналов ИК пультов, не требующая активного участия процессора. А драйвер таких светодиодов я бы сделал на таймерах, что бы уменьшить длительность критических секций. Думаю, что можно как-то сделать и на том, что есть. Игрушки это такие! Игрушки 21-го века. Контроллер 1wire, у Ардуино, тоже такой, как и драйвер этих светодиодов.

Редактировался Вячеслав Азаров (2018-02-05 10:43:13)

#8 2018-02-05 08:09:36

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 787

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

Вячеслав Азаров пишет:

А драйвер таких светодиодов я бы сделал на таймерах, что бы уменьшить длительность критических секций. Думаю, что можно, как-то, сделать и на том, что есть.

Можно, если использовать две Ардуинки. Слишком короткие интервалы импульсов необходимо обрабатывать. А перерывы между битами WS2812, оказывается, делать нельзя. В более развитых микроконтроллерах можно было-бы попробовать сделать неблокирующий драйвер с помощью DMA и таймеров, а для приема IR использовать усовершенcтвованный UART, но это уже отдельная тема. Странно, почему-то нет специализированной микросхемы для драйвера этих "лампочек".

Редактировался Вячеслав Азаров (2018-02-05 10:39:36)

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

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,325

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

teensy

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

Редактировался NoName (2018-02-05 10:25:02)

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела