А похвалимся художественной самодеятельностю на WS2812?

Logik
Offline
Зарегистрирован: 05.08.2014

Доброго времени суток.

Вынужден констатировать следующие факты:

- скоро Новый Год. Долгожданный и любимый праздник для многих является поводом украсить елку или дом (или что там у кого есть) разноцветными огнями.

- из всех доступных вариантов праздничной илюминации именно реализация на основе ws2812b (или её братев) является наиболее гибкой и совершенной. 

- использование ws2812b для новогодних огней - дело простое. Даже тривиальное. Даже на проект не тянет с технической стороны. А вот с художественной стороны - просто бездонный простор для творчества. Но пока реализуеш эффект,  чтоб все смотрелось именно как во сне видел и жене шоб нравилось и соседи засматривались - так запаришся что на огни уже смотреть не хочется.

Потому предлагаю следующее:

1. Всем кто до сих пор не в курсе о прогрессе в гирляндостроении - изучаем ws2812b и быстренько закупаемся в поднебесной, чтоб успеть к бою курантов.

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

3. Пишем и публикуем свои шедевры.

Что в итоге? Авторам самых ярких и красочных эффектов - респект и уважуха с пожизненной гарантией в виде записей на форуме. Можна и голосовалку бы сделать. Всем  - отличная коллекция эффектов, которая позволит быстро собрать новогоднее шоу, выгодно отличающееся разнообразием эффектов но в то же время гарантирующее уникальность и индивидуальность.

Если будет активный интерес  форумчан готов выложить скетч, для начала разговора по п.2.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Кончились идеи? Решил чужих подсобрать, а то бизнес киснет?

Logik
Offline
Зарегистрирован: 05.08.2014

Бизнес на гиглядндах?! С китаем конкурировать? 8)))  Это ж какую цену выставлять? И кто купит ))))  Такие вещи только для души делают, с отрицательной рентабельностью.. Но если у народа нет интересу - ну и ладно.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Logik пишет:

Если будет активный интерес  форумчан готов выложить скетч, для начала разговора по п.2.

Вот с этого надо и начнать. Ну и выложить свои шедевры по пункту 3. Вдохновить своим примером ткскзть.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да я сам на днях буду мучать, только на ws2811. но это вроде практически одно и тоже

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

угу, 2811 отдельный чип, а 2812 со светодиодами в одном корпусе.

Logik
Offline
Зарегистрирован: 05.08.2014

KVadik пишет:

 Вдохновить своим примером ткскзть.

Если без допинга никак - держи ;) За коменты в ассемблере - сорри, как есть так запостил, оно врядли кому интересно.


#ifndef cbi
#define cbi(sfr, bit) (sfr &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif 

#define  ARDUINO_PORT(a)        ((a<8)?PORTD:(a<14?PORTB:PORTC))
#define  ARDUINO_PIN(a)           ((a<8)?PIND:(a<14?PINB:PINC))
#define  ARDUINO_DDR(a)          ((a<8)?DDRD:(a<14?DDRB:DDRC))
#define  ARDUINO_PIN_NUM(a)  ((a<8)?a:(a<14?(a-8):(a-14))) 

#define LED_PIN A5
#define LED_PIN_NUM   ARDUINO_PIN_NUM(LED_PIN)
#define LED_PORT      ARDUINO_PORT(LED_PIN)

#define NumberLED 30
byte arr[NumberLED*3]; 



// the setup routine runs once when you press reset:
void setup() 
{
  pinMode(LED_PIN, OUTPUT); 
}  



