Господа и дамы!Имеются среди нас ардуиньщики?Нужна по сильная помощ в перепиливании скетча для одного девайса.Имеется детская игрушка рождённая в Китае, обученная издавать китайцами лютые звуки и хаотично моргать светодиодами.В голову пришло запихать туда мп3 плеер (пикрелайтед1), накачать какого-нибудь Daft Punk'a, и заставить мигать под музыку.Часть светомузыки пытаюсь реализовать на pro mini (то, что есть на руках и уместиться в корпус, пикрелатед2), нашёл более-менее подходящий проектhttp://my-qproject.blogspot.ru/2014/11/arduino-pro-mini.html?m=1Но эта херобора мигает (почему-то) всего тремя ногами (должна 12-ю, как я понял), и мигает как-то упорото. Находил и другие решения - но они не лезут в этот чип..Хочется сделать вывод на 5 каналов светодиодов, что бы он раскладывал частотный диапазон на 5 участков и мигал при определённом уровне. В идеале с небольшой задержкой свечения, а не как эппилептик.С программированием я думаю справлюсь, а вот математическая часть обработки - для меня тёмный лес.. Нужен алгоритм..
Прикладная часть мне понятна. Как с аналогового пина читать, как в цифровые писать, с pwm разберусь, я думаю. А вот математика/алгоритм обработки - тут пробел. Нечего было прогуливать, в своё время.
Ну ёба.. Нет тут кошерных программеров?
Тащемта нашёл я откуда автор (по ссылке выше) брал исходный скетчhttp://www.instructables.com/id/LoL-Shield-Audio-Spectrum-VU-Meter/?ALLSTEPSТут всё проще, буду переписывать и делать из 14 делений спектра 5.
Немного каряво, не писал ничего лет 10 где то..Возможно кому-то пригодится:(Пока не испытывал!)#include <fix_fft.h>#define AUDIOPIN 0const int leds=5; // Количество светодиодовconst int DLed[leds] = {9, 8, 7, 6, 5}; // Номера выводов светодиодовconst int res = 12; // "Разрешение" одного канала (от 1 до 64/leds10)char im[128], data[128];char data_avgs[leds];int i, val, barsdiv;void setup() { barsdiv=64/leds; // Отношение 64-х столбцов спектра к количеству светодиодов for (i=0; i < barsdiv; i++) { pinMode(DLed, OUTPUT); }}void loop() { for (i=0; i < 128; i++){ val = analogRead(AUDIOPIN); data = val; im = 0; }; fix_fft(data,im,7,0); for (i=0; i<64; i++){ data = sqrt(data data + im im); // this gets the absolute value of the values in the array, so we're only dealing with positive numbers // !!!!! Вот тут я нихрена не понимаю, почему они данные с аудиовхода мешают с результатом преобразования???? }; // average bars together for (i=0; i<leds; i++) { for (val=0; val<barsdiv; val++) { data_avgs = data_avgs + data[ibarsdiv+val]; // Суммируем значения спектра для одного светодиода } data_avgs = map(data_avgs, 0, res*barsdiv, 0, res); // Преобразуем сумму в величину от 0 до res } // Let be the light! for (i=0; i < barsdiv; i++) { if (data_avgs>res/2) { digitalWrite(DLed,1); // set the LED on } else { digitalWrite(DLed,0); // set the LED off } } }
Балять. спецсимволы сьел..#include <fix_fft.h>#define AUDIOPIN 0const int leds=5; // Количество светодиодовconst int DLed[leds] = {9, 8, 7, 6, 5}; // Номера выводов светодиодовconst int res = 12; // "Разрешение" одного канала (от 1 до 64/leds*10)char im[128], data[128];char data_avgs[leds];int i, val, barsdiv;void setup() { barsdiv=64/leds; // Отношение 64-х столбцов спектра к количеству светодиодов for (i=0; i < barsdiv; i++) { pinMode(DLed, OUTPUT); }}void loop() { for (i=0; i < 128; i++){ val = analogRead(AUDIOPIN); data = val; im = 0; }; fix_fft(data,im,7,0); for (i=0; i<64; i++){ data = sqrt(data * data + im * im); // this gets the absolute value of the values in the array, so we're only dealing with positive numbers // !!!!! Вот тут я нихрена не понимаю, почему они данные с аудиовхода мешают с результатом преобразования???? }; // average bars together for (i=0; i<leds; i++) { for (val=0; val<barsdiv; val++) { data_avgs = data_avgs + data[i*barsdiv+val]; // Суммируем значения спектра для одного светодиода } data_avgs = map(data_avgs, 0, res*barsdiv, 0, res); // Преобразуем сумму в величину от 0 до res } // Let be the light! for (i=0; i < barsdiv; i++) { if (data_avgs>res/2) { digitalWrite(DLed,1); // set the LED on } else { digitalWrite(DLed,0); // set the LED off } } }
Ёбаный стыд.> - знак "больше"* - знак "звёздочка"Я херегознает как тут исходник вставлять.
Проснись ты обосрался.Начни с того что в оригинале >http://www.instructables.com/id/LoL-Shield-Audio-Spectrum-VU-Meter/?ALLSTEPSвызов >val = analogRead(AUDIOPIN);возвращает>int (0 to 1023) из величин которых нужно составить массив void loop() {for (i=0; i < 128; i++){val = analogRead(AUDIOPIN);data = val;im = 0;};а у тебя написана какая-то хуйня которая for (i=0; i < 128; i++){val = analogRead(AUDIOPIN);data = val; //ебашим 128 раз одну переменнуюim = 0; //ебашим в ноль im 128 раз};Я блять не понимаю как ты свою ардуину до сих пор не зжёг если ты даже скопипастить нормально не можешь.
Там и скобки квадратные сьебались.. и переменная i.http://pastebin.com/Sq8Q2bgbКак тут исходник запихать?
Объединил два последних цикла, о - оптемезацыйя.http://pastebin.com/56VCEKPv
Ты кстати и гуглить не умеешь.Та библиотека которую ты вытащил>#include <fix_fft.h>является незаконнорожденным проектом от >http://wiki.openmusiclabs.com/wiki/ArduinoFHTа если почитать что делает ФХТ вообще - то она делает>https://ru.wikipedia.org/wiki/Дискретное_преобразование_ФурьеВот тот исходный код который ты даже не скопипастил правильно void loop() {for (i=0; i < 128; i++){ // делаем что-то 128 разval = analogRead(AUDIOPIN); // каждый раз с аналогового пина записываем величину звукаdata = val; // заполняем массивim = 0; // параллельно инициализируем такой же по размеру массив с нулями};fix_fft(data,im,7,0); // хуяксь - произошло дискретное преобразование фурьеfor (i=0; i< 64;i++){ // разхуячиваем только первую половину массиваdata = sqrt(data data + im im); // делаем так чтобы в первой половине массива не осталось никаких отрицательных чисел потому что -1-1 дает положительную единицу всегда};// еще раз хуячим массив потому что 128 значений слишком много для насfor (i=0; i<14; i++) {data_avgs = data[i4] + data[i4 + 1] + data[i4 + 2] + data[i*4 + 3]; // average togetherdata_avgs = map(data_avgs, 0, 30, 0, 9); // читай тут - https://www.arduino.cc/en/Reference/Map}// дальше преобразуем величины звука в свечение диодовАнону можно просто подключить последнюю версию FFT библиотеки, корректно скопипастить первую часть с фурье хуйре, а потом придумать самому как из массива упоротых значений мигать 4 (или сколько там у тебя лампочек) диодами.В принципе с таким подходом можно вообще не заморочиваться свертками хуертками а просто читать с микрофона величину звука и поочерёдно выставлять её на свечение диодом потому что лол борды у анона нет и как в статье он все равно не сделает.Даже сам хуй знает что с арудиной делать собирается. Можешь её сразу в 220 вольт воткнуть и идти спать.
Кстати 14 взялось потому что на лол борде 14 столбиков и для каждого столбика нужно получить количесво горящих диодов от 0 до 9 вот и вся магия по моему не сложно. Сложно только дискретное преобразование хуй пойми что не понятно для чего.
Ну, ты то же его "не скопипастил правильно" ))Борда символы режет.нормальный код тутhttp://pastebin.com/56VCEKPv Добавил все параметры что мне надо. Сейчас шить/провода подключать уже лень, потом проверю.По логике всё должно моргать как надо.Разобрался уже вроде. Осталось загадкой почему из 128 значений data выходит 64 в im? "разхуячиваем только первую половину массива" - а зачем тогда изначально 128 брать?
с-нно вместо 14 столбиков LoL Shield теперь константа leds, вместо 9-ти светодиодов в высоту - "разрешение" измерений res. Остальное должно само пересчитывать.
в void setup() ошибся мальцацикл i=0 to leds
>Осталось загадкой почему из 128 значений data выходит 64 в im? "разхуячиваем только первую половину массива" - а зачем тогда изначально 128 брать?Я думаю дело в том что микрофон только один и как известно из физики у микрофона на выходе будет изменение тока которое превращается в цифру. 128 раз ты меряешь уровень звука выраженный одной цифрой. Дальше из 128 значений нужно слепить один звуковой фрейм.>It takes about 100 microseconds (0.0001 s) to read an analog inputВ каждый момент звучит чуть громче чуть тише. Мы пропустили 128 моментов теплого лампового звука но получили как бы один кадр. Если ты хочешь чтобы лампочки мигали не как упоротые или увеличивай число измерений во фрейме или ставь паузы - но это уже матан начался как для функции свертки хуертки понабирать исходных данных.>Осталось загадкой почему из 128 значений data выходит 64 в imпо коду массивы data и массив im одинаковы по размеру. Если ты не хочешь влезать в матан откуда там появляеются отрицательные значения не поймешь. Отрицательных значений нам не нужно только лишь потому что величину свечения диода можно выставить только положительным числом а не отрицательным. Для диода 0 это выключено, -1 это какая то черная сука дыра деленная на ноль. Только лишь поэтому мы избавляемся от отрицательных значений.
Аудиовход будет с мп3 плеера напрямую, питаться он будет от 4.5В, так что разброс на входе будет от нуля до 4.5 макс.Если вставлять делеи в код - он будет висеть на них и пропускать дикое количество сигнала с аудиовхода. Буду делать на прерывании таймера процедуру обработки светодиодов..
Всё равно как то странно они от отрицательных значений избавляются. Нафига нам отрицательные величины в плюсе? Это же, на сколько понял, величина силы сигнала на какой-то частоте.Тогда если у нас Х от -5 до 5 логично сделать смещение Х=Х+5 и получим всё в плюсе..
И не понятно почему они складываются с изначальными значениями с аналогового канала. Вот в чём для меня загадка... Т.е. получили разбивку с "громкостью по частотам".. И сложили опять с входными данными. Херобора неведомая..
>>893994>Херобора неведомая.. >Хероборахеробора это девочка из хентая на которую я спустил только что.Ты хочешь чтобы я вместо тебя почитал про дискретные преобразования простыми словами на хабре? Или чтобы я вчитывался в апи FFT библиотечки?Нет я лучше пойду на херобору ещё раз передерну.
>>893997У fix-fft нет описания апи, вот что и смущает.. Одна процедура с куском математики и пиздос. Что делает? Преобразование Фурье. И всё.. Куда, что, в каком диапазоне она пихает - не понятно.Ладно, забейте ребят, спасибо за помощь! На днях ещё поковыряюсь.Вообще по идее есть MSGEQ7 - выдаёт готовый спектр на 7 полос.. Но это ж скучно... ))
В итоге - осилил. Работаетhttp://pastebin.com/3XL1kxSN