Визуализатор спектра

Тема в разделе "Arduino & Shields", создана пользователем rbibokon, 23 май 2017.

  1. rbibokon

    rbibokon Нерд

    Что ?)
     
  2. rbibokon

    rbibokon Нерд

    Вообщем. https://vk.com/doc118923806_445867854?hash=ef4e097bd43e31d390&dl=167b3e80e69e6ce397
    по этой инструкции используется микрофон, я вместо него сдела провод: миниДЖЭК-2 провода(земля и левый канал) и воткнул как в этой инструкции только без питания. В итоге при подключении к телефону матрица что-то показывает. Но единственное непонятно что, так как запускал генератор частот на мобиле и экран показывал всякую фигню, то есть не мог найти разбиение 8 столбцов по частотам, что бы на генераторе включить 1 частоту и на экране загорелся 1 столбец. Могу снять видео. Еще вот провод с миниджеком подключил через 10кОм, этого не много? так как в телефоне вставляются наушники сопротивлением 10-40 ом, а тут аж 10кОм.
    Ниже представлен код программы
    Код (C++):
    #include "LedControlMS.h"
    #include "fix_fft.h"
    #include <LedControlMS.h>
    #include <fix_fft.h>
    char im[128];
    char data[128];
    int i=0;
    int j=0;
    int k=0;
    int l0;
    int l1;
    int l2;
    int l3;
    int l4;
    int l5;
    int l6;
    int l7;
    LedControl lc=LedControl(12,11,10,1);
    void setup() {
      ADCSRA = (1<<ADEN)|(1<<ADPS0)|(0<<ADPS1)|(1<<ADPS2); // sps=500k ~f=10k
    lc.shutdown(0,false);
      /* Set the brightness to a medium values */
    lc.setIntensity(0,1);
      /* and clear the display */
    lc.clearDisplay(0);
    pinMode(A0, INPUT);
    }
    void loop() {
      for (i=0; i< 128; i++){

          if(analogRead(A0)>20){
            data[i] = analogRead(A0)/10;
    }else{data[i]=0;}
    im[i] = 0;                                                      
      };
    fix_fft(data,im,7,0);

      for (i=0; i<64;i++){      
          data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);
          data[i] = map(data[i], 0, 30, 0, 32);  
      };
      l0=(data[0] + data[1] + data[2] + data[3] + data[4]+ data[5] + data[6] + data[7])/8;
      l1=(data[8] + data[9] +data[10] + data[11] + data[12] + data[13] + data[14] + data[15])/3;
      l2=(data[16] + data[17] + data[18] + data[19] + data[20]+ data[21] + data[22] + data[23])/2;
      l3=(data[24] + data[25] +data[26] + data[27] + data[28] + data[29] + data[30] + data[31])/2;
      l4=(data[32] + data[33] + data[34] + data[35] + data[36]+ data[37] + data[38] + data[39])/2;
      l5=(data[40] + data[41] +data[42] + data[43] + data[44] + data[45] + data[46] + data[47])/2;
      l6=(data[48] + data[49] + data[50] + data[51] + data[52]+ data[53] + data[54] + data[55])/2;
      l7=(data[56] + data[57] +data[58] + data[59] + data[60] + data[61] + data[62] + data[63])/2;
    i=0;
    for (i=0; i< l0;i++){
    lc.setLed(0,0,i,true);
    }
    i=0;
    for (i=0; i< l1;i++){
    lc.setLed(0,1,i,true);
    }
    i=0;
    for (i=0; i< l2;i++){
    lc.setLed(0,2,i,true);
    }
    i=0;
    for (i=0; i< l3;i++){
    lc.setLed(0,3,i,true);
    }
    i=0;
    for (i=0; i< l4;i++){
    lc.setLed(0,4,i,true);
    }
    i=0;
    for (i=0; i< l5;i++){
    lc.setLed(0,5,i,true);
    }
    i=0;
    for (i=0; i< l6;i++){
    lc.setLed(0,6,i,true);
    }
    i=0;
    for (i=0; i< l7;i++){
    lc.setLed(0,7,i,true);
    }
    i=0;

    delay(50);
    lc.clearDisplay(0);
    }
     
     
  3. rbibokon

    rbibokon Нерд

    померил провод миниджек-2 провода на мультиметре с выхода телефона он дает 3мВ, так может резистор вообще не нужен?
     
  4. mcureenab

    mcureenab Гуру

    Входы A0 и т.д. имеют сопротивление более мегаома. Так что 10кОм для измерений погоды не сделают.
    3мВ мало.
     
  5. mcureenab

    mcureenab Гуру

    Ешьте крокодила по частям.
     
  6. mcureenab

    mcureenab Гуру

    Код (C++):
      for (i=0; i< 128; i++){

          if(analogRead(A0)>20){ // это зачем? Ну будет число около 0 и ладно.
            data[i] = analogRead(A0)/10; // analogRead долго выполняется!
    }else{data[i]=0;}
    im[i] = 0;                                                    
      };
     
  7. mcureenab

    mcureenab Гуру

    Код (C++):
      for (i=0; i< 128; i++){
            data[i] = analogRead(A0)/10;
            im[i] = 0;                                                    
      };
     
  8. mcureenab

    mcureenab Гуру

    Код (C++):
    lc.clearDisplay(0);
    Делайте очистку экрана перед тем как его обновить, а не сразу после.
     
  9. rbibokon

    rbibokon Нерд

    Код до этого поправил а очистку в каком моменте вы имеете ввиду? в самом начале или конце кода? И на счет 3мВ что показал мультиметр то и написал) а уж мало или нет это сколько телефон выдает
     
  10. mcureenab

    mcureenab Гуру

    Здесь начинается рисование. Значит перед этим очистку надо делать.

    Код (C++):
    i=0;
    for (i=0; i< l0;i++){
    А так, только нарисовали, и все сразу стерли.
     
  11. rbibokon

    rbibokon Нерд

    ну изменил) а дальше что. получается он нифига не частоты показывает а уровень звука)))
     
  12. mcureenab

    mcureenab Гуру

    Действуй по плану

    2. Аппаратная подготовка сигнала к оцифровке - усиление/ослабление, фильтр НЧ, сдвиг уровня 0. Контроль сигнала на выходе осциллографом. Звуковой платой ПК.
    3. Оцифровка сигнала с сохранением в массив. Контроль результата через монитор порта. Проверка качества шага 2.


    Сейчас не пончтно что в обработку попадает.
     
  13. rbibokon

    rbibokon Нерд

    Вот можно по подробнее что за сдвиг уровня 0 ?
     
  14. mcureenab

    mcureenab Гуру

    Читайте

     
  15. mcureenab

    mcureenab Гуру

    Среднее напряжение сигнала должно быть 2.5 В.
     
  16. mcureenab

    mcureenab Гуру

    Из доки FIX_FFT

    ( analogRead(A0) - 511 ) умножать надо на 64, а вы делите на 10. Зачем?
     
  17. rbibokon

    rbibokon Нерд

    загрузил этот скетч он выдает квадратики какие то и все, ни какой полезной информации
     
  18. mcureenab

    mcureenab Гуру

    Настройте скорость монитора порта 250000 бит/сек

    Или в скетче поменяйте скорость
     
  19. rbibokon

    rbibokon Нерд

    Так в скетче так и стоит 250000 что там менять? Какая схема сборки для этого скетча? Просто мой провод с миниджеком? И что на него подавать какой звук?
     
  20. mcureenab

    mcureenab Гуру

    Ну на 9600 поменяй, раз на 250000 не работает. И в скетче поменяй и в мониторе порта.