extern "C" {
__attribute__ ((noinline)) void OutFrame_(void* buf, byte len)
{
  cli();
asm volatile (
    "movw r28, %[ptr]  \n\t" //загрузка Y
     
     "mov  r26, %[L] \n\t" //загрузка Y младшего+длинна масива
     "add  r26,r28 \n\t"
     
     "ld   r24, Y+  \n\t" //инициализация отправки первого байта
     "ldi r25, 8 \n\t"
     "rjmp a2_ \n\t" 
     

"a1_:" //инициализация отправки не первого байта
                 "sbi	%[PP], %[pin] \n\t"    // 1 цикл            
               "nop \n\t"     
                 "ld   r24, Y+  \n\t"    //2 цикла
                 "sbrs	r24, 7 \n\t"       //1 цикл при 0 и 2 цикла при скачке проверка бита и скачек на +2
                 "cbi	%[PP], %[pin] \n\t"       //0,375us линию в низкий уровень
                 "lsl r24 \n\t"         //1 цикл сдвиг в лево
                 "ldi r25, 7 \n\t"       // 1 цикл
               "nop \n\t"     
              "nop \n\t"     
                "cbi	%[PP], %[pin] \n\t"       //1 цикл 0,75us линию в низкий уровень
                 "nop \n\t"
                 "nop \n\t"
               "nop \n\t"     
              "nop \n\t"     
           
 /* вывод  бита следующего байта*/        
"a2_:           nop \n\t"
                 "sbi	%[PP], %[pin] \n\t"       //1 цикл линию в высокий уровень
                 "nop \n\t"     
               "nop \n\t"     
                 "sbrs	r24, 7 \n\t"       //проверка бита и скачек на +2
                 "cbi	%[PP], %[pin] \n\t"       //0,375us линию в низкий уровень
                 "lsl r24 \n\t"         //1 цикл сдвиг в лево
                 "dec r25  \n\t"         //1 цикл
               "nop \n\t"     
               "nop \n\t"     
                 "cbi	%[PP], %[pin] \n\t"       //1 цикл 0,75us линию в низкий уровень
               "nop \n\t"     
               "nop \n\t"     
               "nop \n\t"     
               "nop \n\t"     
               "nop \n\t"     
                 "brne a2_  \n\t"      // 1 цикл без перехода и 2 с переходом
//после этого слишком долго 0.625 вместо 0.45 и 1 вместо 0.85
               
               
                 "cpse r28, r26 \n\t"    //1 цикл  проверка Y на конец массива 
                 "rjmp a1_ \n\t"      //2 цикла
                 : 
                 : [ptr] "r" (buf) ,
                  [L] "r" (len), 
                  [PP] "I" (_SFR_IO_ADDR(LED_PORT)),
                  [pin] "I" (LED_PIN_NUM)
                  
                  
             );
             sei();
}
}


void loop()
{
sss:
  memset(arr,0,sizeof(arr));

  arr[0]=0x8;
  arr[4]=0x8;
  arr[8]=0x8;
  OutFrame(arr,sizeof(arr));

  delay(1000);

 arr[0]=0x28;
  arr[4]=0x28;
  arr[8]=0x28;
  arr[80]=0xff;
  OutFrame(arr,sizeof(arr));

  delay(1000);
  goto sss;
 memset(arr,0,sizeof(arr));

  for(byte i=0;i<20;i++)
  {
    arr[i]=0x1;
    OutFrame(arr,30);
    arr[i]=0;
//   delay(200);
 //  arr[i]=0xff;
 //   OutFrame(arr,sizeof(arr));
 //   arr[i]=0;
   delay(200);
   }
//   delay(1000);
 
}


 

Logik
Offline
Зарегистрирован: 05.08.2014

jeka_tm пишет:

...только на ws2811.но это вроде практически одно и тоже

Там тайминги обмена по спеке немного другие вроде. Но шанс  что код о тws2812b пойдет и на 2811 высокий.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

тайминги сильно отличаются, в остальном одинаковые

Logik
Offline
Зарегистрирован: 05.08.2014

jeka_tm пишет:

тайминги сильно отличаются, в остальном одинаковые

глянул. согласен. сильней чем хотелось бы.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверил вчера WS2811. китайцы перепутали пины для светодиодов. и получилось не RGB, а RBG. да еще к тому же яркость красного страдает по сравнению с синим и зеленым, если подать 255 красного и 255 синего получится не фиолетовый, а синий с отттенком фиолетового. фиолетовый получился 255 и 70 для красного и синего

делаю плату контроллера ленты для цветомузыки, вот думаю по uart его программировать или по spi. выглядят почти одинаково

Logik
Offline
Зарегистрирован: 05.08.2014

jeka_tm пишет:

проверил вчера WS2811. китайцы перепутали пины для светодиодов. и получилось не RGB, а RBG. да еще к тому же яркость красного страдает по сравнению с синим и зеленым, если подать 255 красного и 255 синего получится не фиолетовый, а синий с отттенком фиолетового. фиолетовый получился 255 и 70 для красного и синего

Китайцы, они такие )))

jeka_tm пишет:

вот думаю по uart его программировать или по spi. выглядят почти одинаково

В смысле с ардуины на WS2811? Почти одинаково плохо, что uart и spi. Прикидывал и туда и туда - без толку, криво выходит. Сделал как выложил.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ты меня не понял

Logik
Offline
Зарегистрирован: 05.08.2014

Это не страшно. Настоящий художник редко бывает понятым при жизни, зато потом... )))

arduinec
Offline
Зарегистрирован: 01.09.2015

Бегущая строка на лентах с чипом WS2812:
https://yadi.sk/i/KjPlzioNjskYL
https://yadi.sk/i/RzuRDpZkkK32s

 

Logik
Offline
Зарегистрирован: 05.08.2014

Интересно, зачем разбито на 4 группы. Должно и одной хватать.

По поводу развития проекта, на данный момент добавлено ИК ДУ, рефакторил код, теперь каждый эффект - отдельный класс. Всего около 15 эффектов. Создается объект динамически,  перед использованием, освобождается после завершеня работы. Порядок создания описывается в сценарии. Отдельный класс рулит проигрыванием сценария. Добавил ещё кусок ленты, теперь 60 светодиодов. 

