Найти тему

Бегут и переливаются: Arduino, Bascom-AVR и светодиоды WS2812B

Оглавление

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

В прошлый раз мы учились мигать трёхцветным светодиодом, подключенным к плате Arduino и разбирались с тонкостями генерации ШИМ-импульсов средствами Bascom-AVR для изменения его яркости и результирующего цвета.

А сегодня у нас светодиоды WS2812b, плата Arduino Nano и те же самые задачи.

Казалось бы, светодиодом больше, светодиодом меньше, да и какая разница, если он другой серии?

Разница есть и она довольно существенна.

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

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

А всё потому, что помимо обычных светоизлучающих элементов такие светодиоды содержат [на общем кристалле, как, например, в серии WS2812, либо в виде отдельной микросхемы, как у WS2811] дополнительный микроконтроллер.

К каждому корпусу светодиода, к каждому кристаллу на светодиодной ленте. Свой, отдельный микроконтроллер.

Умеет этот микроконтроллер немного ‒ всего лишь принимает на входе DIN светодиода посылку из нулей и единиц, 24 бита информации оставляя для трёх цветов своего кристалла, а остальные отправляя дальше, на выход DOUT.

Но зато умеет делать это быстро и хорошо.

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

Согласитесь, что это гораздо лучше, чем 6 каналов, определяемых максимальным количеством ножек ШИМ в микроконтроллере ATmega328P.

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

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

1. Немного скучной теории

На первый взгляд и по внешнему виду адресные светодиоды почти ничем не отличаются от обычных.

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

Так же, как и обычные светодиоды, адресные светодиоды выпускаются на разное напряжение питания: 5 вольт, 12 вольт и даже 220 вольт.

У меня под рукой оказалось несколько светодиодов WS2812b в SMD-исполнении и корпусе 5050, их и рассмотрим в качестве примера.

-2

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

Данная модель имеет 4 вывода.

  • Вывод 1 ‒ VDD ‒ Плюс напряжения питания, от 3.5 до 5.3 вольт
  • Вывод 2 ‒ DOUT ‒ Выходной сигнал управления данными
  • Вывод 3 ‒ VSS ‒ Общий провод
  • Вывод 4 ‒ DIN ‒ Входной сигнал управления данными

Для кодирования одного из трёх цветов кристалла светодиода используется 8 бит или 1 байт данных, всего 256 возможных градаций.

Соответственно на все три цвета светодиода потребуется 24 бита или 3 байта информации. При этом светодиод способен зажигаться аж 16777216 оттенками цвета.

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

Следующие биты данных передаются через светодиод от входа DIN к выходу DOUT и по цепочке дальше.

-3

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

При этом старшие биты в посылке должны пересылаться первыми.

-4

Протокол передачи данных называется NRZ. Подробнее почитать про данный метод кодирования можно здесь.

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

Они довольно жесткие.

Общее время передачи нуля или единицы должно составлять 1.25 микросекунд ±150 наносекунд.

При этом ноль передается как импульс высокого уровня длительностью 0.35 микросекунд и импульс низкого уровня длительностью 0.9 микросекунд. С допуском импульсов в ±150 наносекунд.

Единица передается как как импульс высокого уровня длительностью 0.9 микросекунд и импульс низкого уровня длительностью 0.35 микросекунд. С допуском импульсов в ±150 наносекунд.

-5

Если в промежутке между посылками сделать паузу ‒ выставить на линии низкий уровень длительностью более 50 микросекунд, то микроконтроллерами светодиодов это будет воспринято как код RESET, сброс. В данном случае светодиоды продолжат гореть, но со следующей посылки снова начнёт кодироваться самый первый светодиод в цепочке.

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

При таких временных характеристиках скорость передачи данных в линии должна составлять 800Kbps. А управляющий микроконтроллер ATmega328P при этом должен работать на частоте 8 мГц или выше.

Из этих технических требований становится ясным, что:

‒ на языках программирования высокого уровня таких длительностей импульсов достичь вряд ли получится, поэтому стандартные функции вроде digitalWrite и delay, waitms и waitus здесь бесполезны

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

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

Для работы в Arduino-IDE такими библиотеками являются FastLED и Adafruit NeoPixel.

Для работы в Bascom-AVR, начиная с версии 2.0.7.9 можно использовать встроенную библиотеку Rainbow, разработанную Galahat.

В демонстрационной версии Bascom-AVR она также доступна.

2. И чуть-чуть предварительной практической подготовки

Для работы с адресными светодиодами сначала потребуется подготовка комплектующих.

Я не стал покупать светодиодную ленту или уже готовую полоску светодиодов, решив сделать её самостоятельно.

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

-6

Расположил схему на полоске фольгированного стеклотекстолита.

Вытравил на ней дорожки печатной платы с помощью ЛУТ [лазерно-утюжной технологии].

Подробнее об изготовлении печатных плат методом ЛУТ можно прочитать, например, здесь.

В данном случае жёлтая термобумага подошла не очень хорошо, рисунок платы с нее смазывался при печати.

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

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

Копируем его в любой редактор, да хотя бы и в MS Word, выставляем размеры 92 мм х 13 мм и печатаем на лазерном принтере с отключенным режимом экономии тонера. Потом готовим печатную плату методом ЛУТ.

-7

Расположение элементов на плате.

-8

Используются SMD-конденсаторы типоразмера 0805 и SMD-резистор типоразмера 1206.

Детали, кроме трёхконтактного разъёма для подключения, паяются на стороне печатных проводников.

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

Круглые отверстия в центре платы, как и печатные полоски на её концах, понадобятся в будущем для крепления.

Готовая для экспериментов плата со светодиодами выглядит так.

