Управление светодиодами ws2813 с адресацией с помощью attiny

Содержание

Подключение адресной светодиодной ленты WS2812B к Arduino

Опубликовано: 23.02.2017 20:25

Введение

Приветствую всех. Мы продолжаем знакомить Вас со светодиодными лентами. На этот раз мы рассмотрим адресную RGB светодиодную ленту WS2812B. Лента основана на светодиодах WS2812B в корпусе LED 5050, куда в корпус производители поместили не только три встроенных светодиода (Красный, Зеленый, Синий), но и управляемый ШИМ драйвер, управляющий их яркостью. Благодаря этому мы можем получить произвольный цвет, изменяя яркость встроенных светодиодов, а так же управлять отдельно взятым пикселем на ленте. Собственно, три встроенных разноцветных светодиода вместе с ШИМ драйвером и образуют светодиод WS2812B.

Немного запутывает, не правда ли? Светодиод, который содержит себе три разноцветных светодиода, но при этом сам – не светит, а светятся те три, что в него встроены. Поэтому мне проще называть его пикселем, нежели светодиодом. И далее, если я упоминаю пиксель – знайте, что это светодиод WS2812B.

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

Технические характеристики

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

  • Светодиод WS2812B работает от напряжения 5В (±0.5).
  • Ток

20мА на один встроенный светодиод, то есть