arduinec
Offline
Зарегистрирован: 01.09.2015

Logik пишет:

Интересно, зачем разбито на 4 группы. Должно и одной хватать.

Если этот вопрос про моё видео, то там разбито на 8 групп для "написания бегущей строки". Но все эти группы соединены последовательно (всего получается 480 светодиодов) и управляются по одному проводу с любого дата-выхода Arduino Uno-Nano (4 провода справа лишь дают питание для ленты).

Скорости Arduino достаточно и для бОльшего количества светодиододов, но после 750 штук в Arduino Uno-Nano начинает не хватать оперативной памяти.

arduinec
Offline
Зарегистрирован: 01.09.2015

Logik пишет:

По поводу развития проекта, на данный момент добавлено ИК ДУ, рефакторил код, теперь каждый эффект - отдельный класс. Всего около 15 эффектов. Создается объект динамически,  перед использованием, освобождается после завершеня работы. Порядок создания описывается в сценарии. Отдельный класс рулит проигрыванием сценария. Добавил ещё кусок ленты, теперь 60 светодиодов. 

Есть контроллеры для лент, содержащих до 4096 светодиодов (такие тоже программировал). Управляются с помошью пульта, эффекты записываются на SD-карту.

https://yadi.sk/i/AfZs-kOakK35f

Arduino стоит в несколько раз дешевле.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я свою "гирлянду" сделал так: http://we.easyelectronics.ru/kisoft/novogodniy-svetilnik.html

В статье кратко всё описано. Arduino Pro Mini, библиотека FastLED, пример: DemoReel100. Заводится всё с полпинка, никаких проблем нет.

 

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Здесь еще не делился )))


 

https://youtu.be/Ik9OiUAzEwQ

https://youtu.be/q_2Rpf_zCLY

https://youtu.be/TbLRVuPGzKE

http://samopal.pro/snowflake2/

Корпус - акрил, лазерная резка. Контроллер Arduino Pro Mini на Atmega168

Лента WS2812B 60LED/m. На одну снежинку 0.5м

ВСЕХ С НОВМ ГОДОМ!

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

...и вас с наступающим)

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если вдруг кому понадобится, я для Saleae Logic плагин сделал, для расшифровки протокола WS2812b. В статье всё описано, ссылка на проект на github, dll для 32 и 64 бит, всё здесь. Я свой модуль на STM32 погонял, времянки посмотрел. Можно и на Ардуине посмотреть.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

прикольно. тяжело такой плагин писать?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Мне было не сложно. Да и протокол простой.
Если есть готовый алгоритм на С++ реализованный, то совсем хорошо. Хотя здесь я почти все сам делал, так, подглядывал некоторые места.
Да и у них 24 протокола уже готовых, до фига.

Logik
Offline
Зарегистрирован: 05.08.2014

По вопросам о проекте немного актуализирую. Реализовал эффекты используя ООП.

Концептуально так, есть класс сценария реализующий процесс выполнения последовательности эффектов.

class TScenariy
{
  TEffect* Efect;
  byte Phaze;
  byte Max;
  boolean RunSc;
  byte* EffArray;

  COLOR sid_[NumberLED];
  
  TEffect* GetNextEffect();
  TEffect* CreateEffect(byte n);
  
  public:
  TEffect* GetEffect();
  void Run(byte* n, byte m);  
  void Run(byte n);
  byte ProcessEffect(long dT);
  void ProcessEnd(boolean Clr);
  private:
NewEffect(TEffect* e=NULL);
} Scn;

Два Run позволяют запустить единичный эффект и выполнить описание сценария из заданого кол-ва эффектов заданое массивом их идентификаторов.

Эффекты являются наследниками от

class TEffect
{
 protected: 
  COLOR* sid;
  byte Takt;
 public:
 void Init(COLOR* c){sid=c;};
  virtual void Start(void);
  virtual byte process(void);
  virtual byte Pause(void){return 20;};
};

 

Тут все помоему предельно ясно. Эффекты создаются динамически и существуют (а значить и отедают ОЗУ) только во время его активности.

Пример эффекта

class TPhase:public TEffect
{
 public:
  void Start(void)
  {
  Takt = 0;
  memset(sid,0,NumberLED*3);
  sid[0].RED=0xff;
  sid[1].GREEN=0xff;
  sid[2].BLUE=0xff;
  };
  
  byte process(void)
  {
  if(!Takt)
  {
     memset(sid,0,NumberLED*3);
     ((byte*)sid)[Takt]=0xff;
     Takt++;
     return 1;
  } 
  ((byte*)sid)[Takt-1]=3;
  Takt++;
  if(Takt==NumberLED*3) return 2;
  ((byte*)sid)[Takt]=0xff;
  return 1;
  };
  
