MSGEQ7 - неправильное определение частоты
- Войдите на сайт для отправки комментариев
Всем привет! Пытаюсь собрать логический анализатор на MSGEQ7. Перечитал массу статей, как на русском, так и на английском. Везде применены одни и те же скетч и схема:
#define msg7RESET 11
#define msg7Strobe 12
#define msg7DCout 0
const int LEDpins[7] = {3,5,5,6,9,9,10}; // there are 5 LEDs and 7 freq bands. So, repeat LEDs
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
for (int x=0; x<7; x++) {
pinMode(LEDpins[x], OUTPUT);
}
pinMode(msg7RESET, OUTPUT);
pinMode(msg7Strobe, OUTPUT);
}
void loop() {
digitalWrite(msg7RESET, HIGH); // reset the MSGEQ7's counter
delay(5);
digitalWrite(msg7RESET, LOW);
for (int x = 0; x < 7; x++){
digitalWrite(msg7Strobe, LOW); // output each DC value for each freq band
delayMicroseconds(35); // to allow the output to settle
int spectrumRead = analogRead(msg7DCout);
int PWMvalue = map(spectrumRead, 0, 1024, 0, 255); // scale analogRead's value to Write's 255 max
if (PWMvalue < 50)
PWMvalue = PWMvalue / 2; // bit of a noise filter, so the LEDs turn off at low levels
analogWrite(LEDpins[x], PWMvalue);
digitalWrite(msg7Strobe, HIGH);
}
}
Я все собрал на Меге2560. И поставил 6 светодиодов вместо 5-ти. Массив светодиодов у меня выглядит вот так: const int LEDpins[7] = {3,4,4,5,6,7,8};
Все собрал - в результате на звук реагирует только светодиод, который подключем к 3-му пину. Остальные лишь тускло горят, и не меняют свою яркость. 100 раз пересмотрел схему - все правильно. В сети ответа не нашел. Начал сам експериментировать с кодом. Вот что у меня получилось:
#define msg7RESET 9
#define msg7Strobe 10
#define msg7DCout 0
const int LEDpins[7] = {3,4,4,5,6,7,8}; // массив выводов для светодиодов. Т.к. используется только 5, то некоторые частоты повторяются
void setup() {
for (int x=0; x<7; x++) {
pinMode(LEDpins[x], OUTPUT);
}
pinMode(msg7RESET, OUTPUT);
pinMode(msg7Strobe, OUTPUT);
}
void loop() {
for (int x = 0; x < 7; x++){
digitalWrite(msg7RESET, HIGH); // reset the MSGEQ7's counter
digitalWrite(msg7Strobe, LOW); // output each DC value for each freq band
delay(3);
delayMicroseconds(25); // to allow the output to settle
int spectrumRead = analogRead(msg7DCout);
int PWMvalue = map(spectrumRead, 0, 1024, 0, 255); // scale analogRead's value to Write's 255 max
if (PWMvalue < 30)
PWMvalue = PWMvalue / 2; // bit of a noise filter, so the LEDs turn off at low levels
analogWrite(LEDpins[x], PWMvalue);
digitalWrite(msg7Strobe, HIGH);
digitalWrite(msg7RESET, LOW);
}
}
В результе реакция на звук есть у всех 6-ти светодиодов, но реакция не на все частоты. Точно определить не могу на какие частоты есть реакция. Получается вместо всей полосы частот берется только какая-то часть и раскладывается на все 6 светодиодов. Конечно, они чуть-чуть по разному горят, но все же это не полноценный эквалайзер, и нет такого что бы горели только отдельные светодиоды. Нет реакции как в видео из статьи: https://www.baldengineer.com/msgeq7-simple-spectrum-analyzer.html. Там в зависимости от частоты горят определенные светодиоды, у меня же светятся все, правда чуто-чуть по-разному.
Что можете подсказать по этому поводу? Почему первый скетч у меня не заработал? И почему только часть частот?

/* Example program for the MD_MSGEQ7 library Reads the input value from the IC and displays a rolling table on the serial monitor. */ #include <MD_MSGEQ7.h> // hardware pin definitions - change to suit circuit #define DATA_PIN A0 #define RESET_PIN 9 #define STROBE_PIN 10 // frequency reading the IC data #define READ_DELAY 50 MD_MSGEQ7 MSGEQ7(RESET_PIN, STROBE_PIN, DATA_PIN); void setup() { MSGEQ7.begin(); Serial.begin(57600); Serial.println("[MD_MSG_SEQ7_Serial]"); } void loop() { // only read every READ_DELAY milliseconds static long prevTime = 0; if (millis() - prevTime >= READ_DELAY) { prevTime = millis(); MSGEQ7.read(); // Serial output for (uint8_t i=0; i<MAX_BAND; i++) { Serial.print(MSGEQ7.get(i)); Serial.print('\t'); } Serial.println(); } }Сейчас просканировал кодом выше (библиотека MD_MSGEQ7) - из 7-ми полос данные идут только по первой полосе. То есть только бас. По остальным полосам ничего, лишь шумы в пределах 30-40 (из 1023).
В чем может быть проблема? Это MSGEQ7 бракованная? можно ли это как-то исправить?
forfrends, подавайте на вход микросхемы сигнал необходимой амплитуды (уточнить в даташите) с генератора, изменяйте частоту и увидите на какие частоты как реагирует.
Из двух MSGEQ7, купленных в разных местах, обе имели похожий брак: последние два канала дублируют первые два, частоты каналов, которые работают, не соответствуют даташиту. У одной из двух еще неработающий четверный канал и пятый канал не имеет ограничения сверху, то есть реагирует от 10 кГц до 100 и более (далее не проверял). Есть еще похожие жалобы в сети и в отзывах продавцов на AliExpress.
Судя по этому, брака много. Не стоит вообще связываться с MSGEQ7 без проверки или удовлетвориться работающими каналами. Даже на 4х каналах получается неплохая цветомузыка. На плату надо ставить панельку.
Чтобы проверить надо дать нужные сигналы на reset и strobe и подключить осциллограф на выход (3 нога). Затем подавать звуковой сигнал с генератора на вход, меняя его частоту и амплитуду, можно видеть какие полосы на какие частоты реагируют и как активно. На обычном осциллографе всё видно. Если что не так, то скачать даташит и проверить питание, сигнал на входе, временные параметры сигналов reset и strobe и частоту тактового генератора (подключение щупа сдвигает частоту, щуп обязательно через делитель). Если все ОК, но МС работает не так - это брак.