[Ответить в тред] Ответить в тред

02/12/16 - Конкурс визуальных новелл доски /ruvn/
15/11/16 - **НОВЫЙ ФУНКЦИОНАЛ** - Стикеры
09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!



Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • /math/ - Математика • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 21 | 2 | 3
Назад Вниз Каталог Обновить

Ардуино pro mini, фурье, и мигание светодиодами.. Аноним 13/12/16 Втр 21:53:40  893820  
1481655216328.jpg (278Кб, 960x960)
1481655216522.jpg (134Кб, 750x750)
Господа и дамы!
Имеются среди нас ардуиньщики?
Нужна по сильная помощ в перепиливании скетча для одного девайса.

Имеется детская игрушка рождённая в Китае, обученная издавать китайцами лютые звуки и хаотично моргать светодиодами.

В голову пришло запихать туда мп3 плеер (пикрелайтед1), накачать какого-нибудь Daft Punk'a, и заставить мигать под музыку.

Часть светомузыки пытаюсь реализовать на pro mini (то, что есть на руках и уместиться в корпус, пикрелатед2), нашёл более-менее подходящий проект
http://my-qproject.blogspot.ru/2014/11/arduino-pro-mini.html?m=1

Но эта херобора мигает (почему-то) всего тремя ногами (должна 12-ю, как я понял), и мигает как-то упорото. Находил и другие решения - но они не лезут в этот чип..

Хочется сделать вывод на 5 каналов светодиодов, что бы он раскладывал частотный диапазон на 5 участков и мигал при определённом уровне. В идеале с небольшой задержкой свечения, а не как эппилептик.

С программированием я думаю справлюсь, а вот математическая часть обработки - для меня тёмный лес.. Нужен алгоритм..

Аноним 13/12/16 Втр 21:58:51  893827
Прикладная часть мне понятна. Как с аналогового пина читать, как в цифровые писать, с pwm разберусь, я думаю. А вот математика/алгоритм обработки - тут пробел. Нечего было прогуливать, в своё время.
Аноним 13/12/16 Втр 23:25:03  893878
Ну ёба..
Нет тут кошерных программеров?
Аноним 13/12/16 Втр 23:43:15  893883
Тащемта нашёл я откуда автор (по ссылке выше) брал исходный скетч
http://www.instructables.com/id/LoL-Shield-Audio-Spectrum-VU-Meter/?ALLSTEPS

Тут всё проще, буду переписывать и делать из 14 делений спектра 5.
Аноним # OP  14/12/16 Срд 00:28:28  893917
Немного каряво, не писал ничего лет 10 где то..
Возможно кому-то пригодится:
(Пока не испытывал!)

#include <fix_fft.h>

#define AUDIOPIN 0
const 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[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
}
}

}
Аноним # OP  14/12/16 Срд 00:32:59  893925
Балять. спецсимволы сьел..

#include <fix_fft.h&#62;

#define AUDIOPIN 0
const int leds=5; // Количество светодиодов
const int DLed[leds] = {9, 8, 7, 6, 5}; // Номера выводов светодиодов
const int res = 12; // "Разрешение" одного канала (от 1 до 64/leds&#42;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 &#42; data + im &#42; 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&#42;barsdiv+val]; // Суммируем значения спектра для одного светодиода
}
data_avgs = map(data_avgs, 0, res&#42;barsdiv, 0, res); // Преобразуем сумму в величину от 0 до res
}



// Let be the light!

for (i=0; i < barsdiv; i++) {
if (data_avgs&#62;res/2) {
digitalWrite(DLed,1); // set the LED on
} else {
digitalWrite(DLed,0); // set the LED off
}
}

}
Аноним # OP  14/12/16 Срд 00:35:47  893927
Ёбаный стыд.
&#62; - знак "больше"
&#42; - знак "звёздочка"

Я херегознает как тут исходник вставлять.
Аноним 14/12/16 Срд 00:57:23  893937
Проснись ты обосрался.
Начни с того что в оригинале
>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 раз
};

Я блять не понимаю как ты свою ардуину до сих пор не зжёг если ты даже скопипастить нормально не можешь.


Аноним # OP  14/12/16 Срд 01:33:00  893960
Там и скобки квадратные сьебались.. и переменная i.
http://pastebin.com/Sq8Q2bgb

Как тут исходник запихать?
Аноним # OP  14/12/16 Срд 01:39:53  893964
Объединил два последних цикла, о - оптемезацыйя.

