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

    Добрый день, уважаемые хабровчане. Пока следующая статья про микроконтроллеры 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.
    Ссылки из статьи:
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 20

      +3
      С пользой использовали ту схему с сенсорными кнопками :)
        0
        Схема с сенсорными кнопками, на самом деле, изначально для этого девайса и разрабатывалась) У меня была еще первая версия драммофона, с обычными тактовыми кнопками — было не шибко удобно по ним пальцами барабанить, решил сделать сенсоры.
        0
        Тоже с командой выступаем, на совместном концерте видел у гитариста группы Кайзен запрограммированный триггер ударников в гитару — им по сути не нужен барабанщик, парень просто успевает касаться пальцами нужного соединения — всё выглядит впечатляюще, вот хочу такое же сделать примерно =)
          0
          Собирай на лампах, чтобы душевнее было.
            +2
            Барабанщик может и не нужен, но зато нужен очень ловкий гитарист, чтобы успевал и играть на гитаре и барабанить)
            +4
            можно делать
              0
              Ожидал увидеть что-то миниатюрное с пэдами
                0
                Прикольно. Но есть куда расти: у китайцев есть электронные барабанные палочки, которым можно стучать хоть по столу.
                  +1
                  Да, знаю такие. Они не позволяют адекватно выбрать нужные семплы — жесты, оно, конечно, хорошо, но увы, много ими не навыбираешь.
                  Впрочем, собрать такие палочки не сложнее чем этот драммофон, достаточно добавить акселерометр.
                  +2
                  Радует, что здесь не применяли Ardiuno.
                    +1
                    Я не сторонник применения Arduino, тем более в проектах начального уровня)
                    0
                    Есть какие-либо видимые слышимые преимущества использования внешнего ЦАПа против реализации его на Меге через ШИМ? При тактовой частоте 16МГц и частоте дискретизации 16кГц можно получить разрядность ЦАП почти 10 бит. Сильно это хуже будет звучать?
                      0
                      Ну, некоторые утверждают, что слышат разницу в звучании между современными кондерами и «теплыми, ламповыми», выдернутыми из старых усилков. Мол у современных души нет) Правда, только утверждают)

                      А что касается ШИМа, это как вы так лихо получили 10 бит разрядности при ЧД 16к?
                      16М таймер, 1024 отсчета шима, частота ШИМма получается 15.6 КГц — даже чуть меньше ЧД. Вы его нормально не подавите, либо нужны будут очень здоровые фильтры. Плюс замечательный 16КГц писк… Частоту ШИМа желательно получать от 20К, за пределами звукового диапазона, подальше от полосы частот выводимого сигнала.
                        0
                        Да, согласен, 8-9 бит получается. Просто ЧД=16к вы сами выбрали, значит верхняя граница воспроизводимого диапазона будет 8кГц.
                          0
                          Граница-то 8КГц, но мы живем в жестоком мире, где даже ФНЧ неидеальны и имеют конечный налон АЧХ в полосе подавления)
                          RC первого порядка, если мне не изменяет память, вовсе -20 дб на декаду дает, так что 15КГц будут еще весьма и весьма сильны.
                        +1
                        Вообще говоря, рекомендую для подобных проектов взять STM32F1xx процессор.
                        Там у вас уже будет в наличии встроенный 12-битный ЦАП, контроллер СД-карточки и 32-разрядная архитектура. При цене одного контроллера от 30 рублей.
                        Я как раз сейчас пишу статьи об их использовании, одну уже запостил сюда.
                        +1
                        Одновузник (Бауманец) детектед (=
                          +1
                          Ага, в этом году закончил)
                            0
                            Ну да, точно) Все же бауманка накладывает отпечаток)
                          0
                          Скорей откладывает отпечаток хорошая дрессировка натаскивание студентов в написании технических статей и отчетов. Грамотных специалистов не только в Бауманке готовят. Но не везде учат правильно выражать свои мысли.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое