РадиоКот :: MIDI контроллер на Atmega16U4
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Примочки к ПК >

Теги статьи: Добавить тег

MIDI контроллер на Atmega16U4

Автор: ProAlex, proalexx@yandex.ru
Опубликовано 21.07.2015
Создано при помощи КотоРед.

Многие музыканты, как профессиональные исполнители, так и любители, глядя на хорошее цифровое пианино, иногда думают про то, что ему не хватает колес и нескольких контроллеров, для того, чтобы можно было пофантазировать с тембрами. Но производители добавляют такие возможности, как правило на достаточно дорогих, концертных инструментах. А миди клавиатуры, часто не устраивают качеством самих клавиш, или размерами и весом инструмента, а иногда и ценой.

Поэтому я задумался над тем, как создать устройство, позволяющее восполнить данный недостаток. Поэксперементировав с разными микроконтроллерами, остановился на Atmega16U4 фирмы Atmel, как наиболее подходящий для решения данной задачи. Так же добавив в устройство возможность использовать его, как MIDI-USB переходник, для тех инструментов у которых отсутсвует USB-MIDI интерфейс.

В результате появился миди контроллер, который я назвал ATEMP MC1. Следующее видео показывает его возможности при разных вариантах включения.

Рассмотрим сначала теоретическую часть работы данного устройства.

1. Поток миди сообщений генерируется инструментом в случае разных действий со стороны музыканта. Это может быть, как нажатие клавиш инструмента, так и нажатия кнопки или поворота ручки контроллера. Миди сообщения в основном идут трех байтовой пачкой, но бывают и двух и одно и более трех. Например нажатие клавиши в сообщении выглядит, как 0x90 0x3C 0x40 (Note On/chan 0, Middle C, Velocity ), а изменения контроллера громкости, как 0xB0 0x07 0x40 (Control Change/chan0, Volume, Lеvel). Подробная информация о протоколе миди выложена на специальных сайтах, где с ней может подробно ознакомится любой желающий, например https://www.gweep.net/~prefect/eng/reference/protocol/midispec.html.

2. Базовая функция устройства состоит в том, чтобы принимать со входа MIDI IN и передавать на выход MIDI OUT или USB порт все входящие миди сообщения, а для добавления в поток сообщения с собственных контроллеров, необходимо прерывать программу и считывая положение ручек контроллера вставлять эти сообщения в поток. При передачи в USB поток следует учитывать специфику данного протокола, так как здесь сообщения миди нужно дополнительно перепаковывать в пакеты USB. Например нажатие клавиши будет уже выглядеть, как 0x09 0x90 0x3C 0x40 ( Note-on message on virtual cable 0 (CN=0x0; CIN=0x9) Note On/chan 0, Middle C, Velocity)

3. Прерывание необходимо так же, для динамического сканирования кнопок ввода и вывода информации на четырех разрядный восьмисегментный индикатор.

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

Рассмотрим более подробно работу узлов данной схемы.

В Atmega16U4 для приема передачи данных миди сообщений мы используем порт USART1 его вход, выход RXD, TXD, и настраиваем его на частоту MIDI протокола, то есть Baud Rate: 31250 Гц, для считывания данных с потенциометров контроллеров используем входы ADC 1,2,4,5,6,7,8. Для динамического отображения на четырех разрядном восьмисегментном индикаторе, включенном по схеме с общим анодом и для подвески опроса кнопок используем для сегментов порт PB0..7, разрядов порт PD0..1 и PC6..7. Развязанные через диоды кнопки опрашиваются динамически на порт кнопок PD5 (в следующих статьях я на простом примере расскажу, как организовать простой драйвер для динамической индикации и опроса кнопок, в случае индикатора с общим анодом или катодом). Для прерывания необходимого для вывода информации на разряд индикатора, опроса нажатия кнопки, а так же запуска канала ADC я использую внутренний таймер TIMER0.

Для работы по аппаратному USB порту подключаемся к его D+ D-. Питание вся схема получает от USB порта. В MIDI протоколе для подключения и передачи приему данных используется схема - токовая петля через оптрон. Она позволяет гальванически развязать устройства, для предотвращения попадания в разные фазы. В данной схеме используется стандартное включение оптрона типа 4N33 наш аналог АОТ127А, в качестве буферного элемента используется микросхема 74LS00 наш аналог к555ла3, при достаточной крутизне спадов оптрона ее можно и не ставить, но тем не менее в миди адаптерах и прочих схемах для порта миди ее рекомендуют использовать.

Для корректной работы с USB портом я использовал стандартный Атмеловский стек series4-usb_software_library_template для данной серии микроконтроллеров U4 и в настройках usb_dexyinaors.c, h прописал конфигурацию класса миди порта, USB Endpoint dexyinaors для считывания и записи данных (описания взяты с сайта конфигураций usb.org: https://www.usb.org/developers/devclass_docs/midi10.pdf), он также подходит и для Atmega32U4, то есть в данной схеме они заменяемы, просто при компиляции надо указать под какой контроллер компилировать. В следующих статьях я поподробнее напишу про работу с этим удобным USB стеком, на стандартных примерах. Для программирования использую софтовый Атмеловский программатор Flip, через USB порт, чтобы программировать при включении нужно держать нажатой кнопку B4 подача низкого уровня на вход HWB запускает вшитый в чип загрузчик.

В качестве управления колесом питча и модуляции RV1,RV2 я использовал джойстик от пульта управления радиоуправляемыми моделями вертолета:), но можно поставить и колеса от старой миди клавиатуры или синтезатора.


Файлы:

Прошивка МК


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

26 3 1