Вниманию пользователей электронного портала KAZUS.RU представляется несложный в сборке семиполосный графический эквалайзер. Внешне эквалайзер представляет собой семь столбцов (по количеству полос) из светодиодов разного цвета расположенных в порядке цветов радуги. В каждом столбце 10 светодиодов — 10 уровней сигнала.
Принципиальная схема устройства показана выше. Аудиосигнал с выхода музыкального центра, звуковой карты компьютера либо смартфона поступает на вход специализированной микросхемы MSGEQ7. Данная интегральная схема компании Mixed Signal Integration представляет собой 7-канальный анализатор спектра в корпусе DIP-8 и током потребления 1 мА, являясь к тому же абсолютно доступным по цене. MSGEQ7 способен из входного аудиосигнала выделить частотные полосы 63Гц, 160Гц, 400Гц, 1кГц, 2.5кГц, 6.25кГц и 16кГц:
MSGEQ7 управляется по двум цифровым входам Reset (вывод 7) и Strobe (вывод 4). После стартового импульса Reset, достаточно подать семь стробирующих импульсов на линию Strobe, в результате чего после каждого стробирующего импульса, на выходе Out (вывод 3) будет появлятся напряжение, пропорциональное содержанию одной из семи частотных полос в аудиосигнале.
Выход микросхемы MSGEQ7 подключен ко входу микросхемы светодиодного индикатора уровня LM3915. Данная микросхема имееть десять выходов, состояние которых зависит от уровня входного сигнала. Схемой управляет микроконтроллер ATMEGA328, я решил использовать готовую плату Arduino Nano. В сети много проектов, использующих аж целых семь корпусов LM3915. Я решил использовать динамическую индикацию и одну микросхему LM3915. Микроконтроллер формирует сигнал Reset для MSGEQ7 и после этого выдает семь стробирующих сигналов Strobe. Одновременно, он включает один из транзисторных ключей столбцов нашего индикатора и данный столбец отображает уровень сигнала с LM3915, которая подключена к строкам нашего индикатора.
Я использовал светодиоды семи цветов (красный, оранжевый, желтый, "теплый белый", зеленый, синий и розово-фиолетовый) для отображения всех семи частотных полос. Так как у светодиодов разных цветов разное напряжение питания, разный ток и разная яркость, для того, чтобы получить одинаковый световой поток при работе нашего экрана, я использовал возможность микросхемы LM3915 задавать выходной ток. При каждом переключении столбца, микроконтроллер в зависимости от номера столбца с помощью PWM (ШИМ) и простого RC-фильтра формирует на выводах 6 и 7 LM3915 напряжение, соответствующее необходимой яркости столбца. Таким образом решена проблема неравномерной яркости разных типов светодиодов. Единственное, что потребовалось для этого — поднять частоту ШИМ Arduino с дефолтных 500Гц до 64кГц (первые две строчки в секции setup скетча).
Насколько мне известно, иногда попадаются не совсем качественные экземпляры MSGEQ7. Характеризуют их шумы на выходе даже при заземленном входе. Т.е. даже при отсутствии сигнала на экране будут видны хаотичные выбросы. По всей видимости мне попалась именно такая микросхема. Поэтому, я дополнительно с выхода Out завожу сигнал на АЦП микроконтроллера (А7). С помощью нескольких строк кода, микроконтроллер анализирует входной сигнал, и подавляет отображение шумов, просто не включая ключ столбца.
Скетч для микроконтроллера показан ниже:
Код:
#define STROBE_PIN 11 // MSGEQ7 PIN 4 #define RESET_PIN 12 // MSGEQ7 PIN 7 #define PWM_PIN 10 // УПРАВЛЕНИЕ ЯРКОСТЬЮ #define SOUND_PIN A7 // АНАЛИЗ УРОВНЯ СИГНАЛА
byte band_pins[7]={2,3,5,6,7,8,9}; // ПОРТЫ СТОЛБЦОВ byte band_bright[7]={40,100,0,180,230,130,10}; // УРОВНИ ЯРКОСТИ ДЛЯ КАЖДОГО ЦВЕТА byte band_analys[7]; // МАССИВ ДЛЯ АНАЛИЗА УРОВНЕЙ byte band_counter;
void MSGEQ7(){ digitalWrite(RESET_PIN,HIGH); delayMicroseconds(1); digitalWrite(RESET_PIN,LOW); delayMicroseconds(72); for (int i=0; i<7; i++) { band_counter=0; analogWrite(PWM_PIN, band_bright[i]); digitalWrite(STROBE_PIN,LOW); delayMicroseconds(36); band_analys[i]=map(analogRead(SOUND_PIN),5,1023,0,255); if (band_analys[i]>4) { for (int j=0; j<7; j++) if ((j!=i) && (band_analys[j]>4)) band_counter++; } if (band_counter>2) digitalWrite(band_pins[i],LOW); delayMicroseconds(1600); digitalWrite(band_pins[i],HIGH); digitalWrite(STROBE_PIN,HIGH); delayMicroseconds(36); } }
Как было отмечено выше, я использовал плату Arduino Nano — единственное, что мне пришлось "модифицировать", это выпаять защитный диод по питанию USB и заменить его на перемычку. На нем "просаживалось" напряжение и схема работала нестабильно. Также по питанию стоит электролитический конденсатор емкостью не менее 1000мкф для того, чтобы в моменты, когда на экране горят почти все светодиоды, не просаживалось напряжение на шине USB. Также стоит заметить, что при питании схемы от USB компьютера, лучше использовать USB-хаб с внешним питанием, это минимизирует помехи по шине USB. Для эквалайзера печатной платы не разрабатывалось, вся конструкция собрана на двух макетных платах. На видео ниже вы можете увидеть работу эквалайзера.
Принципиальная схема графического эквалайзера и код для микроконтроллера доступны по этой ссылке.