Модуль электронной барабанной установки В данной статье описано 2 варианта исполнения данного устройства из 3-х. первый вариант самый неинтересный и не нуждается в вашем внимании.
Собственно моя практика с микроконтроллерами началась из-за идеи соорудить электронную установку. Так же и до сих пор этот вопрос остается открыт. Всякий раз делая блок находились ошибки и недоработки, которые в текущем исполнении уже не исправить.
Сама идея заключалась в следующем: На электронном барабане существует датчик (пъезоизлучатель). При появлении на нем сигнала, нужно узнать силу удара и запустить звук в формате WAV. В описанной ниже конструкции на каждый барабан отводится 1 канал. т.е. одновременно могут звучать хоть все барабаны вместе.
ИТАК: вариант первый!!!
Внешний вид:
Каждый блок барабана состоял из одной платы. При чем одним контроллером оцифровывался входной сигнал и по заумному алгоритму определялась сила удара. Тем же контроллером задавался коэффициент усиления и запускался другой контроллер.
Второй же контроллер просто выводил данные с ROM в ЦАП при чем еле успевая на 16 МГц. Так что если бы одним контроллером отслеживать датчик и воспроизводить, .... ничего хорошего я бы не услышал.
Когда звук уже играет и поступает новый сигнал, звук проигрывается заново. задержки можно сказать нет.
На фото подключено только 2 барабана (2 платы)
Подробнее о работе одного блока:
Принцип работы одного блока: На вход подключается 2 датчика (центр барабана и край) В зависимости от входного сигнала воспроизводится соответствующий звук. Блок может воспроизводить только один звук. При этом учитывается сила удара и установленная громкость.
Состоит из 2-х контроллеров (Atmega8): 1. Непрерывно опрашивает 2 канала встроенного АЦП и ждет пока сигнал не перейдет за пороговое значение. Затем в течении некоторого времени записывает сигнал в память, и ищет максимальное значение. На основе этого значения по входной характеристике задает громкость сигнала на внешний резисторный ЦАП, и запускает один из звуков. 2. При запуске первым контроллером, устанавливает адрес внешней памяти (1-го или 2-го звука) и выводит звук через внешний 16-ти битный ЦАП. Если звук еще не закончился, и поступает новый сигнал запуска, воспроизведение начинается заново
Все параметры входной характеристики хранятся в "своем" контроллере. Загрузка звуков в память на каждом модуле осуществляется с главного модуля. Для этого в устройстве организована общая шина данных (последовательная ).
По ней передается номер контроллера куда нужно передать и команду затем после получения ответа от контроллера (по отдельной линии подтянутой к нулю) пересылаются либо параметры либо аудиофайл. Также по шине может информация передаваться и обратно (осциллограмма входного сигнала для настройки чувствительности).
Шину можно считать SPI хотя она не аппаратная и со своими особенностями. Главный модуль один. Остальные контроллеры подчиненные (slave).
Первый контроллер может: - Принимать 4 байта для построения входной характеристики: Пороговое значение, минимальный уровень громкости, величина компрессии, ожидание затухания сигнала. - Отправлять 2 байта входного сигнала: о найденном максимуме импульса и установленной громкости. - Отправлять массив данных входного импульса (требуется для регулировки чувствительности). - Принимать данные о включении и выключении блока. - Принимать данные о громкости каждого из 2-х звуков.
Второй контроллер получает 256 кб данных которые по 512 б загружает во внешнюю Flash память (Изменение звучания барабана) Управляющий блок работает с картой памяти MMC, графическим дисплеем и клавиатурой. В нем изначально стояла ATmega16, но после её заполнения пришлось перейти на ATmega32. Распиновка такая-же так что переделывать ничего не пришлось.
главное меню:регулировка громкости:
Выбор звука и загрузка его в нужный блок Здесь пришлось разобратся с такой интересной вещью, как карта памяти MMC и система FAT16. После долгого мучения был разработан код для работы с картой, которым пользуюсь до сих пор. (выбор блока и зоны удара куда загрузим) (работа в файловой системе ПАПКИ – ФАЙЛЫ)
Установка входной характеристики
Индикация входного импульса для настройки входной цепи. (также показан максимум импульса и найденная громкость по характеристике)
Выводы: Уже когда сделал 3 блока, очень разочаровался в результатах. - загрузка происходила очень долго. Длинные звуки (5 сек) загружались по 30-40 секунд. - при быстром повторном ударе был перебой прошлого, это было не реалистично и после того как я поиграл пол часа на 3-х барабанах, пропало желание дорабатывать изделие до конца.
В идеале когда по барабану бьется быстро 2 раза. первый звук не должен резко пропадать. а накладываться со вторым.
Сейчас судьба этого изделия печальна: все ценные детали были постепенно извлечены, ну а коробка валяется на балконе.
ВТОРОЙ ВАРИАНТ!!! Как то раз мне приглянулся тогда еще новый контроллер ATXmega. Показался довольно хорошей штукой. Он имеет в себе очень много. и прост так же как и остальные AVR.
То что можно улучшить было следующим:
Первое улучшение: У новой Хмеги было много аппаратных SPI и 4 внутренних ЦАП.
Значит можно подключить к меге 4 внешних FLASH-ROM (у меня они были в большом количестве). И если не отпускать SC у каждого FLASH-ROM, то можно параллельно выводить звуки на приличной скорости.
И после проведения исследования и разгона оказалось, то как раз на 4 воспроизведения мега и способна ( не больше)
Если подключить одну большую память. то за каждую дискретизацию требовалось адресоваться в нужную ячейчу, вычитать добавить адрес, запомнить. перейти к след звуку и т.д... а на это она была не способна.
А когда просто выводим с каждого SPI "свой" звук, тогда не нужно никаких адресов - первый раз выставил на начало, а затем данные изут последовательно.
Итак один контроллер способен выдавать 4 независимых звука. А было решено отвести на каждый барабан по 2 канала. Звук стал вполне реалистичный (кроме дроби - там и 10 каналов наверное будет мало).
Управляющий модуль уже обслуживал оцифровку всех датчиков и запускал звуки. Регулировку громкости производила микросхема TDA7448 (6 канальный регулятор громкости I2C)
Второе улучшение - увеличение скорости загрузки.
Раньше была проблема что главный блок загружал блок данных затем по SPI передавал контроллеру который уже записывал его в память: Карта памяти -> Контроллер -> Контроллер -> Память.
Решил сделать так, чтобы карта памяти была доступна с любого контроллера. Это было легко достигнуто с помощью диодов. Если на SC обнаруживался 1 то любой контроллер мог считать с карты информацию.
Теперь для загрузки требовалось контроллеру знать лишь номер папки и файла. А затем контроллер загружал файл в память напрямую.
Карта памяти -> Контроллер -> Память. Скорость загрузки звуков увеличилась раз в 15-20.
В итоге на одной плате вместилось 3 контроллера (6 барабанов) для полноценной установки требуется 12 ну или больше по желанию.
Печатная плата:
Плата главного модуля:
ну тут все очень скучно. Дисплей взял от нокия3310 и энкодер освоил для удобства.
Выводы:
Это устройство намного лучше предыдущего. но сильно сложное как для простой барабанной установки. В данный момент устройство работает (не доделанное) но есть идея сделать все на ОДНОМ микроконтроллере STM. Так что как только руки дойдут, буду пробовать...