60мА на пиксель в целом.

  • Рабочая температура от -20 до +80 ℃.
  • Остальное можете посмотреть самостоятельно в даташите.

    Подключение

    Подключается светодиодная лента довольно-таки просто, необходимо подать на +5V и GND, плюс (+) и минус (-) от 5В блока питания, а контакт DIN соединить с портом Arduino, как правило, по умолчанию используется 6-й порт Arduino, но вы вправе выбрать и любой другой свободный порт. Так же рекомендуется соединить земли Arduinoи блока питания, как нарисовано на рисунке ниже.

    Будьте внимательны, лента на светодиодах WS2812B имеет направление, с одной стороны она имеет контакты DIN, +5V, GND, а с другой стороны DO, +5V, GND, подключать необходимо именно вход, то есть DIN, иначе лента не будет работать. Так же на ленте нарисованы стрелки, указывающие на направление.

    Протокол

    Теперь, когда мы разобрались, как подключить нашу ленту к Arduino, нам надо понять, как ею управлять, для этого в даташите есть описание протокола, который мы сейчас и рассмотрим.

    Каждый светодиод WS2812B имеет один вход (DIN) и один выход (DO). Выход каждого светодиода подключается ко входу следующего. Подавать сигналы же надо на вход самого первого светодиода, таким образом, он запустит цепь, и данные будут поступать от первого ко второму, от второго к третьему и т. д.

    Команды светодиодам передаются пачками по 24 бита (3 байта, один байт на каждый цвет, первым передается байт для зеленого, потом для красного, и заканчивает байт для синего светодиода. Порядок бит – от старшего к младшему). Перед каждой пачкой идет пауза в 50 мкс. Пауза больше 100 мкс воспринимается как окончание передачи. Все биты, будь то 0 или 1, имеют фиксированное время 1.25 мкс. Бит 1 кодируется импульсом в 0.8 мкс, после чего идет пауза в 0.45 мкс. Бит 0 кодируется импульсом в 0.4 мкс, после чего идет пауза в 0.85 мкс. Собственно, наглядная диаграмма на фото ниже. Так же допускаются небольшие погрешности в 0-150 нс на каждый фронт. Ну и следует учесть, что подобное необходимо повторить для каждого светодиода на ленте, после чего сделать паузу минимум в 100 мкс. Потом можно повторить передачу.

    Глядя на все эти цифры, становится ясно, что сделать все это, используя стандартные функции digitalWrite, delay и тому подобные – попросту невозможно, ввиду их долгой работы и неточности. Реализовать подобный протокол можно только использовав специальные библиотеки вроде CyberLib или написав собственную на чистом Си или, того хуже для нынешнего программиста, на Ассемблере.

    Но не все так плохо, как кажется. Светодиоды WS2812B довольно таки популярны в Arduino сообществе, а это значит, что нам не придётся вдаваться в такие сложности, и достаточно выбрать одно из понравившихся решений.

    Библиотеки

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

      Библиотека FastLED, разрабатывается Даниэлем Гарсиа и Марком Кригсманом. Имеет свой сайт, справочную систему и большое сообщество в

    5000 человек. Библиотека написана на чистом Си, без использования Wiring. FastLED поддерживает все виды Arduino (и не только), а так же умеет работать с кучей различных протоколов и интерфейсов. В том числе и протокол для управления лентами на светодиодах WS2812B.

  • Библиотека Adafruit NeoPixel (Полное описание на нашем сайте), разрабатывается компанией Adafruit Industries. Предназначена для работы со светодиодными лентами и неопиксельными кольцами, продаваемыми в их интернет магазине. Библиотека написана на Си и Ассемблере с небольшим использованием Wiring. Эдакая солянка. Поддерживает все виды Arduino. Содержит меньший функционал по сравнению с FastLED, немного медленней, но имеет более компактный вид, только основное для работы.
  • Теперь давайте напишем наш излюбленный пример Blink, используя обе эти библиотеки, и затем сравним их.

    Пример Blink используя ленту WS2812B (с 30 светодиодами) и библиотеку FastLED

    Пример Blink используя ленту WS2812B (с 30 светодиодами) и библиотеку Adafruit NeoPixel

    Подытожим

    Как вы видите из скетчей выше, работать с обеими библиотеками довольно таки просто. Но библиотека FastLED занимает больше места в памяти Arduino, более того чем больше пикселей в вашей ленте тем больше памяти она зарезервирует для своей работы, а точнее 3 байта на каждый пиксель. Таким образом подключить к Arduino можно не более 600 пикселей при использовании минимальной логики. По этому, мне больше приглянулась библиотека Adafruit NeoPixel. В ней только нужное для работы со светодиодными лентами и более рациональное использование памяти. Какую из этих библиотек использовать, решать, конечно, вам. Обе они работают и со своею задачей справляются на 5+.

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

    Светодиодная лента WS2812B – Переделка устройства управления

    • Цена: $27.62 (White 5m 60 IP30)
    • Перейти в магазин

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

    Характеристики ленты и ее тесты, можно посмотреть в прошлом моем обзоре. Единственное отличие: на этот раз я приобрел версию ip30 — не имеющую силиконового покрытия и предназначенную исключительно для монтажа внутри помещения.


    Кратко напомню:
    Сами светодиоды WS2812B представляют собой сборку из микросхемы и 3-х светодиодов (красный, синий и зеленый), благодаря специальному протоколу, микросхема принимает данные только для своей сборки, остальные данные передает дальше по цепочке. Благодаря этому, каждой отдельной сборке можно передать информацию о яркости ее каждого светодиода (красного, синего и зеленого) и получить нужный цвет.

    Видим: линии отреза по контактам, собственно контакты с двух сторон: DIN — входные данные, DO — выходные данные, +5V — плюс питания, GND — минус питания, C1 — керамический конденсатор, ну и собственно сам светодиод припаянный 4-мя контактами. Направление передачи данных указано стрелочками.

    Для ардуино разработана хорошая библиотека для данных сборок Adafruit_NeoPixel. Которая позволяет раскрашивать каждую сборку в свой цвет. Также у Adafruit есть библиотека для экранов из данных сборок и неплохие примеры использования. Есть и другие библиотеки для работы с данными лентами.

    Здесь подробно рассмотрю устройство управления. Прошлое устройство управления эффектами было реализовано на Arduino Pro Mini и управлялось с телефона через bluetooth. Нареканий в работе устройства не было. Но хотелось более простого управления, например пульт ик, чтобы даже маленький ребенок мог спокойно создать комфортную для себя обстановку, да и просто побаловаться. Впрочем, самому тоже иногда удобнее взять пульт и включить или выключить, без телефона. Вид прошлой версии устройства:

    Напомню, прошлый раз я предусмотрел ик-приемник в устройстве, однако для работы с WS2812B требуются отключенные прерывания контроллера. Если же в библиотеке отключить их запрет, то из-за большого количества мусора в эфире инфракрасного диапазона, контроллер ведет себя дергано, смотреть на такие эффекты не очень то и приятно. Проблему решил исправить кардинально: подключить второй контроллер, который будет заниматься только обработкой ик-сигналов и, при наличии реальных управляющих команд, сообщать об этом основному контроллеру, который, в свою очередь, будет менять режим. Управление по bluetooth было решено сохранить — пульт при наличии маленьких детей легко может быть утерян, а телефон, в большинстве случаев, находится рядом.

    Мне понравилась идея использования разъема для наушников (3 вывода) для подачи питания на устройство управления и получения от него управляющего сигнала. Схема нового устройства (извиняюсь не сильно старался рисовать):

    J1- аудиоразъем по которому подается питание на контроллер и сигнал на ленту, J2- Аппаратный Serial с питание и RESET.

    Для фильтрации питания использованы конденсаторы: электролит на 470 мкФ и керамика на 100 нФ. В комментариях к прошлому обзору кто-то негодовал, что данный разъем не рассчитан на потребляемые 2А лентой. На самом деле питание приходит через этот разъем только для контроллера и обвязки, а это десятки миллиампер, с которыми вполне справиться данный разъем.

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

    Контроллеры выбраны следующие: ATmega328 (управление эффектами), ATtiny85 (ик-примник). Сейчас в большинстве устройств я использую sot и tqfp корпуса микросхем. Но тут вполне подошли по размерам и наличию dip-версии данных контроллеров (грубо говоря, просто остались запасы).

    Печатную плату разработал в программе Sprint Layout и изготавливал технологией ЛУТ. Подробно, как я это делаю, описывал в одном из первых своих обзоров про шаровый кран. Так выглядит плата (фото вид):

    Здесь кратко покажу в виде фотографий, для желающих повторить файл печатной платы.
    Напечатал на китайской бумаге для термотрансфера и подготовил заготовку под плату (я сразу делал два устройства, так как размеры заготовки 7 на 10 см):

    Процесс обработки утюгом:

    Все готово для травления в хлорном железе:

    После смывки тонера:

    Разделяем близнецов с помощью дримеля:

    Делил вот этим инструментом с насадкой типа отрезной диск, процесс немного пыльный, поэтому следует использовать средства индивидуальной защиты:

    Мажем глицерином для лужения:

    Лудить мне последнее время понравилось оплеткой для демонтажа компонентов намотанной на паяльник (особенно актуально для смд компонентов):

    Результат лужения:

    Производим монтаж элементов:

    Флюс мне понравился под маркой KINGBO, из за отсутствия поршня и нестандартных размеров перелил его в обычный шприц:

    Почти готово:

    Обратная сторона до смывки флюса:

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

    Итоговые платы:

    Отладка проходила с применением Arduino Nano, причем, я ее использовал и для программирования ATtiny85 и как прототип ATmega328. Для заливки программы в ATtiny85 использовалась такая схема подключения:

    Вот так выглядел макет:

    Для заливки программы в Arduino Nano требовалось только отключать конденсатор между выводами reset и gnd. Для визуального контроля работы ATtiny на ее вывод PB1 был подключен светодиод.

    Перед началом всех действий требуется инициализировать ATtiny85 и прописать правильные фьюзы. Я использовал внутренний генератор на 8 МГц. Вот строчки из boards.txt:

    Я опишу процесс сборки устройства по шагам:
    На первом шаге я хотел добиться корректного поведения ATiny85 как приемника инфракрасных сигналов. Я не использовал библиотек, а считывал коды прямо с ножки контроллера. Для получения кодов применил модификацию библиотеки SoftwareSerial, позволяющей использовать только одну ножку контроллера для передачи данных. К этой ножке был прицеплен usb-ttl преобразователь, подключенный к компьютеру. Скетч получения кодов:

    В результате, на все кнопки сформировалась соответствующая табличка:

    Потом написал скетч обработки полученных кодов, при их получении ATtiny85 должна была выдавать на порт PB0 символы соответствующие нажатым клавишам. Проверка велась также с использованием usb-ttl преобразователя. Код готового устройства:

    Далее можно было соединить PB0 ATtiny c одним из выводов ATmega328, которая будет реагировать на соответствующие символы. И переходить к формированию программы для основного контроллера. Проверку работоспособности связки контроллеров делал следующим кодом:

    Итоговая программа, обеспечивающая работу конечного устройства (предупреждаю, что код очень сырой и полагаться на него нельзя, это большей частью для демонстрации возможностей платы, но никак не готовый код). Напомню, что мне пришлось переписать код формирования эффектов Adafruit_NeoPixel чтобы удалить из кода все искусственные задержки (delay) и привести программу к пошаговому контролю времени, для возможности оперативного управления эффектами. В данном случае, добавлена обработка инструкций ик-пульта. При этом, bluetooth переехал с программного сериал-порта на аппаратный.

    Тестирование проводилось на коротком отрезке ленты, оставшейся с прошлых проектов:

    Тесты показали адекватное поведение разработанного устройства и его стабильную работу в течении суток. Мелкая дочка тоже принимала участие в тестировании устройства. И даже оставила свой след зубов (знак качества) на экспериментальном пульте:

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

    Печатная плата делалась под тот же корпус, что и первая версия, поэтому осталось все это собрать в корпус. Планируется установить ленту на 2-м этаже дачного домика, обеспечив доступ детям к пульту.

    В целом, могу сказать, что лента продаваемая данным продавцом, вполне качественная — нареканий в ее работе за прошедшие 3 месяца не было, могу смело рекомендовать к покупке.

    На этом заканчиваю. Спасибо тем кто дочитал до конца, надеюсь кому-то информация окажется полезной! Если будет интересно, расскажу еще про новые «дачные разработки».

    Видео работы ленты (из прошлого обзора, так как алгоритм не менялся):

    Адресные ленты 2811, 2812, 2813. Описание, подключение, отличия.

    В отличие от обычной светодиодной RGB-ленты, в которой все светодиоды одинаково реагируют на сигнал с RGB-контроллера, в адресной LED-ленте каждый светодиод получает индивидуальную команду управления. В результате пользователь может максимально точно подбирать оттенок для каждого светодиода, создавать световые эффекты и собирать матрицы с 16 млн цветов. В чём уникальность адресной светодиодной ленты и как научиться ею управлять? Об этом и пойдет речь в данной статье.

    RGB светодиодная лента.

    На этой ленте стоят RGB светодиоды. Такой светодиод имеет уже 4 выхода, один общий +12 (анод), и три минуса (катода) на каждый цвет, т.е. внутри одного светодиода находится три светодиода разных цветов. Соответственно такие же выходы имеет и лента: 12, G, R, B. Подавая питание на общий 12 и любой из цветов, мы включаем этот цвет. Подадим на все три – получим белый, зелёный и красный, они же в свою очередь дадут много различных цветов и оттенков: жёлтый, розовый, фиолетовый, голубой и так далее. Для таких лент существуют контроллеры с пультами, типичный контроллер представляет собой три полевых транзистора на каждый цвет и микроконтроллер, который управляет транзисторами, таким образом давая возможность включить любой цвет.

    Адресная светодиодная лента WS2811, WS2812b

    Это вершина эволюции лент. Представляет собой ленту из адресных диодов, один такой светодиод состоит из RGB светодиода и контроллера. Внутри светодиода уже находится контроллер с тремя транзисторными выходами. Благодаря такой начинке у нас есть возможность управлять цветом (т.е. яркостью r g b) любого светодиода в ленте и создавать потрясающие эффекты. Адресная лента может иметь 3-4 контакта для подключения, два из них всегда питание (5V и GND например), и остальные (один или два) – логические, для управления.

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

    Сейчас популярны два вида ленты: на чипах WS2812b и WS2811. Чип WS2812 размещён внутри светодиода, таким образом один чип управляет цветом одного диода, а питание ленты – 5 Вольт. Чип WS2811 размещён отдельно, и от него питаются сразу 3 светодиода, таком образом можно управлять цветом сегментов по 3 диода в каждом. А вот питание у ленты на WS2811 составляет 12 вольт.

    Адресная светодиодная лента WS2813

    Адресная лента WS2812B поделена на сегменты, в каждом из которых расположен светодиод и конденсатор (для повышения помехоустойчивости). Относительно напряжения питания все они между собой подключены параллельно, т.е. +5V будет присутствовать на каждом сегменте. А вот передача данных осуществляется последовательно: от предыдущего сегмента к последующему. Поэтому при выходе из строя одного из светодиодов цепи – все последующие сегменты перестанут работать.


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

    Сфера применения адресной ленты

    Относительно высокая стоимость светодиодов и лент, собранных на чипах WS2811 и WS2812B, ограничивает их область применения в сравнении с обычными LED-лентами. Главным образом их используют для решения таких задач, с которыми обычной светодиодной ленте не справиться:

    • для сборки полноцветных модулей;
    • в конструировании светильников, управляемых по принципу «soft lights»;
    • в качестве декоративной подсветки чего-либо;
    • в построении LED-видео экранов, используемых в уличной рекламе и шоу-бизнесе.

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

    Управление адресной лентой

    Управление адресными лентами и модулями производится с помощью специализированного контроллера, внутри которого записана программа. На радиолюбительском уровне управлять работой адресной светодиодной ленты удобней и интереснее через Arduino, используя для этого небольшую программу – скетч.

    Схема подключения к Arduino на примере ленты WS2812b

    У каждой адресной ленты есть начало и конец, которые нельзя менять местами во время сборки схемы. Чтобы не запутаться, производители используют условные обозначения, например, стрелки, указывающие направление сигнала. Подключение адресной светодиодной ленты WS2812B к Arduino производится по трём проводам, как показано на рисунках ниже.

    Цифровой вход ленты идёт напрямую на «сырой» вход микроконтроллера внутри диода, поэтому между ним и управляющим пином ардуино нужен токоограничиваюший резистор с номиналом 100-500 ом, он ограничит ток, и управляющий пин ардуино не будет перегружаться.

    Контакты питания +5V и GND соединяют с соответствующими выводами на плате Arduino. Если подсоединяемый отрезок насчитывает более 13-ти светодиодов, то необходимо использовать выносной блок питания. При этом общий провод (GND) Arduino и «минус» блока питания должны быть соединены между собой. Контакт DIN (digital input) предназначен для приёма данных от контроллера и электрически соединяется с любым из его цифровых портов. С другой стороны адресной ленты (и каждого сегмента тоже) размещено 3 контакта: +5V, DO (digital output) и GND, к которым можно подключить ещё несколько отрезков разной длины.

    Цифровой вход ленты идёт напрямую на «сырой» вход микроконтроллера внутри диода, поэтому между ним и управляющим пином ардуино нужен токоограничиваюший резистор с номиналом 100-500 ом, он ограничит ток, и управляющий пин ардуино не будет перегружаться.


    Так как каждый элемент WS2812B фактически состоит из 3 светодиодов (синего, красного, зелёного), то для управления его свечением потребуется 3 байта (по одному на каждый цвет). В свою очередь, каждый байт может принимать значение от 0 до 255, в результате чего можно задать более 16,5 млн оттенков. Размер скетча будет равен количеству светодиодных сегментов, умноженному на 3. Передача данных происходит следующим образом: ШИМ-драйвер WS2812B первого сегмента забирает из посылки первые 3 байта, пропуская остальные данные на выход DO. Далее следует пауза длиною до 50 мкс, означающая, что второй по счёту драйвер должен принять следующие 3 байта. И так далее. Длительность паузы больше 50 мкс означает конец передачи и повторение цикла.

    Управление адресной лентой

    Управление адресными лентами и модулями производится с помощью специализированного контроллера, внутри которого записана программа. На радиолюбительском уровне управлять работой адресной светодиодной ленты удобней и интереснее через Arduino, используя для этого небольшую программу – скетч.

    Проще всего использовать библиотеки FastLED и Adafruit NeoPixel. Внутри каждой библиотеки есть готовые скетчи, на основе которых несложно научиться самостоятельно создавать новые световые эффекты. Чтобы скетч заработал с первого раза, необходимо в заголовке правильно указать количество светодиодов в ленте (NUM_LEDS) и номер порта для передачи данных (PIN).

    Драйвер светодиодной ленты на WS2812B для STM32F103C8

    Приобрел я на Aliexpress так называемую адресную светодиодную ленту на светодиодах WS2812B. В отличие от обычной RGB-ленты, тут есть возможность управлять цветом и яркостью свечения каждого светодиода отдельно. Однако, это накладывает некоторые сложности в управлении этой лентой. Для того, чтобы зажечь нужный цвет, необходимо загрузить в ленту последовательность бит данных, содержащую информацию о цвете свечения каждого светодиода. Есть готовые библиотеки, и для всяких Ардуино, и для тех же STM32, которые реализуют цифровой протокол обмена данными с WS2812B. Однако, я хочу изобрести свой велосипед в этой области, ну и заодно немного поупражняться в программировании, поэтому, поехали!

    Содержание:

    Введение

    Интерфейс светодиодов WS2812B является довольно жестким в отношении к временным интервалам, поэтому его реализация в виде Bit-banging-а является еще той задачей. В результате выбор пал на вариант с хитрой настройкой таймера в режиме ШИМ и контроллера прямого доступа к памяти (DMA). Идея была позаимствована с https://habr.com/post/257131/. Там была описана реализация для микроконтроллера STM32F407VE. В моем случае был взят STM32F103C8 в составе отладочной платы с Али за 2 бакса:

    Рис. 1. Отладочная плата с STM32F103C8T6 на борту

    Описание библиотеки управления

    Описывать идею реализации протокола на таймере не буду, всегда можно обратиться к первоисточнику на Хабре, перейду сразу к конкретной реализации библиотеки. Из периферии задействован таймер-счетчик TIM2, контроллер DMA1 и, в зависимости от конфигурации, один из портов PA0, PA1, PA2 или PA3. Библиотека состоит из 3-х файлов:

    • ws2812b.h — прототипы функций и настройка количества светодиодов в ленте
    • ws2812b_config.h — тонкая настройка библиотеки, включает подстойку таймингов и выбор ножки порта, через которую производится управление лентой
    • ws2812b.c — сама реализация протокола

    Библиотека использует только CMSIS без всякой высокоуровневой требухи в виде SPL. Только регистры, только хардкор.

    Начнем с простого: файл ws2812b.h:

    С помощью WS2812B_NUM_LEDS указываем количество светодиодов в ленте, в данном случае 144. Функция ws2812b_init() производит инициализацию интерфейса, ее надо вызвать один раз в самом начале программы, ws2812b_buff_claer() очищает внутренний буфер библиотеки, присваивая всем светодиодам выключенное состояние. С помощью ws2812b_set(int pixn, uint8_t r, uint8_t g, uint8_t b) присваиваем pixn-му светодиоду компоненты R, G, и B. Нумерация светодиодов идет с нуля, максимальное значение номера пикселя WS2812B_NUM_LEDS — 1. Функция ws2812b_send() запускает процесс отправки внутреннего буфера в светодиодную ленту, причем, если предыдущая операция отправки еще не завершена, то не оказывает ни какого влияния на процесс и возвращает единицу. С помощью ws2812b_is_ready() можно узнать текущий статус интерфейса: если эта функция вернула 0, то интерфейс сейчас занят операцией обмена, если 1, то интерфейс свободен.

    Следующий файл — ws2812b_config.h:

    С помощью WS2812B_TIMER_AAR производим точную настройку периода ШИМ-сигнала таймера, чтоб он соответствовал скорости передачи данных. Значение 0x59 соответствует периоду в 1.25 мкс при тактировании таймера частотой 72 МГц.

    Если мы используем инвертирующий согласователь логических уровней между микроконтроллером и лентой, то сигнал с выхода микроконтроллера необходимо инвертировать, чтоб в итоге получить управляющие импульсы в нужной полярности. Для этих целей служит #define WS2812B_OUTPUT_INVERSE.

    Далее идет выбор пина порта WS2812B_OUTPUT_PAx, с помощью которого будет производиться управление лентой. Варианта тут только 4-ре: PA0, PA1, PA2 или PA3. Выбирай тот, что удобней)).

    Перейдем к основному: ws2812b.c. Немного поговорим о том, как реализована логика интерфейса WS2812B. В функции отправки данных в ленту производится настройка таймера TIM2 в режим ШИМ с частотой 800 КГц, что соответствует скорости передачи данных в ленту. После этого включаем DMA, который после каждого события обновления счетчика будет запихивать новое значение в регистр ШИМ-а таймера. После того, как все запихано, возникает прерывание DMA об окончании передачи, в котором производится останов TIM2, установка его периода, равного длительности сигнала RET, включение прерывания при обновлении значения регистров счетчика и снова пуск TIM2. После истечения периода RET, возникает прерывание от TIM2, в котором происходит финализация процесса передачи данных и установка флага готовности шины к следующей передачи данных.

    В самом начале файла находится куча define-ов, с помощью которых происходит определение конкретных регистров таймера и DMA в соответствии с выбранной ножкой микроконтроллера WS2812B_OUTPUT_PAx. Конструкция монструозная, но как сделать проще не придумал:

    Затем идет расчет длины буфера, в котором хранятся значения цвета светодиодов:

    Каждый светодиод добавляет 24 байта к занимаемой памяти. Так, для светодиодной ленты, состоящей из 144-х пикселей буфер будет занимать 144*24+2=3458

    =3.4 Кбайт ОЗУ. AVR-щики в шоке. Ардуинщики чешут репу. Много это или мало, зависит от конкретной задачи: где-то такой расход памяти допустим, а где-то нет.

    Поехали далее. Функция инициализации интерфейса выглядит следующим образом:

    Первым делом включаем тактирование всех нужных нам модулей. Затем переключаем GPIO в режим альтернативных функций и задаем максимальную частоту вывода 10Мгц. После этого идет настройка таймера, DMA, и включение прерываний от этих модулей.

    Дальше функция запуска отправки данных:

    Здесь происходит предварительная настройка таймера и DMA должным образом и запуск всего процесса.

    После завершения передачи данных возникает прерывание от DMA DMA1_Channelx_IRQHandler():

    В этом прерывании запускается следующая стадия работы логики интерфейса, а именно формирование сигнала RET. В функции bus_retcode() происходит вся настройка таймера для этой стадии. После того, как таймер отсчитал чуть больше 50мкс, возникает прерывание TIM2_IRQHandler():

    Здесь мы сбрасываем все флаги прерываний таймера TIM2 и останавливаем его, а так же устанавливаем флаг готовности интерфейса flag_rdy.

    Из интересного осталось только рассмотреть функцию установки цвета пикселя светодиодной ленты ws2812b_set():

    На вход принимаем номер светодиода и компоненты RGB. Согласно даташиту на светодиоды, байты цвета идут в следующей последовательности: зеленый, красный, синий, а последовательности бит от старшего к младшему. Массив led_array[] как раз тот самый массив, который выводится через DMA в ШИМ-регистр таймера.

    Подключаем ленту

    Светодиоды WS2812B питаются напряжением 5 вольт. Максимальный ток потребления одного светодиода при включении на полную яркость всех трех цветов составляет 60mA, таким образом, метр ленты со 144 может сожрать почти 9 ампер тока, что, мягко говоря, дофига и еще немного. Так что если есть желание жечь по полной, нужно организовать хороший теплоотвод ленты и подавать ей питание не только в самом начале, но и еще в нескольких точка по всей длине ленты.

    Теперь что касается цифрового входа. Потенциал логической единицы начинается с 0,7Vdd, и при питании ленты от 5-и вольт это будет составлять 3,5 вольт. Так как выводы у STM32 3,3 вольтные, то напрямую подключить ленту к микроконтроллеру не получится, нужен согласователь уровней. Причем это не занудные заморочки любителя «все делать по инструкции», а реальная необходимость: на практике при питании от 5-и вольт лента у меня не завелась при прямом подключении к 3,3 вольтной логике. Чтож, не проблема, сделаем согласователь уровней на полевом транзюке:

    Рис. 2. Согласование уровней с помощью транзистора 2N7002

    И вот тут нам как раз и пригодится возможность инвертирования управляющего сигнала с выхода микроконтроллера с помощью #define WS2812B_OUTPUT_INVERSE.

    Рис. 3. Вот так вся конструкция выглядит в живую

    В моем случае в качестве управляющей ножки микроконтроллера была выбрана PA1. Подключаем вывод GPIO (см. рис. 2) к PA1, WS2812B_DATA к управляющему входу ленты, +5V к плюс пяти вольтам, землю к земле))) Одеваем каску и включаем питание)) Если ни чего не бахнуло, то переходим к следующему шагу

    Примеры на IAR ARM

    В качестве примера я придумал несколько демонстраций работы с библиотекой. Среда разработки — IAR ARM 7.50.2. Начнем с простого: зажжем все светодиоды красным светом на половину яркости. Вот минимальный код запуска:

    Из комментариев, думаю, все ясно без пояснений.

    В живую это выглядит вот так:

    Рис. 4. Подсветка для дома красных фонарей готова))

    Перейдем к радуге. Не вдаваясь в подробности, для того, чтобы нарисовать радугу нам нужно уметь делать преобразование из цветового пространства HSV в RGB. Вот немного Википедии. Конвертер позаимствовал из одной статьи на Хабре, о чем честно сообщаю в комментариях))

    Изменяя H-компоненту от 0 до 360, получаем самую обычную радугу

    Рис. 5. Радуга

    Для справки: на яркости 100 лента в режиме радуги потребляет всего 130мА. А вот на полной яркости ест все 3 ампера.

    Ну и небольшая демка с плавным зажиганием-погасанием радуги:

    На видео видна некая неравномерность скорости затухания, но в реале этого не видно.

    Управление светодиодами ws2813 с адресацией с помощью attiny

    Итак, у вас есть или светодиоды WS2812b, или светодиодная лента из этих светодиодов, или светодиодное кольцо. Теперь хочется научиться всем этим управлять. Желательно так, как хочется, а не просто используя готовые решения.

    Давайте вместе будем учиться делать это (я тоже хочу этому научиться).

    Для управления я использую микроконтроллер Arduino. Осталось малость – научиться его программировать.

    Думаю, что если вы попали в этот раздел, с Arduino так или иначе вы уже знакомы. Поэтому не буду подробно копипастить информацию с профильных ресурсов – плагиат мне не интересен. Для программирования я использую Arduino Software (IDE). Так же я пропущу то, как устанавливаются различные библиотеки для этой среды разработки – все это, повторюсь, есть на профильных форумах.

    Итак, для управления «умными» светодиодами есть две основные библиотеки: Adafruit NeoPixel и FastLED. Я не могу сказать, чем они отличаются, в чем их достоинства и недостатки, ибо не знаю. Поэтому буду рад комментариям знающих людей.

    Ну а начнем с самого простого – научимся просто зажигать произвольный светодиод произвольным цветом.

    Как вы уже, наверняка, знаете, конструкция Arduino скетча выглядит так:

    Две части, в которых мы описываем наши переменные, и их действие, причем вторая часть – эта то, что «воспроизводится» «по кругу» (ну не знаю я профессиональных терминов на этот счет).

    Сегодня работаем с библиотекой Adafruit NeoPixel

    Первый скетч выглядит так:

    Итак, первая строка. С ее помощью мы подключаем к нашей среде разработки библиотеку Adafruit_NeoPixel.h, в которой уже прописаны базовые функции.

    Строка 2. В этой строке мы определяем переменную PIN, то есть номер пина на плате Ардуино, на который будут выводится результаты наших трудов, и который будет управлять светодиодами.

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

    Строка 4. В ней, как я понял, описывается основная конструкция.
    Adafruit_NeoPixelstrip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Вместо «strip» вы можете написать все, что угодно, главное, чтобы далее в программе вы использовали все точно так же, как написано тут. При работе программы в переменные NUMPIXELS, PIN подставляется значения, определяемые во второй и третьей строке. Поэтому вполне можно записать эту конструкцию, как Adafruit_NeoPixelstrip = Adafruit_NeoPixel(10, 6, NEO_GRB + NEO_KHZ800); и все будет работать точно так же. Просто это во-первых менее удобно, во вторых уже не так универсально. В последнем параметре вы можете менять тайминги для различного типа светодиодов. Для светодиодов 2811 этот параметр будет выглядеть, как NEO_KHZ400.

    Строка 5. Инициализирует программу.

    Строка 6. Стандартный оператор конструкции скетча

    Строка 7. В моем примере, в коде программы написано, что с помощью оператора strip.show(); мы гасим светодиоды в том диапазоне, который у нас указан в переменных программы. Но на самом деле, без этого оператора можно обойтись. Я пробовал – ничего не меняется.

    Строка 8. Закрываем первый блок.

    Строка 9. Основная часть программы, которая выполняется «по кругу».

    Строка 10. Готовим сигнал на нужный нам светодиод, указав его номер светодиода первым в скобках, с учетом того, что адрес первого светодиода у нас – это 0. strip.setPixelColor(25, strip.Color(1, 0, 55)); То есть, 25 – это номер зажигаемого светодиода, strip.Color(1, 0, 55) – цвет, каким мы зажигаем светодиод, в формате RGB. То есть значение каждого цвета может быть указано в диапазоне 0..255.

    То есть, чтобы зажечь первый светодиод в ленте красным цветом, пишем:

    strip.setPixelColor(0, strip.Color(255, 0, 0));

    Строка11. Зажигаем светик(и)

    Строка 12. Закрывающая скобка.

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

    Теперь листинг программы.

    #define PIN 6 // Это выход #6, куда подключено управление лентой.

    #define NUMPIXELS 3 //Число светодиодов в ленте

    Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

    strip.setPixelColor(0, strip.Color(100, 0, 0)); // R=255, G=0, B=0 — цвет светодиода

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

    strip.setPixelColor(0, strip.Color(100, 0, 0));

    strip.setPixelColor(2, strip.Color(0, 100, 0));

    strip.setPixelColor(5, strip.Color(0, 0, 100));

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

    Хочу обратить ваше внимание вот еще на какой момент. Хотя мы ни как не используем переменную, определяющую число светодиодов в ленте, тем не менее, она функционирует. Попробуйте выставить число светодиодов в 10 и зажечь тринадцатый светодиод, указав его номер в программе. Увы, он не загорится.

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

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

    Адресная светодиодная лента

    Адресные светодиодные ленты отличаются от обычных RGB тем, что в них каждый светодиод может управляться отдельно благодаря специальному чипу. Поэтому их еще называют управляемыми лентами. С помощью управляемых лент можно добиться гораздо более интересных эффектов, чем с обычной RGB: от режима “бегущий огонь” и эквалайзера до полноценного LED экрана! Все зависит только от возможностей контроллера и вашей фантазии! Если вы хотите узнать об этом больше – почитайте нашу статью об адресных лентах.

    Кол-во диодов на метр:

    Поиск по словам:

    Отрезаем кратно метру!

    Адресная светодиодная RGB лента SPI ws2812b 5v 60 led ip33 14.4w

    Добавить в корзину

    Отрезаем кратно метру!

    Адресная светодиодная лента spi ws2812b 5v 144 led ip33 34w

    Добавить в корзину

    Светодиодная матрица ws2812b 16х16 пикселей 5v 50w, 256led, 160×160 мм.

    Добавить в корзину

    Адресная светодиодная гирлянда ws2812b 50 пикселей 5v 15w, 50led, длина 6 метров

    Добавить в корзину

    Коннектор стыковочный 3 pin для адресной светодиодной ленты с чипами ws2812 и ws2811

    Добавить в корзину

    Отрезаем кратно метру!

    Адресная светодиодная RGB лента SPI ws2812b 5v 30 led ip67 7.2w

    Добавить в корзину

    Отрезаем кратно метру!

    Адресная светодиодная RGB лента SPI ws2812b 5v 60 led ip67 14.4w

    Добавить в корзину

    Светодиодная матрица ws2812b 32х8 пикселей 5v 50w, 256led, 320×80 мм.

    Добавить в корзину

    Адресная светодиодная гирлянда ws2813 5v 15w, 50led, длина 6 метров, 4 канала

    Добавить в корзину

    Отрезаем кратно метру!

    Адресная светодиодная RGB лента SPI ws2818 12v 60 led ip33 14.4w с запасным каналом данных. Управление кратно 3 диодам.

    Добавить в корзину

    Отрезаем кратно метру!

    Адресная светодиодная RGB лента SPI ws2812b 5v 30 led ip33 7.2w

    Добавить в корзину

    Светодиодная матрица ws2812b 8х8 пикселей, 5v 12,5w, 64led, 80×80 мм.

    Добавить в корзину

    Коннектор “Мама-Папа” для адресной светодиодной ленты.

    Добавить в корзину

    Отрезаем кратно метру!

    Адресная светодиодная RGB лента SPI ws2813 5v 30 led ip33 7.2w с запасным каналом данных

    Добавить в корзину

    Отрезаем кратно метру!

    Адресная светодиодная RGB лента SPI ws2813 5v 60 led ip33 14.4w с запасным каналом данных

    Добавить в корзину

    Доставка и оплата

    8 (800) 200 36 72

    ИП Семёнов Дмитрий Сергеевич

    ОГРНИП 319762700027951 ИНН 760416214828 ОКАТО 78401373000

    Адрес: г. Ярославль, Торфяная д5, 150029.

    Copyright © 2016-2020 Все права защищены. При копировании материалов активная, индексируемая ссылка на сайт www.giant4.ru обязательна.

    Информация на данном интернет-сайте носит исключительно ознакомительный характер и ни при каких условиях не является публичной офертой, определяемой положениями статьи 437 Гражданского кодекса Российской Федерации. Для получения актуальной информации о характеристиках товаров, их наличии и стоимости связывайтесь с менеджерами компании.

    Заполнение любых форм на нашем сайте означает ваше согласие нашей политикой конфиденциальности .

    Читайте также:  6.1.5. возможные модификации
    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    Adblock
    detector