-9

Впрочем, если возня с печатными платами, ЛУТ, травлением в хлорном железе и пайкой не для вас, можно всегда купить уже готовую полоску светодиодов в любом радиолюбительском магазине, торгующем модулями для Arduino. Можно в TIXER.RU, можно на AliExpress, например здесь или здесь.

Источник фото: https://ae01.alicdn.com/kf/HTB1eAIEheuSBuNjSsplq6ze8pXa9.jpg
Источник фото: https://ae01.alicdn.com/kf/HTB1eAIEheuSBuNjSsplq6ze8pXa9.jpg

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

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

3. Собираем тестовый стенд

Для сборки тестового стенда, нам, как и в прошлый раз понадобятся:

  • модуль Arduino Nano
-11
  • одна большая или пара маленьких беспаечных макетных плат
  • USB-кабель для загрузки прошивки из компьютера в Arduino
  • четыре разноцветных проводка с разъёмами-иголками
  • Также потребуется дополнительный кабель для отдельного питания светодиодов. Считается, что каждый пиксель адресного светодиода потребляет до 20 мА, весь светодиод около 60 мА. Полоска из восьми светодиодов может потреблять 480 мА, если же вы используете ленту, то ток потребления будет составлять амперы. Поэтому запитывать светодиоды нужно отдельно, чтобы не перегружать по току цепи питания платы Arduino. Подробнее о подведении питания к адресным светодиодам можно прочитать здесь.
-12

Для отдельного питания светодиодов я буду использовать ещё один USB-кабель от второго USB-порта компьютера. Подключать к макетной плате его удобно с помощью самодельного разведенного на отдельной печатной плате USB-разъёма. Или можно использовать сетевой блок питания на 5 вольт.

-13

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

Распиновка платы Arduino Nano Rev3.2 Источник: http://arduino.zl3p.com/infa/pins_nano
Распиновка платы Arduino Nano Rev3.2 Источник: http://arduino.zl3p.com/infa/pins_nano

Собранная наглядная схема тестового стенда во Fritzing выглядит так.

-15

Схема электрическая принципиальная при этом такая.

-16

А собранный тестовый стенд имеет вот такой вид.

-17

4. Пробуем программировать

Наконец-то добрались и до программирования.

Подключаем тестовый стенд к USB-порту компьютера, подаем дополнительное питание на светодиоды, проверяем, что в диспетчере устройств Windows порт определился корректно.

Запускаем Bascom-AVR.

[Более подробно о процессе компиляции программ и загрузки очередной прошивки кода из Bascom-AVR в микроконтроллер Arduino можно прочитать здесь].

Первый пример кода использования библиотеки Rainbow, взят один к одному из документации Bascom-AVR, добавлены лишь комментарии и изменена яркость цветов. Для удобного просмотра на экране вашего устройства можно увеличивать рисунки, щёлкая по ним мышью или открывая в отдельной вкладке.

Скачать исходный код можно отсюда.

-18

Некоторые пояснения вдобавок к комментариям в коде.

Конфигурация параметров библиотеки задается строкой вида

Config RAINBOW=1, RB0_LEN=8, RB0_PORT=PORTB, rb0_pin=0 'Используем 1 канал ‒ В канале 8 светодиодов ‒ Подключены к порту PB0 ‒ вывод D8 Arduino

Командой RB_SelectChannel 0 'Выбираем первый канал, он же у нас и единственный

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

Командой RB_SetColor 0 , color(1) 'Установим цвет первого светодиода, нумерация начинается с нуля

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

Команда RB_Send обновляет состояние светодиодов.

Команды

RB_Shiftright 0, Numleds и RB_Shiftleft 0, Numleds

сдвигают вправо и влево по линейке на одну позицию текущее значение цвета горящего светодиода.

О других командах библиотеки Rainbow вы можете почитать в документации к Bascom-AVR самостоятельно.

Как правило, все они начинаются с буквосочетания RB_ .

-19

Одинокий огонёк бегает по линейке светодиодов вперед и назад.

[Прошу извинить меня за качество видео, как оказалось моя техника не совсем корректно воспринимает цвета горящих светодиодов, попросту их засвечивая. Я попытался исправить положение, закрыв светодиоды рассеивающей свет полоской бумаги из школьной тетради, стало немного лучше. Но в реальности цвета гораздо красочнее и сочнее, чем на видео].

Пример 2 кода можно скачать отсюда. Получен незначительной модификацией кода из примера 1.

-20

Здесь играем сочетанием основных цветов, последовательно зажигая и погашая светодиоды.

Еле ползающая разноцветная гусеница. Исходный код программы здесь.

-21

Выглядит она так.

Ещё восемь разноцветных гусениц. Ползают шустро. Код программы здесь.

-22

Выглядят так.

Перебор цветов по всем светодиодам сразу. Код программы здесь.

-23

Этот эффект выглядит так.

"Каждый Охотник Желает Знать Где Сидит Фазан".

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

Исходный код можно скачать отсюда.

-24

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

-25

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

-26

Вот её картинка.

-27

И если сначала задать распределение цветов случайным образом...

-28

...То потом можно ими помигать, плавно изменяя яркость.

Исходный код программы можно скачать отсюда.

Больше эффектов, хороших и разных, вы сможете придумать самостоятельно.

А если реализуете их на практике, то будет совсем замечательно.

18 марта 2020 года.

С уважением, Ваш @mp42b.

Предыдущие статьи по данной теме:

1. Про температурные датчики MTH02, их функциональные аналоги и Arduino

2. Arduino, Bascom-AVR и трёхцветный светодиод Piranha. Помигаем? ‒ Тестовый стенд

-29