  byte Pause(void)
  {
    if(!Takt) return 1000;
    return 10;
  };
};

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Logik пишет:

По вопросам о проекте немного актуализирую.

Уважаемый Logik, а можно на Ваш проект полностью взглянуть, а то новый год на носу, да и мне как раз две ленточки приехали. играюсь сейчас. Или это закрытая вечеринка?

arduino328
Offline
Зарегистрирован: 01.09.2016

Mr.Privet пишет:

новый год на носу, да и мне как раз две ленточки приехали. играюсь сейчас

Есть библиотека Adafruit_NeoPixel, которая такими лентами может управлять. Но на Arduino Uno/Nano с ней более 500 светодидов не подключишь.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

arduino328 пишет:

Mr.Privet пишет:

новый год на носу, да и мне как раз две ленточки приехали. играюсь сейчас

Есть библиотека Adafruit_NeoPixel, которая такими лентами может управлять. Но на Arduino Uno/Nano с ней более 500 светодидов не подключишь.


Да, ей я уже балуюсь, меня интересуют наработки Logic'а, так как больше интересны эффекты через класс. Из тех кусочков что он дал понять ничего не могу, все же когда есть целый проект как то понятнее

arduino328
Offline
Зарегистрирован: 01.09.2016

Mr.Privet пишет:

меня интересуют наработки Logic'а, так как больше интересны эффекты через класс. Из тех кусочков что он дал понять ничего не могу, все же когда есть целый проект как то понятнее

Судя по скетчу из поста 6, написанному кривыми руками и плохо оформленному, проекта у Логика нет.

Logik
Offline
Зарегистрирован: 05.08.2014

Mr.Privet пишет:

Logik пишет:

По вопросам о проекте немного актуализирую.

Уважаемый Logik, а можно на Ваш проект полностью взглянуть, а то новый год на носу, да и мне как раз две ленточки приехали. играюсь сейчас. Или это закрытая вечеринка?

В честь приближающегося НГ заглянул сюда и пожалуй скетч выложу "как есть". Вечеринка не закрытая, просто особого интереса ни у кого не вызвала, соответственно нет и мотивации выкладывать код.

По коду. Эффекты вынесены в отдельный модуль, его я не публикую, ожидаю инициативы сообщества ;) Выше есть пример одного эффекта, думаю его достаточно дабы не давлеть над фантазией других. Соответственно упоминания в строках около 190 других эффектов надо коментировать. А свич этот надо будет мне "соптимизировать" в фабрику классов, прямо сейчас не буду, "работает - не трогай". Опять же код для работы с ИК пультом вынесен в отдельный модуль, специфичен для  конкретного пульта. Думаю для желающих разобратся информации предостаточно. Код больше года работает ежевечерно (как вечерний источник света вкомнате) и стабильно, последная доработка - сохранение режима в ЕЕПРОМ и восстановление после включения тоже протестировалась эксплуатацией. Планы на будущее - сделать регулировку яркости для всех эффектов и добавлять новые эффекты.

 

#include <IK_RC.h>
#include "EEPROM.h"
#include "Color.h"

#ifndef cbi
#define cbi(sfr, bit) (sfr &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif 

#define  ARDUINO_PORT(a)        ((a<8)?PORTD:(a<14?PORTB:PORTC))
#define  ARDUINO_PIN(a)           ((a<8)?PIND:(a<14?PINB:PINC))
#define  ARDUINO_DDR(a)          ((a<8)?DDRD:(a<14?DDRB:DDRC))
#define  ARDUINO_PIN_NUM(a)  ((a<8)?a:(a<14?(a-8):(a-14))) 

#define LED_PIN A5
#define LED_PIN_NUM   ARDUINO_PIN_NUM(LED_PIN)
#define LED_PORT      ARDUINO_PORT(LED_PIN)



#define PIN_IR 8
#define PIN_IR_GND 6
#define PIN_IR_VCC 7

COLOR CurrColor;
IRC_NEC_PROTOCOL(PIN_IR, IR);

unsigned long Tpred;

byte Command;
byte RepCommand;
byte OldCommand;

#include "Effect.h"

byte E1[]={1,2,3,4,5,6,8,9};

