Светомузыка

WOTgamer
Offline
Зарегистрирован: 05.05.2016


помогите плиз

делаю светомузыку на ардуино мега 2560 по такой схеме 

  

когда подключаю оцелограф наблюдаю сильные шумы частотой 40-60 ГЦ

как от них можно избавиться???

может можно с кодом что-либо сделать

#include <Adafruit_NeoPixel.h>
#define LOG_OUT 1
#define FHT_N 256
#include <FHT.h> 
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

const int color_movie[10]={0,25,50,75,100,125,150,175,200,225};
int R,G,B;
int value[10];
int max=0,min=5000;



// -------------------------------- НАСТРОЙКИ --------------------------------начало
#define LOW_FILTR 40       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define HIGH_FILTR 30
#define Brightness 8      // яркость ленты  
#define low_k 0.9         // коэффициент усиления низких частот
#define medium_k 1.2      // коэффициент усиления средних частот
#define high_k 1.8         // коэффициент усиления высоких частот                                                                                                                                                                                 
#define AUDIO_IN A1
#define DELAY 4           // задержка между обновлениями ленты (периодичность основного цикла), миллиисекунды
#define lenta_pin 2

// -------------------------------- НАСТРОЙКИ --------------------------------конец
Adafruit_NeoPixel lenta = Adafruit_NeoPixel(60, lenta_pin, NEO_GRB + NEO_KHZ800);
void setup() {
  Serial.begin(9600);
  pinMode(lenta_pin,OUTPUT);
  lenta.begin();
  lenta.setBrightness(Brightness);
  
  sbi(ADCSRA, ADPS2);
  cbi(ADCSRA, ADPS1);
  sbi(ADCSRA, ADPS0);
  
 
   for (int pos=0;pos<60;pos++)
  {
       if(pos>=0&&pos<10)R=250;
       if(pos>=10&&pos<20)R=250-color_movie[pos-10];
       if(pos>=20&&pos<40)R=0;
       if(pos>=40&&pos<50)R=color_movie[pos-40];
       if(pos>=50&&pos<61)R=250;

       if(pos>=0&&pos<10)G=color_movie[pos];
       if(pos>=10&&pos<=30)G=250;
       if(pos>=30&&pos<40)G=250-color_movie[pos-30];
       if(pos>=40&&pos<61)G=0;

       if(pos>=0&&pos<20)B=0;
       if(pos>=20&&pos<30)B=color_movie[pos-20];
       if(pos>=30&&pos<50)B=250;
       if(pos>=50&&pos<61)B=250-color_movie[pos-50];
       
       uint32_t Color1 = lenta.Color(R, G, B);
      lenta.setPixelColor(pos,Color1);
R=0;G=0;B=0;
    }
    lenta.show();  // отправить на матрицу
    delay(1000);
}


