Jump to content
serenbkii

Светодиоды 5050 Rgb С Интегрированным Чипом Ws2811

Recommended Posts

Здравствуйте товарищи! Недавно появились такие светодиоды, которые позволяют выстроить из себя длинную цепочку с возможностью адресации к конкретному светодиоду для передачи им параметров свечения (видеоэкраны, бегущие строки и т. д.). Передача данных осуществляется по однопроводному интерфейсу. Вот даташит на данную микросхему http://auschristmaslighting.com/wiki_source/images/b/ba/WS2811.pdf. Кто- нибудь сталкивался с ними? Есть предложения как их скооперировать с AVR?ws2812-5050-RGB-LED.jpg

Share this post


Link to post
Share on other sites

А чего их кооперировать то? "Подключил и рули". В датащите всё написано и даже кое-где нарисовано, или у Вас трудности с переводом?

Share this post


Link to post
Share on other sites

Вобщем то тема меня заинтересовала, по этому чуток сам почитал. Общий вид такой:

Все микросхемы соединяются в цепочку таким образом:

МК -> DI.LED_1.DO -> DI.LED_2.DO -> ........ -> DI.LED_n.DO -> в воздух

Микросхема начинает принимать данные в размере 24 бит (по 8 бит на каждую компоненту, короче RGB), как только придут 24 первых бита с DI - микросхема их запоминает, и все последующие передачи данных с DI перекидывает на DO (с усилением), т.е. становится прозрачной для сигнала. Поскольку у нас микросхемы включены в цепь друг за другом - первые 24 бита зафиксирует первая микросхема, сделующие 24 бита первая микросхема передаст на DO - они попадут во вторую микру, потом третьи 24 бита пройдут через первую и вторую микросхему (т.к. обе они уже зафиксировали данные) и попадут в третью. Соответственно чтобы снабдить данными всю цепь, нужно передать весь массив полностью. Т.е. общее число бит 24 умноженное на число микросхем (светодиодов) в цепи. Своего рода стек получается. Пока происходит вот такая последовательная загрузка данных, состояние выводов для светодиодов у микросхемы никак не изменяется - т.е. светодиоды светят тем же цветом, как светили до этого... (ну или не светят, если не светили до этого)

После того, как данные полностью загружены во все микросхемы цепи, нужно подать сигнал RESET (на DI имеется ввиду) - тогда все микросхемы одновременно применят загруженные новые настройки и вернутся в исходное состояние - т.е. будут ждать очередной последовательности 24 бит... т.е. в цепь можно будет загружать новые последовательности.

Соответственно такая цепочечная конструкция не имеет адресации, и чтобы добраться например до последней микросхемы (светодиода) - придётся передать корректные данные для всего массива. Т.е. в МК где то должен быть буфер, дублирующий RGB данные по всем светодиодам, и соответственно этот самый буфер должен подаваться на DI. Размер буфера разумеется развен трём байтам, умноженным на число микросхем(светодиодов).

Как следствие цепочку можно делать бесконечной (т.к. сигнал, проходящий сквозь микросхемы получает усиление). Разумеется данная бесконечность ограничена мощностью блока питания и временем, необходимым для передачи полного пакета. Очевидно, что при большом числе светодиодов пакеты будут довольно длинными и соответственно возможная скорость "проигрывания анимации" будет уменьшаться.

Ещё есть подозрения, что можно включать не только одной цепочкой, но и делать развилки - тогда параллельные ветви будут себя вести идентично, т.к. в них при разветвлении будут попадать одни и те же соответствующие 24-бита.

============================================================================

Осталось только разобрать, как выглядит сигнал на физическом чтоле уровне:

Судя по датащиту для передачи бита нужно по очереди изобразить пару "высокий уровень"->"низкий уровень". Именуются они T0H,Т1H и T0L и Т1L соответственно. Для кодировки бита вот так получается (см датащит):

Передача "0" T0H -> Т0L (длительность высокого уровня 0.5 микросекунд, длительность низкого - 2 микросекунды)

Передача "1" T1H -> Т1L (длительность высокого уровня 1.2 микросекунды, длительность низкого - 1.3 микросекунды)

(отклонение от указанного времени не более 150 наносекнуд)

Передача "сброс" - удержание низкого уровня в течение более чем 50 микросекунд

Эти временные параметры указаны для режима Low speed mode time. Выбор режима осуществляется выводом SET, который в датащите на микру есть, а вот на гибриде со светодиодом не видать. Можно предположить, что он там по умолчанию...

Вероятно пока на DI цепи высокий уровень - можно считать, что система находится в "состоянии покоя", светодиоды светят (ну или не светят),и никто ничего не передаёт.

Но с другой стороны есть подозрения, как бы не оказалось, что нужно постоянно осуществлять передачу данных, т.е. постоянный трафик по цепи - ибо лично не могу понять, как микросхема определяет, что началась передача данных.... тем более в ДШ написано, что как только оно запускается, якобы сразу начинает приём данных. Момент щекотливый и непонятный (мне), я бы разбирался опытным путём. Вариаций не так много....

