Конфликт ИК-приемника и светодиодной ленты
- Войдите на сайт для отправки комментариев
Пт, 23/06/2017 - 22:15
Добрый день!
Проблема следующая. Имеется Arduino Nano, управляющая двумя самопаяными светодиодными лентами из светодиодов ws2812b, по 8 штук в каждой. Также имеется обычный ИК-приемник, принимающий сигналы с любого пульта от телевизора. Если коротко, то суть заключается в том, чтобы по различным сигналам менять освещение и яркость светодиодов. Однако, как только я в программе добавляю строки
LED_tah.show(); LED_spd.show();
Тут же сигналы с ИК-приемника начинают приходить какие-то левые и постоянно разные. Подскажите пожалуйста, в чем может быть проблема? и как ее исправить?
Еще одно возможное влияение - это питание. Питается система от понижающего модуля mini360. Он импульсный, возможно создает помехи, конденсаторы еще не пробовал припаять.
Из кода программы максимально постарался все выкинуть и выглядит он следующим образом:
#include <IRremote.h> //Библиотека для ИК-приемника #include <Adafruit_NeoPixel.h> // подключаем библиотеку #define LTAH 10 // пин подключения управления светодиодами тахометра #define LSPEED 11 // пин подключения управления светодиодами спидометра #define NUMPIXELS 8 //Число светодиодов в ленте Adafruit_NeoPixel LED_tah = Adafruit_NeoPixel(NUMPIXELS, LTAH, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel LED_spd = Adafruit_NeoPixel(NUMPIXELS, LSPEED, NEO_GRB + NEO_KHZ800); IRrecv irrecv(A1); // указываем пин, к которому подключен IR приемник decode_results results; void setup() { irrecv.enableIRIn(); //Инициализация ИК-приемника LED_tah.begin(); //Инициализируем библиотеку Adafruit_NeoPixel LED_tah.show(); //гасим светодиоды из указанного диапазона LED_spd.begin(); //Инициализируем библиотеку Adafruit_NeoPixel LED_spd.show(); //гасим светодиоды из указанного диапазона Serial.begin(9600); } void loop() { //--------- если был сигнал от ИК-приемника, то ------- if (irrecv.decode(&results)) // если данные пришли выполняем команды { switch(results.value) { case 2155806975 : //следующая программа programm++; if (programm >= 5) programm = 1; break; case 2155839615 : //предыдущая программа programm--; if (programm == 0) programm = 4; break; } irrecv.resume(); // принимаем следующий сигнал на ИК приемнике } turn_leds(); // п/п влючения светодиодов, соответственно текущим данным } // п/п влючения светодиодов, соответственно текущим данным void turn_leds() { LED_tah.show(); LED_spd.show(); }
Если кто сталкивался или знает решение проблемы, прошу подскажите пожалуйста.
Сталкивались. Конфликтует оно по времени. И прием с ИК и динамическая индикация на ws2812b чувствительны к выдержке временных интервалов. При этом вывод в ws2812b нельзя прерывать, а опрос приемника надо делать часто и не откладывать. Вот и конфликтует.
Я переставал выводить на ws2812b при обнаружении активности в ИК канале.
Можете здесь глянуть http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812#comment-257986 .
Сталкивались. Конфликтует оно по времени. И прием с ИК и динамическая индикация на ws2812b чувствительны к выдержке временных интервалов. При этом вывод в ws2812b нельзя прерывать, а опрос приемника надо делать часто и не откладывать. Вот и конфликтует.
Я переставал выводить на ws2812b при обнаружении активности в ИК канале.
Можете здесь глянуть http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812#comment-257986 .
Подскажите пожалуйста, а каким образом возможно, с помощью библиотеки IRremote.h, можно понимать, что по ИК-каналу связи идет передача данных, чтобы в этот момант также прерывать вывод для светодиодов?
Или же просто как правильно поменять конструкцию программы? Менял местами многое, но результата не дало.
Проблему решил следующим способом:
как только на ИК-приемник поступает сигнал, на его логическом выходе образуется низкий сигнал (ардуиновская АЦП показывает 1 из промежутка от 0..1023). Таким образом, как только уровень сигнала становится низким, значит начался прием какого-то сигнала. Оконцовкой передачи можно считать рассшифровку этого сигнала. Общая конструкция выглядит следующим образом: