Светомузыка с Arduino. Сезон 2 Часть 1
В прошлых частях я собрал устройство светомузыки для LPT. По факту это было устройство оптической развязки параллельного интерфейса от силовой нагрузки, назовём его УОРПИ. Да, при помощи его можно устроить светомузыку используя в качестве подачи сигнала LPT порт, а управление сигналом при помощи программы. В этой части я хочу поговорить о применении микроконтроллера для управления, а именно приём входного сигнала, разложение его на частоты и вывод в параллельный интерфейс УОРПИ.
Эта часть будет больше техническая и немного о программировании и решении вопросов в работе.
Итак, моё устройство должно уметь принимать входной сигнал и раскладывать его на частоты. Почитав гугл находим массу статей и прочего про библиотечку БПФ (Быстрое преобразование Фурье) и что с ней всё должно работать, НО тут же находим такую штуку как:
1. Это все довольно медлительно;
2. Не всегда корректно;
3. Написано на костылях;
4. Диапазон частот заканчивается на 5кГц.
Вывод - не вариант. Все должно быть идеально. Вариант второй,- используем анализатор спектра в виде микросхемы MSGEQ7, - она умеет раскладывать на 7 частот включая 16кГц, - этого мне выше крыши.
Вот как это выглядет
Таким образом, буду собирать с использованием микросхемы.
Значит чего я хочу: Аудио сигнал поступает на вход анализатора, и на вход Ардуины. С выхода анализатора результат поступает на вход Ардуины. Ардуино это дело обрабатывает и выдает по ШИМ на УОРПИ.
С анализатора снимаем 7 частот, из них выделяются Низкие, Средние, Высокие, Среднее значение всех частот. - Получаем каналы НЧ, СЧ, ВЧ, ППЧ.
Со входа ардуины снимаем громкость сигнала, получаем канал ППГ. И вычтя это значение из максимально возможного получаем канал ОПГ. Таким образом будет все 6 каналов СДУ.
Проштудировав в интернете мануалы по работе с данной микросхемой анализатора имеем код:
То есть всё это работает на пресловутых Delay? Далее сюда втюхиваем еще работу ППГ и ОПГ, и получаем кашу на delay'ях, то есть будем тормозить работу ардуины только для того что бы соблюсти тайминги микрухи? Да ну нахер...
Я хочу что бы циклы поучения результата, манипуляции с ними и вывод сигналов ШИМ работали как-то сами по себе, а тайминги микрухи и получение значений с них работали отдельно. Значит мне надо как минимум 2 потока. А вот ардуино это не умеет. Значит надо сделать так, что бы основной цикл работал сам по себе, а когда надо прочитать значение с анализатора и дернуть его стробом, то основной цикл прервался, - выполнилась работа с микрухой, и продолжил работать основной цикл. А это называется прерывание, а поскольку внешних каких-то событий не будет происходит, значит надо сделать прерывание по таймеру. В ардуине имеется аж 3 таймера!. Что же это за таймеры? Почитаем:
http://arduino.ru/Tutorial/Arduino_Interrupts_part2
Таймер 0 - Отвечает за Delay, micros ... и ШИМ 5 и 6 пин.
Таймер 1 - ... ШИМ 9 и 10 пин.
Таймер 2 - ... ШИМ 3 и 11 пин.
Да что за нахер мне надо все 6 ШИМ каналов. Все таймеры заняты! а значит, либо я циклю все в loop'е и имею говнокод но с ШИМ, или я имею раздельное выполнение циклов, но БЕЗ ШИМ на одном пине.
Пост становится длинноват, поэтому продолжение следует...
Спойлер: вопрос я таки решил.