extern "C" {
__attribute__ ((noinline)) 
void OutFrame(COLOR* buf, word len)
{
asm volatile (
     "push r24 \n\t"
     "push r25 \n\t"
     "push r26 \n\t"
     "push r27 \n\t"
     "push r28 \n\t"
     "push r29 \n\t"

     "movw r28, %[ptr]  \n\t" //загрузка Y
     "movw r26, %[L]  \n\t"
     
     "add  r26,r28 \n\t"
     "adc  r27,r29 \n\t"
     "cli \n\t"
 //  вывод первого бита 
"aa:           ld   r24, Y+  \n\t" //инициализация отправки первого байта
              "ldi r25, 8 \n\t"

 
"bb:           sbi	%[PP], %[pin] \n\t"       //1 цикл линию в высокий уровень
        "nop \n\t"     
        "nop \n\t"     
                 "sbrs	r24, 7 \n\t"       //проверка бита и скачек на +2
                 "cbi	%[PP], %[pin] \n\t"       //0,375us линию в низкий уровень
                 "lsl r24 \n\t"         //1 цикл сдвиг в лево
        "nop \n\t"     
        "nop \n\t"     
                 "cbi	%[PP], %[pin] \n\t"       //1 цикл 0,5us линию в низкий уровень
        "nop \n\t"     
        "nop \n\t"     
                  "dec r25  \n\t"         //1 цикл
                 "brne bb  \n\t"      // 1 цикл без перехода и 2 с переходом
                 
//байт выведен проверяем завершение и переходим к следующему

                 "cpse r28, r26 \n\t"    //1 цикл  проверка Y на конец массива 
                 "rjmp aa \n\t"      //2 цикла
                 "cpse r29, r27 \n\t"    //1 цикл  проверка Y на конец массива 
                 "rjmp aa \n\t"      //2 цикла
     "sei \n\t"
     "pop r29 \n\t"
     "pop r28 \n\t"
     "pop r27 \n\t"
     "pop r26 \n\t"
     "pop r25 \n\t"
     "pop r24 \n\t"

                 : 
                 :[ptr] "r" (buf) ,
                  [L] "r" (len), 
                  [PP] "I" (_SFR_IO_ADDR(LED_PORT)),
                  [pin] "I" (LED_PIN_NUM)
     );

   }
}


class TScenariy
{
  TEffect* Efect;
  byte Phaze;
  byte Max;
  boolean RunSc;
  byte* EffArray;

  COLOR sid_[NumberLED];
  
  TEffect* GetNextEffect();
  TEffect* CreateEffect(byte n);
  
  public:
    TEffect* GetEffect();
    void Run(byte* n, byte m);  
    void Run(byte n);
    byte ProcessEffect(long dT);
    void ProcessEnd(boolean Clr);
  private:
    void NewEffect(TEffect* e=NULL);
} Scn;




byte TScenariy::ProcessEffect(long dT)
{

  if((!Efect) || (!RunSc) || (Efect->Pause()>dT)) return 0;

  byte r=Efect->process();   
  switch(r)
  {
      case 0:break;
   case 3:ProcessEnd(false);break;
   case 1:  //сформирован очередной кадр эффекта
     OutFrame(sid_,sizeof(sid_));break;
   case 2: //исполнение эффекта успешно завершено, переходим к следующему
     ProcessEnd(true);NewEffect();break;
  }
 return  r;
}

void TScenariy::ProcessEnd(boolean Clr)
{
  if(!EffArray) //эффект один идет по кругу без очистки
  {
     OutFrame(sid_,sizeof(sid_));
     return;
  }
  
 if (Clr)
  {
    memset(sid_,0,sizeof(sid_));
  }
  OutFrame(sid_,sizeof(sid_));
  RunSc=false;
   if(Efect)
    delete Efect;

  Efect = NULL;
}


void TScenariy::NewEffect(TEffect* e)
{
  if(e)
   Efect=e;
  else 
   Efect=Scn.GetNextEffect();
  Efect->Start();
  OutFrame(sid_,sizeof(sid_));
  RunSc=true;
}

TEffect* TScenariy::GetEffect()
{
  return Efect;
}

TEffect* TScenariy::CreateEffect(byte n)
{
  TEffect* e;
  switch(n)
  {
    case 1:e=new TWhiteGo;break;
    case 2:e=new TPhase;break;
    case 3:e=new TEffect1;break;
    case 4:e=new TEffect2;break;
    case 5:e=new TEffect3;break;
    case 6:e=new TEffect4;break;
    case 7:e=new TStaticColor;break;
    case 8:e=new TPereliv;break;
    case 9:e=new TPerelivSoft;break;
  }
  e->Init(sid_);
  return e;
}

TEffect* TScenariy::GetNextEffect()
{
  if(!EffArray) return Efect;
  TEffect* e=CreateEffect(EffArray[Phaze]);
  Phaze++;
  if (Phaze>=Max)
    Phaze=0;
  return e;
}

void TScenariy::Run(byte n)
{
  Phaze=0;
  EffArray = NULL;
  ProcessEnd(false);
  Max=1;
  NewEffect(CreateEffect(n));
}

void TScenariy::Run(byte* n, byte m)
{
  Phaze=0;
  EffArray = n;
  ProcessEnd(false);
  Max=m;
  NewEffect();
}

byte Vol;
byte NumEff;

//адреса в ЕЕПРОМ
#define ADR_CMD     0
#define ADR_VOL     1
#define ADR_NUM_EFF 2

