Здравствуйте, возникла необходимость создать что-то вроде прокси между источником сигнала для WS2812 ленты и самой лентой.
После декодирования планирую производить небольшие изменения сигнала, такие как изменения яркости или вырезание конкретного куска из ленты, и ретранслировать дальше.
Однако, первый эксперимент дал не утешительный результат.
Собрал вот такую схему:
Arduino Pro Mini выступает в роли источника сигнала. Сигнал подается на 6 пин.
Вот код (проверял на куске ленты, все работает):
Собственно в коде просто происходит обновление ленты каждые 2 секунды. Длина ленты 5 светодиодов.
Arduino Uno выступает в роли приемника сигнала. Сигнал принимается на 3 пин через аппаратные прерывания.
Вот код:
Код просто подсчитывает количество изменений сигнала на 3 пине за 1 секунду и выводит лог через Serial порт.
Вот что выводится в логах:
Собственно вопрос.
Реально ли декодировать WS2812 сигнал исключительно средствами Arduino? Возможно это я делаю что-то не так.
Или же может быть есть какие либо иные подходы (возможно даже готовые модули) для подобных задач?
После декодирования планирую производить небольшие изменения сигнала, такие как изменения яркости или вырезание конкретного куска из ленты, и ретранслировать дальше.
Однако, первый эксперимент дал не утешительный результат.
Собрал вот такую схему:
Arduino Pro Mini выступает в роли источника сигнала. Сигнал подается на 6 пин.
Вот код (проверял на куске ленты, все работает):
C++:
#include "FastLED.h"
#define LED_COUNT 5
#define LED_PIN 6
CRGB strip[LED_COUNT];
void setup()
{
FastLED.addLeds<WS2812B, LED_PIN, RGB>(strip, LED_COUNT);
}
void loop()
{
for (int i = 0; i < LED_COUNT; i++)
{
strip[i] = CRGB::Red;
}
FastLED.show();
delay(2000);
}
Arduino Uno выступает в роли приемника сигнала. Сигнал принимается на 3 пин через аппаратные прерывания.
Вот код:
C++:
#define PIN_IN 3
volatile int count;
void setup() {
count = 0;
attachInterrupt(digitalPinToInterrupt(PIN_IN), inChanged, CHANGE);
Serial.begin(9600);
}
void loop() {
delay(1000);
int currentCount = count;
Serial.print("Count:");
Serial.println(currentCount);
count = 0;
}
void inChanged() {
count += 1;
}
Вот что выводится в логах:
Для передачи сигнала для 5 светодиодов нужно ровно 120 бит, а значит 240 изменений сигнала. Из чего можно предположить, что ардуна не справляется с такой нагрузкой так как, в случае с данным примером, Arduino смогла зарегистрировать лишь 26 случаев.13:45:12.043 -> Count:26
13:45:13.033 -> Count:0
13:45:14.016 -> Count:27
13:45:15.049 -> Count:0
13:45:16.035 -> Count:26
13:45:17.026 -> Count:0
13:45:18.058 -> Count:26
13:45:19.051 -> Count:0
13:45:20.039 -> Count:26
Собственно вопрос.
Реально ли декодировать WS2812 сигнал исключительно средствами Arduino? Возможно это я делаю что-то не так.
Или же может быть есть какие либо иные подходы (возможно даже готовые модули) для подобных задач?