Pull to refresh

Драммофон: портативная цифровая ударная установка

Reading time 5 min
Views 8.3K
Добрый день, уважаемые хабровчане. Пока следующая статья про микроконтроллеры STM32F в процессе написания, я решил поделиться с вами моим старым проектом, собранным еще на AVRках. Честно говоря, меня не слишком тянуло возвращаться к теме AVR, но т.к. я недавно раскопал старые материалы по своим проектам, я решил что лучше будет поделиться ими с общественностью. Проект очень простой, а результат, на мой взгляд, довольно интересный, что делает это устройство хорошим стартом для новичков. В общем, если кто желает повторить – добро пожаловать под кат, начинаем делать цифровую портативную ударную установку.

Введение


Название для устройства получилось довольно громким, однако по сути это просто забавная игрушка. Хотя, мы несколько раз юзали ее с друзьями как ударники во время игры на гитаре.
Что мы собираем? Мы собираем устройство, имеющее 8 сенсорных кнопок, по нажатии на которые оно воспроизводит записанный в память семпл ударного инструмента.
Вот так выглядит устройство в сборе:

image

А вот так оно работает (на видео драм до помещения в корпус).



Конструктивно девайс состоит из собственно платы драммофона, на которой располагается управляющий контроллер, микруха флеш-памяти, слот для SD-карточки, 12-битный ЦАП и усилитель, платы сенсоров, соединенной с основной платой шлейфом (интерфейс SPI) и динамика. Вся эта электроника собрана в корпусе от старой колонки Genius, которая подошла как нельзя лучше.

image

Вообще, советую взять на вооружение это дело – если собираете устройство, которое должно выводить более-менее громкий звук, и думаете, в какой бы корпус его запихнуть – посмотрите на старые колонки, вполне возможно, они вам подойдут.
В моей схеме присутствовал еще и дисплей, но кроме тестового сообщения я на него так ничего и не стал выводить, так что им принебрежем.
Как собрать сенсорную клавиатуру я уже рассказывал в соответствующей статье. Мы же обратимся к схемотехнике основной платы.

Схемотехника


Схема устройства очень простая. Усилитель четырехваттный, собран на микросхеме TDA1904, полностью по рекомендуемой в даташите схеме. Конденсатором C14 отрезаем ненужную постоянную составляющую напряжения, НЧ фильтр на R2 и C16 восстанавливает форму сигнала после ЦАПа (т.н. интерполирующий фильтр).

image

Цифровая часть состоит из микроконтроллера ATMega32, микросхемы флеш-памяти AT25FD161, SD-карточки и 12-битного ЦАПа DAC7611. Вся периферия, включая и внешнюю сенсорную клавиатуру, подключена по шине SPI.

image

Так как проект старый, один из моих первых, не могу сказать что выбор компонентов идеальный. Планы-то изначально были наполеоновские, поэтому и мегу взял «побольше», и дисплей воткнул – на самом деле, в том виде, в каком он сейчас собран, хватит вполне ATMega88. Так как мега и ЦАП питаются от 5В, а карточка и флешка требуют 3.3, уровни согласуются делителями. Это не очень хорошее решение, сейчас я бы так не сделал, а применил бы специальный преобразователь, чтобы не заваливать фронты сигналов (а лучше всего – построил бы всю схематику на 3.3В элементах), но это сейчас)
Что касается SD-карточки, при ее подключении я пользовался информацией следующего сайта:
Должен сказать, на нем имеется большое количество интересных проектов и полезной документации, если вы начали работать с АВР, обязательно туда загляните.
Питание устройства осуществляется от 9В батарейки, усилитель питается от нее напрямую, цифровая схематика – через линейные стабилизаторы на 3.3 и 5В.



Вот, в принципе, и все, что касается схемотехнической части. Так как проекту более двух лет, вполне мог что-то упустить, либо схема могла оказаться более старой версией того, что у меня собрано в железе, но основную идею я передал. Вам не составит труда при желании повторить и улучшить то что я предложил.

Программная реализация



