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