Светомузыка
- Войдите на сайт для отправки комментариев
Втр, 25/12/2018 - 17:38
помогите плиз
делаю светомузыку на ардуино мега 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 прав, это скорее наводка от сети 220В. Блоки питания для ардуино могут иметь большие пульсации, замерить пульсации, стоит поставить емкости, как на схеме, можно дросселя и попробовать запитать от хорошего БП. Как собрана схема на печатной плате, макетке? играет роль и компоновка деталей,сделать как можно компактней и подальше от цифровой. Провода как можно короче. Кроме того стоит разделить аналоговую и цифровую земли, соединив их только в одной точке. Для проверки наводки на кабель, надо закоротить вход.
спасибо!!! подключил оцелограф просто к питанию и там эта частота. при питании от пк она кстати никуда не исчезает. или это из-за того что я использую оцелограф как прогу на пк и это частота от сети так и идет????
оцелограф нормально работать не станет пока цак не наденешь.
Осцилограф промышленный или самоделка? Щуп у промышленного обычно согласован и там не должно быть наводки, замкнуть его и проверить. Если щуп самодельный(обычно он несогласованный с кабелем), он может показывать. то чего нет, проверить это можно подключив выход к усилку или звуковой плате, будет слышен рокот или нет, если да замкнуть вход, исчезнет или нет.
Если БП с большими пульсациями ничего не поможет, не зря в схеме стоит стабилизатор, он уменьшает пульсации.