Привет всем, так сложилось, что срочно понадобилась цветомузыка. Нужна помощь со кодом Имею : 1. Микрофонный усилитель(китай) 2. Ардуино Уно 3. Светодиодные ленты Очень хочу: 1. код. с использованием несложных библиотек, например(FFT) 2. по возможности схему. Я представляю так, с микрофона на Ао ардуины и с ШИМ на полевики. Хотелось бы 3-4 частотных разделения. Спасибо!
Я это вижу примепно так: Сигнал с усилителя на четыре (или три) полосовых фильтра. Выход каждого фильтра еще усилить (возможно ОУ). Усиленный сигнал с каждого фильтра на отдельный аналоговый вход... А может сразу на ключ? Зачем тогда ардуина? А если не усиливать после фильтра... не знаю хватит ли напряжения чтобы хоть что-то различить на аналоговых входах... А если без фильтров... осилит ли ардуина БПФ в реалтном времени? Не знаю..
Тут на Ардуино моргают лампочками и крутят моторчиками, а FFT это уже из разряда матана, т.е. удел труЪ гиков. Плюс ARM с поддержкой плавающей точки гораздо больше для этого подходит, поэтому пихать FFT в 8ми битный целочисленный контроллер сейчас неразумно. Однако если погуглить, то можно увидеть что впихнуть невпихуемое можно: http://apcmag.com/arduino-project-audio-spectrum-analyser.htm/
Я вот подумал, цветомузыка же не осциллограф какой нибудь, особая точность не нужна. Разделить грубо частоты на три диапазона, подать на аналоговые пины и помигать на пороговых значениях подобранных опытным путем или устанавливаемыми потенциометрами. Хотя можно калибровать программно в теории, путем прогона небольшого участка и записи в EEFROM максимальных или средних значений по каждому каналу. Нахожу эту задачку даже интересной.
Есть такой код, но здесь нужно убрать лишнее, т.е. TVout и сделать выход 4 -х пинов. #include <TVout.h> #include <fix_fft.h> TVout TV; char im[128], data[128], lastpass[64]; char x=32, ylim=90; int i=0,val; void setup() { TV.begin(_NTSC,128,96); // Initialize TV output, 128x96. TV.print_str(2,2," Realtime Arduino"); // TVout lib uses x,y for print TV.print_str(2,11," Spectrum Analyzer"); // statements. 8x8 default font. analogReference(DEFAULT); // Use default (5v) aref voltage. for (int z=0; z<64; z++) {lastpass[z]=80;}; // fill the lastpass[] array with dummy data }; void loop() { for (i=0; i < 128; i++){ // We don't go for clean timing here, it's val = analogRead(0); // better to get somewhat dirty data fast data = val/4 -128; // than to get data that's lab-accurate im = 0; // but too slow, for this application. }; fix_fft(data,im,7,0); for (i=1; i< 64;i++){ // In the current design, 60Hz and noise data = sqrt(data * data + im * im); // in general are a problem. Future designs TV.draw_line(i+x,lastpass,i+x,ylim,0); // and code may fix this, but for now, I TV.draw_line(i+x,ylim,i+x,ylim-data,1); // skip displaying the 0-500hz band completely. lastpass=ylim-data; // if you insist, initialize the loop with 0 }; // rather than 1. };
Тогда да, FFT делать. Просто есть микросхема "для лентяев": https://www.sparkfun.com/products/10468 но доехать не успеет
Какая разница? По трудозатратам одинаково выходит, что готовый FFT запустить, что полосовые фильтры + V/F конвертер паять. С Ардуиной меньше паяльником чадить.
Выходная схема не проблема, просто в ардуине можно еще и световые эфекты наложить, типа "Бегущий огонь, бегущая тень, и.т.п.
Прикольно. Все-таки БПФ на ардуине можно реализовать! Ну тогда задача в исходной постановке решается. Только... ТС не назвал сумму, которую готов уплатить за разработку