С неясностями разобрались ниже :)

Фуф, чёт понаписал... :heat:

Edited by tcoder

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

Вероятно пока на DI цепи высокий уровень - можно считать, что система находится в "состоянии покоя", светодиоды светят (ну или не светят),и никто ничего не передаёт.

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

каждый бит имеет длительность 2.5мкс , начало бита определяется как нарастающий фронт, считывание бита происходит на 1,5мкс , пауза более 50мкс (сброс линии) воспринимается как окончание передачи, и подготовка к приему следующей посылки...

только мне катцо авир не потянет эту штуку по скорости... или нет?

Share this post


Link to post
Share on other sites

каждый бит имеет длительность 2.5мкс , начало бита определяется как нарастающий фронт, считывание бита происходит на 1,5мкс , пауза более 50мкс (сброс линии) воспринимается как окончание передачи, и подготовка к приему следующей посылки...

Т.е. получается, что линия в "состоянии покоя" - находится в низком уровне. Появление фронта является сигналом к тому, чтобы через 1.5мкс принять конкретное стабильное значение бита, и вся передача данных заключается в положении спада до или после отметки фронт+1.5мкс в заданых пределах. А последующее "состояние покоя" после целой пачки битов будет являться продолжением низкого уровня последнего переданного бита, который за одно продержавшись 50мкс+ активизирует сброс всей цепи. Теперь понятно окончательно.

**Только считывание судя по датащиту наверно пораньше происходит чем 1.5мкс, т.к. длительность высокого уровня (параметр T1H) для передачи единицы указано 1.2мкс, значит считывание происходит раньше чем фронт+1.2мкс...

только мне катцо авир не потянет эту штуку по скорости... или нет?

А вот кстати я об этом не подумал тоже :) На вскидку (если не вдаваться в расчёты) вроде бы на 20МГц можно эту задачу решить впритык, ну и вроде были AVR с большей допустимой частотой... (честно говоря не осведомлён, какие AVR бывают, т.к. их не практикую)

Edited by tcoder

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

А slowpoke mode, я так понимаю, в 2801 был, а из 2811 убрали? Расстроился я недостаточностью авр, не успел их изучить, а они уже с моими задачами не справляются. Увы и ах, что мне теперь на arm переходить?

Share this post


Link to post
Share on other sites

Нужный сигнал управления можно получить из сигнала SCK SPI, запуская им таймер, длительность импульса которого управляется сигналом MOSI SPI.

Возможно, хватит какой-нибудь RC-цепочки с триггером Шмитта.

И еще я заметил, длительности сигналов WS2811 (ДИП8) и WS2812 (6 pin, со встроенными светодиодами), если верить даташитам, разные.

Edited by Константин Ы

Share this post


Link to post
Share on other sites

Нужный сигнал управления можно получить из сигнала SCK SPI, запуская им таймер, длительность импульса которого управляется сигналом MOSI SPI.

Не заработало, как надо. Лампочки хаотично зажигаются. Подозреваю, что из-за разной длительности пауз между посылками SPI.

Программный способ для Ардуино - есть бибилиотека https://github.com/a...afruit_NeoPixel .

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

Edited by Константин Ы

Share this post


Link to post
Share on other sites

получилось у кого нибудь запустить на меге? или на STM32, у меня с stm32 пака совсем туго, нашел только один пример но так и не смог его запустить.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Dillashow
      Доброго дня, друзья! У меня две матрицы Cree CXA 3050. Есть драйвер 36 вольт и 3 ампера. Но, так же без дела лежат 6 матриц Cree CXA 1507.
      Вот значит в чём дело, у этих матриц одинаковое падение напряжения, но потребление тока разное. Хочу разделить параллельным подключением каждую матрицу 3050(выходит один ампер на каждую из 2х) и группу матриц 1507(166mA ампер на каждую из 6).
      Как сделать? Не кидайте камнями, я в электронике полный 0. Надеюсь все популярно объяснил. Спасибо.
    • By Дмитрий Шилин
      Здравствуйте, мужчины есть идея прикрепить Rgb ленту по контуру доски через блютуз контроллер с Али ( все комплектующие наверное тоже с Али буду заказывать) лента ws2812b 60 диодов на метр потребление 18w/m нужно где-то 3,5 метра получается 63W+30% в пике, обычные Li-ion типа 18650 наверное не подойдут, я думал между высокотовыми 18650 как у шуруповерта или Lifepo4, Lipo (не знаю как правильно называются последние) используются для питания квадрокоптера. Выбор стоит перед двумя лентами ws2812b 5v и ws2811 12v и типом аккумулятора? Кто разбирается помогите пожалуйста.

    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
×
×
  • Create New...