понедельник, 30 января 2017 г.

Светодиодный индикатор уровня звука. Идея –> реализация –> новая идея.


Светодиод WS2812B

Здравствуйте. Закончились праздники и можно снова приступить к работе. Наверное, многие уже видели наши фотографии светодиодного индикатора уровня - столбики на умных светодиодах WS2812B. Решил в более полном объёме поведать о столбиках. Тем более, что коллеги смотрят на меня непонимающим взглядом: прикольная штуковина, а мало кто о ней знает. Надо исправлять.

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

Первая разработка выглядела так:

Одноцветный светодиодный индикатор уровня звука (2 канала по 16 светодиодов)
Одноцветный светодиодный индикатор уровня звука (2 канала по 16 светодиодов)

Этот индикатор уровня был изготовлен моим коллегой Константином М. и отдан мне на оживление. Два канала, по 16 одноцветных светодиодов каждый, управлялись с помощью микроконтроллера ATmega8 через два 8-битных сдвиговых регистра. Для экономии и удобства использовалась динамическая индикация: одновременно могли светиться только 16 светодиодов одного столбика. Платку я запустил, всё на ней работало, но мне почему-то так и не удалось сделать изменение уровня столбиков красивым.

Вскоре после этого, появилась разработка индикатора уровня интереснее предыдущей:

RGB-индикатор уровня звука (1 канал - 32 светодиода)
RGB-индикатор уровня звука (1 канал - 32 светодиода)

Константин сделал её, прежде всего, для себя. Запустил в какие-то праздники, но разобрал, так и не показав результат. Конечно же, я потом взял платы, чтобы опробовать самому. В качестве прототипа был изготовлен только один канал индикатора уровня. Сам столбик состоит из 32-х RGB светодиодов в виде модуля. Он подключается к ещё одному модулю с 4-я сдвиговыми регистрами, через который осуществляется управление. Мда… За счёт динамической индикации управление очень своеобразное. Четыре 8-битных регистра управляют выбором светодиодов, которые должны светиться в данный момент времени, а с помощью трёх выводов задаётся цвет (R, G или B). Остаётся только добавить плату с микроконтроллером и вперёд. Здесь удалось зайти дальше, чем в предыдущей версии столбиков. Сначала попробовал сделать всё с помощью Arduino Due:

Arduino Due
Arduino Due

Микроконтроллер, работающий на частоте 84 MHz с Arm архитектурой внутри, был как нельзя кстати, думал я. Сам столбик поддерживал 8 градаций яркости для каждого цвета светодиода (R, G и B). В один момент времени можно было зажечь только один цвет, поэтому приходилось раз в 1 мс передавать одну из 24-х комбинаций значений на светодиоды. Помимо этого, необходимо было работать с АЦП, производить расчёты десятичного логарифма и прочие вычисления. Кроме как в среде Arduino с этим микроконтроллером не доводилось работать, поэтому получился неоптимизированный Arduino-код. Но даже несмотря на это, Arduino Due справлялась хорошо.

А почему мы пишем программу под какой-то малоизвестный Arm контроллер? Подумали и взяли отладочную плату на микроконтроллере STM8S105C6T6:

Отладочная плата STM8S105C6T6
Отладочная плата STM8S105C6T6

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

Решение у нас было, но в этот раз до его реализации мы не добрались. Потому что однажды – это был обычный четверг – случилось следующее: ещё один мой, не менее ценный, коллега Денис В. произнёс свою коронную фразу: "Смотрите, какую я прикольную штуку нашёл"! Это была лента на умных светодиодах WS2812B:

Светодиод WS2812B
Светодиод WS2812B

Ей для подключения необходимо всего 3 провода (сигнал, питание 5 В и общий провод). Круто, прощай охапка лишних проводов – подумали мы и заказали ленту на пробу:

Лента на умных светодиодах WS2812B
Лента на умных светодиодах WS2812B

Про эту ленту на светодиодах WS2812B много рассказано на просторах интернета - всегда можно найти что-нибудь интересное и подходящее. В основном люди делают из неё различные "светилки". Получается красиво – ещё бы, потребление "раскалённого добела" светодиода составляет 40 мА. Если лента длинная, к порту USB компьютера её не подключишь. Требуется достаточно мощный источник питания - задача, которую предстояло решить. Несмотря на эту сложность, прельщало удобство управления столбиками по одному проводу. Почему бы не сделать из этой ленты конструктор индикатора уровня, чтобы была возможность менять цветовые схемы, переключать режимы... А поможет в этом плата Arduino Pro Mini на микроконтроллере ATmega328. Её легко программировать с помощью переходника UART–USB. Была ещё одна трудность: очень короткие тайминги между загрузкой данных. "Светилки", конечно, у людей получались… Но нам хотелось во время отправки данных ещё успевать брать значения с АЦП, читать из памяти, сохранять, производить вычисления... Поэтому, пока лента была в пути, обдумывали, возможность использования аппаратного SPI, а точнее сигнала MOSI для организации передачи с прерываниями. Будет ли контроллер всё успевать? Или придётся оптимизировать код, как-то исхитряться, лезть в ассемблер - это предстояло выяснить. Но мы уже знали точно и с прошлой реализации столбика утвердили: количество светодиодов на канал будет 32 штуки. Итого, нужно было обрабатывать 64 умных светлячка на два столбика. Забегая вперёд, хочу сказать, что WS2812B были освоены. Я ещё помучаюсь с программной частью, расскажу про аппаратную - будет продолжение.

P.S. Появилось и ещё одно развитие столбиков. То самое решение, которое на время отложилось из-за находки WS2812B, но, благодаря ей, модернизировалось и упростилось. Оно позволит использовать любые обычные светодиоды (одноцветные и RGB) и более мощное освещение: даже прожекторы. Более того, столбики - это малая часть того, что может появиться из нашей идеи. Об этом как-нибудь в другой раз.

С уважением, Никита О.