// the setup routine runs once when you press reset:
void setup() 
{
  pinMode(LED_PIN, OUTPUT); 
  
  pinMode(PIN_IR_GND,  OUTPUT);
  pinMode(PIN_IR_VCC,  OUTPUT);
  digitalWrite(PIN_IR_GND, LOW);
  digitalWrite(PIN_IR_VCC, HIGH);


  pinMode(PIN_IR,  INPUT);
  
  Serial.begin(115200);
  
  Tpred=millis();

  COLOR sid[NumberLED];
  memset(sid,0,sizeof(sid));
  
  for(byte r=10;r;r--)
  {
    for(int i=0;i<sizeof(sid);i++)
    {
       ((byte*)sid)[i]=_BV(random(7)); 
    }
    OutFrame(sid,sizeof(sid));

    delay(50);
  }
  memset(sid,0,sizeof(sid));
  OutFrame(sid,sizeof(sid));

  Command=EEPROM.read(ADR_CMD);
  if(Command==0xff)
    Command=0;
    
  Vol=EEPROM.read(ADR_VOL);
  if(Vol>8)
    Vol=8;
    
  NumEff=EEPROM.read(ADR_NUM_EFF);
  if (NumEff>=10) 
  NumEff=0; 
  
 RepCommand=0;
 Scn.Run(E1,8);


}  



void loop()
{
  long T= millis();
  
  if(Scn.ProcessEffect(T-Tpred))
    Tpred=T;

 do 
 { 
    /* Прием команд от ИК пульта управления и выполнение их */
  switch (IR.Decode())
    {
        /* Принят сигнал повтора предыдущей команды */
      case 5:
//        Serial.write("rep\n"); 
          Command=RepCommand;
        break;
      case 1:
       /* Принята команда */
        /* выполняем команды от ИК пульта */
        if(!(IR.Result>>8)) 
        {
           Command=IR.Result;
           RepCommand=Command;
        }
        break;

    }
 } while (IR.IsRecive());
 

  switch(Command)
  {
   case 0:break;
   case 0xa0: ColorVolume(true);EEPROM.write(ADR_VOL,Vol);break; //Up
   case 0x20: ColorVolume(false);EEPROM.write(ADR_VOL,Vol);break;//Done
   case 0x60: EEPROM.write(ADR_CMD,Command);CurrColor=BLACK;SetStaticColor();break;//off
   case 0x90: EEPROM.write(ADR_CMD,Command);CicleColor(ID_RED);SetStaticColor();break;
   case 0x10: EEPROM.write(ADR_CMD,Command);CicleColor(ID_GREEN);SetStaticColor();break;
   case 0x50: EEPROM.write(ADR_CMD,Command);CicleColor(ID_BLUE);SetStaticColor();break;
 //  case 0xD0: CurrColor=WHITE;SetStaticColor();break;
   case 0xD0:  
              EEPROM.write(ADR_NUM_EFF,NumEff);
              EEPROM.write(ADR_CMD,Command);
              NumEff++;
              if (NumEff>=10) NumEff=1; 
              Scn.Run(NumEff);
              Command=0;
              break;
    default:   Scn.Run(E1,8); Command=0;

  }

}

void CicleColor(byte n)
{
  byte a=ID_RED;
  byte b=ID_BLUE;
  byte Command2;
  byte* p=(byte*)&CurrColor;
  
  switch (n)
  {
   case ID_RED  : a=ID_GREEN;Command2=0x90;break;
   case ID_BLUE : b=ID_GREEN;Command2=0x50;break;
   case ID_GREEN: Command2=0x10;break;
         default: return; 
  }
  
  if(OldCommand!=Command2)
  {
    p[a]=0;p[b]=0; 
  }
  else
  {
    if(!p[a])
    { 
      if(p[b])
        p[b]=0;
      else
        {p[b]=0; p[a]=0xff;}
    }
    else
      {p[a]=0; p[b]=0xff;}
  } 
  
  p[n]=0xff;
}

void SetStaticColor(void)
{
  COLOR c;
  c.RED=CurrColor.RED >>(7-Vol);
  c.GREEN=CurrColor.GREEN >>(7-Vol);
  c.BLUE=CurrColor.BLUE >>(7-Vol);
  Scn.Run(7);
  ((TStaticColor*)Scn.GetEffect())->SetColor(c);
  OldCommand=Command;
  Command=0;
}

void ColorVolume(boolean up)
{
  
  if(up)
   {
    if (Vol<7) Vol++; 
   }
   else
   {
     if(Vol)Vol--;
   }
  
  SetStaticColor();
}

Модуль цвета - совсем прост.

#include <Arduino.h>

struct COLOR {
 byte GREEN;     
 byte RED;   
 byte BLUE;   
};

const byte ID_GREEN = 0;
const byte ID_RED   = 1;
const byte ID_BLUE  = 2;

