спектроанализатор звука arduino

Тема в разделе "Arduino & Shields", создана пользователем sanik, 2 ноя 2014.

  1. sanik

    sanik Гик

    Здравствуйте нужен простейший анализатор звука, подскажите пожалуйста как мне выделить всего три полосы средние низкие и высокие частоты и записать их в переменные?
     
  2. Unixon

    Unixon Оракул Модератор

    ИгорьК и Pi-Tone нравится это.
  3. sanik

    sanik Гик

    Я имел в виду программно.
     
  4. Pi-Tone

    Pi-Tone Нерд

    MSGEQ7 - офигенна! посмотрел datasheet и заказал! Спасибо Unixon!
     
  5. Unixon

    Unixon Оракул Модератор

    Это работа не для AVR-ок, тут кое-что помощнее нужно :)
     
  6. sanik

    sanik Гик

    Спасибо! Буду тогда трехполосный фильтр собирать...
     
  7. sanik

    sanik Гик

    Заказал MSGEQ7. Подскажите пожалуйста как в этом коде вместо выходов на светодиоды, записать полученные значения в три переменных? И можно ли назначить другие пины для RESET и Strobe?
    Код (Text):

    #define msg7RESET 11
    #define msg7Strobe 12
    #define msg7DCout 0
    const int LEDpins[7] = {3,5,5,6,9,9,10};  // массив выводов для светодиодов. Т.к. используется только 5, то некоторые частоты повторяются

    void setup() {                
      for (int x=0; x<7; x++) {
          pinMode(LEDpins[x], OUTPUT);    // инициализация выходов для LED
      }
      pinMode(msg7RESET, OUTPUT);
      pinMode(msg7Strobe, OUTPUT);
    }

    void loop() {
        digitalWrite(msg7RESET, HIGH);   // осуществляем сброс MSGEQ7
        delay(5);
        digitalWrite(msg7RESET, LOW);

        for (int x = 0; x < 7; x++){             // семь частот - семь стробирующих импульсов
            digitalWrite(msg7Strobe, LOW);
            delayMicroseconds(35);           // ждем установления значения 35 мкс
            int spectrumRead = analogRead(msg7DCout);      // считываем значение с аналогового входа

            int PWMvalue = map(spectrumRead, 0, 1024, 0, 255);  // преобразовываем диапазон 0-1024 к диапазону 0-255 для ШИМ
            if (PWMvalue < 50)       // небольшой программный фильтр шума
                PWMvalue = PWMvalue / 2;

            analogWrite(LEDpins[x], PWMvalue);
            digitalWrite(msg7Strobe, HIGH);
        }
    }
     
     
  8. Unixon

    Unixon Оракул Модератор

    Эээ... не понял. Вы не знаете, как сделать a = b? В чем проблема то с присвоением переменных?
    Можно. А как вы думаете, откуда в программе вообще эти номера выводов взялись?
     
  9. sanik

    sanik Гик

    Как этот код работает я понимаю понял и то что в нем нужны выходы с PWM для светодиодов что переменая считаная с аналогово входа для них это spectrumRead мне светодиоды не нужны мне нужно выделить три частоты и записать их в три переменные я не знаю как их выбрать из общего массива..
     
  10. Unixon

    Unixon Оракул Модератор

    int spectrumRead[8];
    // ...
    void loop()
    // ...
    for (int x = ...
    // ...
    spectrumRead[x] = analogRead(msg7DCout);
    // ...
    // убираем analogWrite


    Потом из массива достаете нужные компоненты.
     
  11. sanik

    sanik Гик

    Эту часть кода
    Код (Text):
          int PWMvalue = map(spectrumRead, 0, 1024, 0, 255);  // преобразовываем диапазон 0-1024 к диапазону 0-255 для ШИМ
            if (PWMvalue < 50)      // небольшой программный фильтр шума
                PWMvalue = PWMvalue / 2;
    Мне нужно привести в такой вид
    Код (Text):
            int PWMvalue = map(spectrumRead1, 0, 1024, 0, 255);  // преобразовываем диапазон 0-1024 к диапазону 0-255 для ШИМ
            if (PWMvalue < 50)      // небольшой программный фильтр шума
                PWMvalue = PWMvalue / 2;
            int PWMvalue = map(spectrumRead2, 0, 1024, 0, 255);  // преобразовываем диапазон 0-1024 к диапазону 0-255 для ШИМ
            if (PWMvalue < 50)      // небольшой программный фильтр шума
                PWMvalue = PWMvalue / 2;
             
            int PWMvalue = map(spectrumRead3, 0, 1024, 0, 255);  // преобразовываем диапазон 0-1024 к диапазону 0-255 для ШИМ
            if (PWMvalue < 50)      // небольшой программный фильтр шума
                PWMvalue = PWMvalue / 2;
    По другому я не умею(
     
  12. Unixon

    Unixon Оракул Модератор

    int PWMvalues[8];
    // ...
    void loop()
    // ...
    for (int x = ...
    // ...
    int spectrumRead = analogRead(msg7DCout);
    int PWMvalue = map(spectrumRead, 0, 1024, 0, 255);
    if (PWMvalue < 50) PWMvalue = PWMvalue / 2;
    PWMvalues[x] = PWMvalue;
    // ...
    // убираем analogWrite
     
  13. Unixon

    Unixon Оракул Модератор

    Потом после цикла берете свои три значения из нужных компонент PWMvalues[];
     
  14. sanik

    sanik Гик

    Код (Text):
    PWMvalues[x]
    Получил я восемь иксов а дальше то что с ними делать?
     
  15. sanik

    sanik Гик

    У меня сейчастак
    Код (Text):
      Tlc.set(chanelValue, sum);
      Tlc.update();
    Получается нужно так?
    Код (Text):
    Tlc.set(PWMvalues [x],PWMvalues [x]);
      Tlc.update();
     
  16. Unixon

    Unixon Оракул Модератор

    А что вы с этими амплитудами сигналов в полосах собирались делать?
     
  17. sanik

    sanik Гик

    Ничего не пойму вот примерно попробовал ошибку дает
    Код (Text):

    #define msg7RESET 11
    #define msg7Strobe 12
    #define msg7DCout 0
    int PWMvalues[8];


    void setup()
    {                

      pinMode(msg7RESET, OUTPUT);
      pinMode(msg7Strobe, OUTPUT);
    }

    void loop()
    {
      digitalWrite(msg7RESET, HIGH);   // осуществляем сброс MSGEQ7
      delay(5);
      digitalWrite(msg7RESET, LOW);

      for (int x = 0; x < 7; x++)
      {            
        digitalWrite(msg7Strobe, LOW); // семь частот - семь стробирующих импульсов
        delayMicroseconds(35);           // ждем установления значения 35 мкс
        int spectrumRead = analogRead(msg7DCout);
        int PWMvalue = map(spectrumRead, 0, 1024, 0, 255);
        if (PWMvalue < 50) PWMvalue = PWMvalue / 2;
        PWMvalues[x] = PWMvalue;
      }
    }
     
     
  18. sanik

    sanik Гик

    Амплитуды замапить одну на количество каналов
    Код (Text):
    int PWMvalue = map(spectrumRead, 0, 1024, 0, 16);
    Вторую на яркость
    Код (Text):
    PWMvalue = map(spectrumRead, 0, 1024, 0, 4095);
    Третью на периодическую очистку каналов
    Код (Text):
    if (delaylValue < 30)
      {
          Tlc.clear();
      }
     
  19. sanik

    sanik Гик

    У меня сейчас это все работает от трех микрофонов подключенных к аналоговым входам
     
  20. sanik

    sanik Гик

    Так как же все таки выдернуть из массива три значения?