Быстрая загрузка (WS2812B) и неисправимая проблема

Я пытаюсь управлять своим WS2812B с помощью пульта дистанционного управления. Чтобы заархивировать это, я использую библиотеку UNRemote. Проблема в том, что эти две библиотеки не работают вместе.

Я провел некоторое исследование и выяснил, что это проблема с таймерами.Но внутри файла библиотеки UNRemote (boarddefs.h) есть возможность выбрать другой таймер (по умолчанию он использует TIMER2, поэтому я предположил, что FastLED также использует Timer2).

Поэтому, когда я меняю таймер в файле boarddefs.h на TIMER1, он также теперь отлично работает для меня. Я продолжаю получать случайные ИК-коды. Когда я прекращаю использовать библиотеку FastLED, я получаю правильные коды.

Некоторым решением этой проблемы является считывание ИК-сигнала только после того, как irrecv простаивает:

  while (!irrecv.isIdle());  // если не бездействует, подождите до завершения
  if (irrecv.decode(&results)) {
     ...
  }

Это делает около 80% показаний правильными.

Я использую arduino NANO clone. Мой вопрос в том, есть ли какой-либо способ использовать библиотеки UNRemote и FastLED вместе, кроме использования двух arduino NANO (используйте один для чтения ИК-излучения, а другой для управления светодиодами)?

, 👍1


3 ответа


1

Микросхемы WS2812B сильно зависят от времени. Вы должны синхронизировать биты в диапазоне ±150 нс. Это вряд ли будет хорошо работать при синхронизации битов с ИК-пульта дистанционного управления. Вы находите ошибки в ИК - кодах-это меня не удивляет.

Я предлагаю вам использовать вашу идею о двух нанотехнологиях. Можно считывать ИК-коды. Другой может отображать поток пикселей, а затем "спрашивать" другого (например, через последовательный или I2C), поступила ли другая команда. Таким образом, время может быть сдвинуто таким образом, чтобы оба процессора не прерывались, когда они заняты.

,

Но, как я читал, Arduino NANO может использовать два или даже три таймера. Я не до конца понимаю тему таймера, но я понимаю, что я мог бы использовать timer1 для светодиода и timer2 для отмены - но это не работает..., @Marek

Да, но простое наличие таймеров не обязательно решает вашу проблему. Вы отправляете биты на WS2812B каждые 350 нс или около того. Это не дает вам свободного времени для считывания входящих ИК-битов, независимо от таймера или нет., @Nick Gammon


2

обновление в 2021 году, аналогичная проблема, быстро исчезла, вызвав непонятные ИК-коды, добавив, что в то время как цикл:

while (!irrecv.isIdle());  // если не бездействует, подождите до завершения

как раз перед тем, как ик-проверка сработала для меня, не 100% кодов верны, но более чем достаточно хороши для моего использования, ты спасатель жизни

,

0

Я хочу добавить свои два цента к решению, опубликованному @BenAshmore, которое позволяет стать посредником между быстрыми обновлениями и получением разумных данных:

void loop() {
  
 if(IrReceiver.decode()){
    if( IrReceiver.decodedIRData.protocol == UNKNOWN ){
        wantData=true;
    }else{
        wantData=false;
        Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); 
    }
    IrReceiver.resume(); // Включаем получение следующего значения
  }
 
  if(!wantData || IrReceiver.isIdle() ){
    FastLED.show();
   
  }

По сути, если я получаю беспорядочные ИК-данные, я знаю, что что-то поступает, и именно в этом случае я прерываю обновление FastLed, пока не прочитаю что-то хорошее.

,