MSGEQ7 - неправильное определение частоты

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет! Пытаюсь собрать логический анализатор на 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. Там в зависимости от частоты горят определенные светодиоды, у меня же светятся все, правда чуто-чуть по-разному.

Что можете подсказать по этому поводу? Почему первый скетч у меня не заработал? И почему только часть частот?

forfrends
Offline
Зарегистрирован: 24.02.2015
/*
 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 бракованная? можно ли это как-то исправить?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

forfrends, подавайте на вход микросхемы сигнал необходимой амплитуды (уточнить в даташите) с генератора, изменяйте частоту и увидите на какие частоты как реагирует.

Stanislav99
Offline
Зарегистрирован: 21.12.2017

Из двух MSGEQ7, купленных в разных местах, обе имели похожий брак: последние два канала дублируют первые два, частоты каналов, которые работают, не соответствуют даташиту.  У одной из двух еще неработающий четверный канал и пятый канал не имеет ограничения сверху, то есть реагирует от 10 кГц до 100 и более  (далее не проверял). Есть еще похожие жалобы в сети и в отзывах продавцов на AliExpress.
Судя по этому, брака много. Не стоит вообще связываться с MSGEQ7 без проверки или удовлетвориться работающими каналами.  Даже на 4х каналах получается неплохая цветомузыка. На плату надо ставить панельку.

Чтобы проверить  надо дать нужные сигналы на reset и strobe и подключить осциллограф на выход (3 нога).  Затем подавать звуковой сигнал с генератора на вход, меняя его частоту и амплитуду, можно видеть какие полосы на какие частоты реагируют и как активно. На обычном осциллографе всё видно. Если что не так, то  скачать даташит и проверить питание,  сигнал на входе, временные параметры сигналов  reset и strobe и частоту тактового генератора (подключение щупа сдвигает частоту, щуп  обязательно через делитель).  Если все ОК, но МС работает не так - это брак.