static COLOR RED=  {0,    0xff, 0};
static COLOR GREEN={0xff, 0,    0};
static COLOR BLUE= {0,    0,    0xff};
static COLOR WHITE={0xff, 0xff, 0xff};
static COLOR BLACK={0, 0, 0};

 

Nikolaj666
Offline
Зарегистрирован: 19.01.2017

приветствую. а где качнуть библиотеку IK_RC.h ? не могу найти

Nikolaj666
Offline
Зарегистрирован: 19.01.2017

.мучаю вот такую штуку.

http://youtu.be/o1ZzlB7H2vw

http://youtu.be/utuPUulELwE 

 

Logik
Offline
Зарегистрирован: 05.08.2014

Nikolaj666 пишет:

приветствую. а где качнуть библиотеку IK_RC.h ? не могу найти

Это точно.  Гарантировано не найдете. Она только моя, под конкретный пульт писана. Я её конечно могу выложить, но тогда у Вас будет следующая проблема - где найти такой пульт ))) А тут я врядли чем помогу.

Logik
Offline
Зарегистрирован: 05.08.2014

Nikolaj666 пишет:

.мучаю вот такую штуку.

http://youtu.be/o1ZzlB7H2vw

http://youtu.be/utuPUulELwE 

 

Красиво. А сеолько там светодиодов?

Nikolaj666
Offline
Зарегистрирован: 19.01.2017

 

28 пластин по 9 лед. 252 штуки. габарит светильника 170х350мм

Logik
Offline
Зарегистрирован: 05.08.2014

На вид не скажеш что всего 9. Там наверно зеркальные отражатели стоят.

Nikolaj666
Offline
Зарегистрирован: 19.01.2017

Logik пишет:

На вид не скажеш что всего 9. Там наверно зеркальные отражатели стоят.

как-то  так. без отражателей и колдовства

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Nikolaj666 пишет:

Logik пишет:

На вид не скажеш что всего 9. Там наверно зеркальные отражатели стоят.

как-то  так. без отражателей и колдовства


Блин в тетрис можно играть)

Nikolaj666
Offline
Зарегистрирован: 19.01.2017

Mr.Privet. можно видео с экрана захватывать если пикселей плотнее набить

romster
Offline
Зарегистрирован: 15.04.2013

данно: mega2560 + ws2812b(6ОО диодов) + glediator

Всем привет, собирая матрицу 30х20 из ws2812b, столкнулся с такой проблемой, последние 2-3 модуля (лэд молули 10х10, всего 6 модулей, 2 ряда по 3 модуля) выдают артифакты, причем не стабильно, в какие-то моменты все работает. Когда в glediator уменьшаешь яркость примерно до 30%, модули начинают мельтишить либо цвета подменяются.

конденсторы (2200мкф) припаивал только ко входу модулей лэд, в даташите конечно написано по 0,1мкф на каждый светляк, но после того, как я припаял 6ОО светодиодов обретя неописуемое удовольствие, повторять содеяное очень серьезный шаг.

Короче кто сталкивался с такой проблемой, отпишитесь плизз

sadman41
Онлайн
Зарегистрирован: 19.10.2016

romster пишет:

Всем привет, собирая матрицу 30х20 из ws2812b, столкнулся с такой проблемой, последние 2-3 модуля (лэд молули 10х10, всего 6 модулей, 2 ряда по 3 модуля) выдают артифакты, причем не стабильно, в какие-то моменты все работает. 

Могу предположить, что проблемы начинаются, когда большинство диодов светит ярче и жрет больше. Запитывали не с одной стороны, надеюсь... 

А может и тупо ослабляется сигнал на пяти сотнях чипов и последние уже то ловят, то не ловят. Питание просело - не ловят.

romster пишет:

Когда в glediator уменьшаешь яркость примерно до 30%, модули начинают мельтишить либо цвета подменяются.

У меня на гирлянде с ws2801 такая же фигня. Не при всякой яркости ШИМ работает, как хочется, видно мерцание. И цвета на разных яркостях смешиваются по разному. 

vis22
Offline
Зарегистрирован: 24.10.2015

Не моя, но очень крутая цветомузыка на ws8112.

Описание, схемы, скетч и видео работы: 

https://mysku.ru/blog/diy/58060.html

https://mysku.ru/blog/diy/57947.html

 

Logik
Offline
Зарегистрирован: 05.08.2014

Буквально на днях подумал, а не прицепить ли микрофон и добавить цветомузыку ))) то, что на видео мне не понравилось. Идея там проста - частотный диапазон вдоль ленты разложен и цвет привязан к позиции на ленте жестко. Получается при активности одной из полос частот всегда светится небольшой кусок ленты соответствующего цвета. Примитив. Второй и третий варианты - все также, только несколько радуг рядом или 2 зеркально.  А наличие ПК в схеме просто убивает идею. Подумаю еще пока, может вдоль ленты пустить бегущий от центра цвет, а цвет центра определяется частотой и яркость амплитудой. Может так сделаю.

 

