В данной статье описано 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.
Так что как только руки дойдут, буду пробовать...