http://pastebin.com/56VCEKPv
Аноним 14/12/16 Срд 01:51:44  893966
Ты кстати и гуглить не умеешь.
Та библиотека которую ты вытащил
>#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[i
4] + data[i4 + 1] + data[i4 + 2] + data[i*4 + 3]; // average together
data_avgs = map(data_avgs, 0, 30, 0, 9); // читай тут - https://www.arduino.cc/en/Reference/Map
}

// дальше преобразуем величины звука в свечение диодов

Анону можно просто подключить последнюю версию FFT библиотеки, корректно скопипастить первую часть с фурье хуйре, а потом придумать самому как из массива упоротых значений мигать 4 (или сколько там у тебя лампочек) диодами.

В принципе с таким подходом можно вообще не заморочиваться свертками хуертками а просто читать с микрофона величину звука и поочерёдно выставлять её на свечение диодом потому что лол борды у анона нет и как в статье он все равно не сделает.

Даже сам хуй знает что с арудиной делать собирается. Можешь её сразу в 220 вольт воткнуть и идти спать.
Аноним 14/12/16 Срд 01:58:40  893968
Кстати 14 взялось потому что на лол борде 14 столбиков и для каждого столбика нужно получить количесво горящих диодов от 0 до 9 вот и вся магия по моему не сложно. Сложно только дискретное преобразование хуй пойми что не понятно для чего.
Аноним 14/12/16 Срд 02:08:28  893973
Ну, ты то же его "не скопипастил правильно" ))
Борда символы режет.
нормальный код тут
http://pastebin.com/56VCEKPv

Добавил все параметры что мне надо. Сейчас шить/провода подключать уже лень, потом проверю.
По логике всё должно моргать как надо.

Разобрался уже вроде. Осталось загадкой почему из 128 значений data выходит 64 в im? "разхуячиваем только первую половину массива" - а зачем тогда изначально 128 брать?
Аноним 14/12/16 Срд 02:13:13  893975
с-нно вместо 14 столбиков LoL Shield теперь константа leds, вместо 9-ти светодиодов в высоту - "разрешение" измерений res. Остальное должно само пересчитывать.
Аноним 14/12/16 Срд 02:20:27  893978
в void setup() ошибся мальца
цикл i=0 to leds
Аноним 14/12/16 Срд 02:36:27  893983
>Осталось загадкой почему из 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 это какая то черная сука дыра деленная на ноль. Только лишь поэтому мы избавляемся от отрицательных значений.
Аноним 14/12/16 Срд 03:01:42  893992
Аудиовход будет с мп3 плеера напрямую, питаться он будет от 4.5В, так что разброс на входе будет от нуля до 4.5 макс.

Если вставлять делеи в код - он будет висеть на них и пропускать дикое количество сигнала с аудиовхода. Буду делать на прерывании таймера процедуру обработки светодиодов..
Аноним 14/12/16 Срд 03:05:46  893993
Всё равно как то странно они от отрицательных значений избавляются. Нафига нам отрицательные величины в плюсе? Это же, на сколько понял, величина силы сигнала на какой-то частоте.
Тогда если у нас Х от -5 до 5 логично сделать смещение Х=Х+5 и получим всё в плюсе..
Аноним 14/12/16 Срд 03:08:07  893994
И не понятно почему они складываются с изначальными значениями с аналогового канала. Вот в чём для меня загадка... Т.е. получили разбивку с "громкостью по частотам".. И сложили опять с входными данными. Херобора неведомая..
Аноним 14/12/16 Срд 03:23:15  893997
ffdd2.png (3Кб, 697x285)
ffdd.png (9Кб, 703x381)
jj.jpg (69Кб, 760x639)
>>893994
>Херобора неведомая..
>Херобора
херобора это девочка из хентая на которую я спустил только что.

Ты хочешь чтобы я вместо тебя почитал про дискретные преобразования простыми словами на хабре? Или чтобы я вчитывался в апи FFT библиотечки?

Нет я лучше пойду на херобору ещё раз передерну.
Аноним 14/12/16 Срд 03:40:32  894004
>>893997
У fix-fft нет описания апи, вот что и смущает.. Одна процедура с куском математики и пиздос. Что делает? Преобразование Фурье. И всё.. Куда, что, в каком диапазоне она пихает - не понятно.

Ладно, забейте ребят, спасибо за помощь! На днях ещё поковыряюсь.

Вообще по идее есть MSGEQ7 - выдаёт готовый спектр на 7 полос.. Но это ж скучно... ))
Аноним 15/12/16 Чтв 00:10:23  894455
В итоге - осилил. Работает
http://pastebin.com/3XL1kxSN

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 21 | 2 | 3
Назад Вверх Каталог Обновить

Топ тредов
Избранное