Проблемы при большом числе диодов - от плохого питания. Запитуйте с 2-х  концев и с подпиткой в промежутках. Ваши 600 диодов жрут огромный ток, причем чем ярче светят, тем больше жрут. Потому так.

romster
Offline
Зарегистрирован: 15.04.2013

sadman41 пишет:

Когда в glediator уменьшаешь яркость примерно до 30%, модули начинают мельтишить либо цвета подменяются.

У меня на гирлянде с ws2801 такая же фигня. Не при всякой яркости ШИМ работает, как хочется, видно мерцание. И цвета на разных яркостях смешиваются по разному. 

[/quote]

Буду сегодня пробовать подпаять керамику.

romster
Offline
Зарегистрирован: 15.04.2013

Logik пишет:

Буквально на днях подумал, а не прицепить ли микрофон и добавить цветомузыку ))) то, что на видео мне не понравилось. Идея там проста - частотный диапазон вдоль ленты разложен и цвет привязан к позиции на ленте жестко. Получается при активности одной из полос частот всегда светится небольшой кусок ленты соответствующего цвета. Примитив. Второй и третий варианты - все также, только несколько радуг рядом или 2 зеркально.  А наличие ПК в схеме просто убивает идею. Подумаю еще пока, может вдоль ленты пустить бегущий от центра цвет, а цвет центра определяется частотой и яркость амплитудой. Может так сделаю.

 

Проблемы при большом числе диодов - от плохого питания. Запитуйте с 2-х  концев и с подпиткой в промежутках. Ваши 600 диодов жрут огромный ток, причем чем ярче светят, тем больше жрут. Потому так.

1. Полностью с вами согласен про про отсутствие полноценной цветовой динамики у шакафа купэ ))) автор думаю допилит цветомузыку, да и идея с заменой ПК на микросхему специализированную, тоже перспективная.

2. про 6ОО диодов, конечно, я запитал каждый модуль лэд панельки параллельно от БП, всеж думаю надо шунтировать керамикой, благо на плате я развел дорожки и под них, но впаивать не стал.

Logik
Offline
Зарегистрирован: 05.08.2014

А зачем специализированая микросхема? Ардуино справится. БПФ по 64 точкам должно хватить вполне. Можна и больше, но не требуется вроде. Раз в 50мсек набрать 64 отсчета (при дискретизации 10КГц получим 6,4мсек), засунуть в ленту (пусть 500 светодиодов, значить 12мсек)   посчитать БПФ за 50-6,4-12=31,6мсек  вполне реально. Здесь microsin.net/programming/avr/real-time-digital-audio-processing-using-arduino.html   судя по последнему графику за 25мсек считается. Значить еще порядка 6мсек на фильтры, эффекты и прочую лабудень останется.

romster
Offline
Зарегистрирован: 15.04.2013

умная статья ))

надо будет потом тоже забабахать, только после этого проекта.

А мне нужно glediatorom выводить анимацию на матрицу диодов, кстати есть замечание, коврик или как его, ромбик выводится полностью без артифактов, как и переливание всеми цветами радуги, а вот сильно динамичные сцены глючат.

romster
Offline
Зарегистрирован: 15.04.2013

sadman41 пишет:

romster пишет:

Когда в glediator уменьшаешь яркость примерно до 30%, модули начинают мельтишить либо цвета подменяются.

У меня на гирлянде с ws2801 такая же фигня. Не при всякой яркости ШИМ работает, как хочется, видно мерцание. И цвета на разных яркостях смешиваются по разному. 

а сколько светодиодов в гирлянде было ? и у вас ведь там конденсаторы припаяны у каждого светляка ?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

romster пишет:

а сколько светодиодов в гирлянде было ? и у вас ведь там конденсаторы припаяны у каждого светляка ?

Два страйпа по 50 шт. Вышеописанный эффект наблюдается даже при одном подключенном. БП с хорошим запасом - 5A что ли... Насчет кондеров не припомню, могу вечером поразглядывать. Но, мне кажется, что к ШИМ-у они никакого отношения не имеют. Учитывается ли в чипе компенсация визуальной силы какого-либо "цвета" (красный ярче синего при равных условиях) - сложно сказать, в даташите я что-то не нашёл такого (хотя сильно и не вчитывался). На елке эти дефекты не привлекают внимания. Разве что мерцание раздражает, но алкоголь и оливье купируют негативные впечатления ))

romster
Offline
Зарегистрирован: 15.04.2013

у меня 100 диодная матрица тоже не подавала ни каких признаков отклонений от нормальной работы, ведь я каждую матрицу тестировал после припаивания диодов, а вот когда включил все вместе, то наблюдаются артифакты где-то с 3-4 и до последней (6-й матрицы).

А может репиттеры какие ставить на сигнальную линию ?

romster
Offline
Зарегистрирован: 15.04.2013

удалить