void loop() {
delay(DELAY); 

analyzeAudio(AUDIO_IN);


for (int i =0;i<45;i++)//удаляем шумы
{
  if (fht_log_out[i]<LOW_FILTR)  fht_log_out[i]=0;
}
for(int i=45;i<128;i++)
{
  if (fht_log_out[i]<HIGH_FILTR) fht_log_out[i]=0;
}

for(int i=0;i<9;i++)value[i]=0;
max=0;
min=5000;
//============================================//ищем маск значения в диапозонах
for(int i=0;i<2;i++)//вот тут значение всегда очень большое около 140 (это шумы)
{
  if(fht_log_out[i]>value[1])value[1]=fht_log_out[i];
}
for(int i=2;i<5;i++)
{
  if(fht_log_out[i]>value[2])value[2]=fht_log_out[i];
}
for(int i=5;i<10;i++)
{
  if(fht_log_out[i]>value[3])value[3]=fht_log_out[i];
}
for(int i=10;i<20;i++)
{
  if(fht_log_out[i]>value[4])value[4]=fht_log_out[i];
}
for(int i=20;i<45;i++)
{
  if(fht_log_out[i]>value[5])value[5]=fht_log_out[1];
}
for(int i=45;i<80;i++)
{
  if(fht_log_out[i]>value[6])value[6]=fht_log_out[i];
}
for(int i=80;i<128;i++)
{
  if(fht_log_out[i]>value[7])value[7]=fht_log_out[i];
}

//=================================//усиливаем сигнал

for (int i=1;i<3;i++)value[i]=value[i]*low_k;
for (int i=3;i<6;i++)value[i]=value[i]*medium_k;
for (int i=6;i<8;i++)value[i]=value[i]*high_k;


for(int i=1;i<9;i++)//ищем самое большое и маленькое значение
{
if(value[i]>max)max=value[i];
if(value[i]<min)min=value[i];
//Serial.println(value[i]);
}

for(int i=1;i<8;i++) //преобазуем к диапозону от 0 до 8 (для светодиодной ленты) 
{
  //value[i]=value[i]/(max-min)*100;
  value[i]=map(value[i],min,max,0,8);
  value[i]=constrain(value[i],0,8);
  Serial.print(value[i]);
  Serial.print("__");
}
Serial.println();

for(int i=0;i<60;i++)lenta.setPixelColor(i,0,0,0);

for(int i=1;i<8;i++)//закрашивание светодиодов
{
  for(int j=1;j<9;j++)
  {
     if(value[i]>=j)
     {
      int position=(i-1)*8+j;
      uint32_t Color1;
      if(position>=0&&position<9)Color1 = lenta.Color(250, 0, 0);
      if(position>=9&&position<17) Color1 = lenta.Color(150,50,0);
      if(position>=17&&position<25) Color1 = lenta.Color(250, 150, 0);
      if(position>=25&&position<33) Color1 = lenta.Color(0, 250, 0);
      if(position>=33&&position<41) Color1 = lenta.Color(0, 250, 250);
      if(position>=41&&position<49) Color1 = lenta.Color(0, 0, 250);
      if(position>=49&&position<57) Color1 = lenta.Color(250, 0, 250);
      lenta.setPixelColor(position,Color1);
     }
  }
}
lenta.show();

}//end loop



void analyzeAudio(int VXOD) {
  for (int i = 0 ; i < FHT_N ; i++) {
    int sample = analogRead(VXOD);
    fht_input[i] = sample; // put real data into bins
  }
  fht_window();  // window the data for better frequency response
  fht_reorder(); // reorder the data before doing the fht
  fht_run();     // process the data in the fht
  fht_mag_log(); // take the output of the fht
}
заранее спасибо
Igor_116
Offline
Зарегистрирован: 09.11.2017

нужно выяснить вам -  фон,

от линейного входа или по питанию

WOTgamer
Offline
Зарегистрирован: 05.05.2016

шумы создает схема т.к. если провод входного сиглана отключить то шум все равно есть

WOTgamer
Offline
Зарегистрирован: 05.05.2016

пробовал и много других схем тут меньше всего шумов

bwn
Offline
Зарегистрирован: 25.08.2014

И как обычно, по хорошей традиции, обязательно в "ПРОЕКТЫ"

ata3d
Offline
Зарегистрирован: 24.05.2017

Igor_116 прав, это скорее наводка от сети 220В. Блоки питания для ардуино могут иметь большие пульсации, замерить пульсации, стоит поставить емкости, как на схеме, можно дросселя и попробовать запитать от хорошего БП. Как собрана схема на печатной плате, макетке? играет роль и компоновка деталей,сделать как можно компактней и подальше от цифровой. Провода как можно короче. Кроме того стоит разделить аналоговую и цифровую земли, соединив их только в одной точке. Для проверки наводки на кабель, надо закоротить вход. 

WOTgamer
Offline
Зарегистрирован: 05.05.2016

спасибо!!! подключил оцелограф просто к питанию и там эта частота. при питании от пк она кстати никуда не исчезает. или это из-за того что я использую оцелограф как прогу на пк и это частота от сети так и идет????

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

оцелограф нормально работать не станет пока цак не наденешь.

ata3d
Offline
Зарегистрирован: 24.05.2017

Осцилограф промышленный или самоделка? Щуп у промышленного обычно согласован и там не должно быть наводки, замкнуть его и проверить. Если щуп самодельный(обычно он несогласованный с кабелем), он может показывать. то чего нет, проверить это можно подключив выход к усилку или звуковой плате, будет слышен рокот или нет, если да замкнуть вход, исчезнет или нет. 

Если БП с большими пульсациями ничего не поможет, не зря в схеме стоит стабилизатор, он уменьшает пульсации.