Как это все работает?
Если опустить вопрос о том как я это изначально задумывал (дисплей и прочее, ага), то получаем следующее: воспроизводить с карточки семплы напрямую я не стал, т.к. побоялся, что не хватит времени на чтение данных (SPI-режим SDшки довольно медленный), поэтому карточку я использовал чтобы перекинуть семплы во флешку, один раз, после чего отключил ее от устройства и больше не подключал.
Девайс раз в несколько миллисекунд опрашивает по SPI клавиатуру, получив от нее данные, выясняет, какие кнопки зажаты. Так как «полифонии» у него нет, то приоритет отдается последней нажатой. После этого включается таймер, и с частотой дискретизации равной 16 КГц соответствующий кнопке семпл начинает считываться из флешки и выдаваться на ЦАП.
Программные принципы работы с карточкой изложены на уже упомянутом сайте. Если кратко – карточка может работать в двух режимах: SPI и стандартом. По умолчанию включен стандартный режим, и по SPI она может принять только одну команду – переключить режим. Стандартный режим не накладывает дополнительных ограничений на скорость, позволяет использовать шину из 4х проводников, вместо одного, но требует подсчета CRC, что без аппаратного вычислителя сделает этот режим на меге еще более медленным, чем SPI. Поэтому карточке подают команду на смену режимов (в этой команде CRC проверяется, но его можно заранее подсчитать и выводить захардкоденным), после чего с ней можно общаться теми же командами, но без CRC, стандартными SPI сигналами. Библиотеку для работы с карточкой можно найти вот здесь. Опять-таки, кто занимается AVR – добавьте эту ссылку себе в избранное, это огромная библиотека, в которую входят драйверы периферии (карточки, дисплеи, т.п.), реализации протоколов и многое другое. Чтобы не тратить силы на файловую систему, семплы, перекодированные в 16 бит х 16 КГц были сложены в сыром виде, начиная с первого байта карточки. Это легко осуществимо при помощи программы WinHEX – отличного хекс-редактора, позволяющего низкоуровневую запись на физические носители. В таком же виде семплы перезаписываются и на микросхему флеш-памяти. Для удобства, длительность всех семплов одинакова и составляет 8000 отсчетов (пол секунды при частоте дискретизации в 16КГц)
Работа с ЦАПом и флешкой также не представляет никакого труда: ЦАПу нужно просто послать 12 бит данных, наиболее значащим битом вперед, после чего дрыгнуть пином LD, означающем переброску из входного регистра во внутренний. Так как мега работает с байтами, то следует 12 бит дополнить до 16 нулями.
Флешка принимает команды на чтение, стирание и запись. После команд чтения/записи данные можно принимать/отдавать потоком, т.к. счетчик адреса в ней автоинкрементится.
Программным кодом я бы с радостью с вами поделился, как я это обычно делаю, но увы – исходники утерялись во время форматирования харда, видимо, проглядел и не забекапил… Но, думаю, вам не составит труда завести таймер на 16 КГц и в интеррапте выдавать на ЦАП значение, считанное из флешки)

Заключение



Должен сказать, что довольно забавно спустя несколько лет писать статью о своих старых проектах, разработанных во время обучения. То и дело возникают мысли «эх, что ж я так, ведь можно было сделать по-другому, так бы было лучше!». Не говоря уж о том, что элементная база тоже не стоит на месте и разрабатывая подобный девайс на том же STM32F1xx можно будет не заботиться ни о внешнем ЦАПе(есть встроенный!), ни о согласовании уровней (питание от 3.3В, как и у карточки), ни об общении с карточкой (STMка умеет общаться с ними в нормальном режиме, с CRC). Однако, каким бы этот проект не был, он послужил отличной тренировкой в разработке устройств. Поэтому всем начинающим я рекомендую: после того, как освоите мигание светодиодами, выберите себе проект, который будет вам интересен и попробуйте его реализовать. Любой – хоть описанный мной драм, хоть один из сотен других проектов на AVR, освещенных в интернете, а еще лучше – полностью свой. Пусть он в итоге окажется не таким, каким был изначально задуман, а в последствие вам покажется простым и кривоватым – зато он даст вам очень полезный опыт.
Удачи в разработках!

P.S.
Ссылки из статьи:
Tags:
Hubs:
+48
Comments 20
Comments Comments 20

Articles