Динамическая MIDI клавиатура на PIC16F84

Динамическая MIDI клавиатура на PIC16F84

Клавиатура предназначена для подключения к внешнему саунд-модулю или компьютеру (при наличии соответствующего интерфейса) с использованием MIDI протокола – для записи музыки в секвенсерную программу или живого исполнения. Количество клавиш в предложенном варианте 48, может быть увеличено без переделки схемы до 64. Отличительной особенностью предлагаемой клавиатуры является чувствительность к силе удара по клавише.

История создания устройства

Некоторое время назад  в связи с покупкой квартиры я вынужденно лишился шикарного инструмента, выполнявшего у меня роль MIDI клавиатуры – это была легендарная  YAMAHA DX-7. Когда печаль поутихла, во всей остроте и неприглядности встал вопрос: а на чем же работать? Именно в этот момент стараниями моего приятеля в мои загребущие ручонки попала полусобранная схема на КР1816ВЕ39 (по супостатски этот процессор зовется 8048). Схема проста и в сборке, и в наладке, и, главное, подвернулась под руку в нужное время. Клавиатуру я  собрал  в виде матрицы 8×6, применив КР1533ИД7 и КР1533КП7. Не обошлось и без ложки дегтя – два недостатка этой схемы насмерть убивают все ее достоинства: отсутствие чувствительности к скорости нажатия  клавиши (динамики) и колеса PITCH WEEL. Ну, я когда-то программировал на Z-80 (и даже сделал работающий секвенсор) и решил тряхнуть стариной. Z-80 как CPU я решительно отмел, как морально устаревший. Кроме того, не хотелось много паять, и я решил взять за основу этот самый девайс на КР1816ВЕ39, оснастив его еще одним мультиплексором для размыкающих (верхних) контактов клавиш. Я отыскал документацию (вы не поверите – в библиотеке, книга «Проектирование цифровых устройств на однокристальных микропроцессорах») на ассемблер КР1816ВЕ39 и накарябал программу…  И тут выяснилось, что у приятеля сдох программатор ПЗУ, и зашить программу просто нечем… От горя я совсем потерял разум и решил переписать тот же алгоритм под PIC. За полдня был спаян программатор (LUDIPIPO), затем макет из панельки, КР1533ИД7 и  пары КР1533КП7, а весь монтаж сделан МГТФом без всякой печатки. И процесс пошел…

Сначала был запущен нединамический вариант программы (его я тоже привожу для тех, у кого клавиатура имеет один контакт на клавишу). Потом  запустилась динамическая версия. И тут созрела мысль добавить кнопки и индикатор. Дело в том, что у меня  без дела давно валялась платка WAVEBLASTER (дочерний wavetable синтезатор для очень старых звуковух). Подключивши ее к моему творению, я получил нечто, на чем можно играть (в меру сил и таланта) без компьютера, что иногда довольно удобно. Это и определило набор функций на кнопках – он может пригодиться при подключении к звуковым модулям при  “живой” игре. Функции кнопок легко изменить, написав свои обработчики и используя мои процедуры опроса и индикации. Кое-как собранная в железном корпусе клавиатура оказалась удобнее, чем YAMAHA PSS (все же полноразмерные клавиши, педаль и, главное, динамика!). В разгаре творческого процесса возникло труднопреодолимое желание сделать версию  MIDI клавиатуры чисто для компьютера – индикатор и кнопки необязательны, но нужны  колеса  PITCH WEEL и MODULATION. Некоторое время я с ним боролся, но, в конце концов, сдался и снова включил паяльник. Электронику собрать несложно, с механикой – несколько сложнее, и я начал морщить лоб над устройством колеса. Поразмыслив, я решил отказаться от второго колеса – все равно я никогда не кручу их сразу оба, обычно сначала пишу ноты и  pitch, затем дописываю modulation. Не последним соображением было и уменьшение в два раза объема столь любимых мною механических работ. Для менее ленивых я ниже объясню, как почти не усложняя схему сделать два колеса. Чтобы все-таки иметь возможность писать modulation, я решил организовать три режима работы колеса: pitch на 2 полутона, pitch на 1 полутон (удобно), и modulation. Переключать это все можно одной кнопкой, а индицировать режим – парой светодиодов. Чтобы упростить схему, остальные кнопки и индикаторы я ликвидировал, для работы с современными программами-секвенсорами это все не нужно.

Колесо, конечно же, должно быть надето на ось потенциометра, это-то понятно, а вот к чему его подключить? Первой мыслью было использовать одновибратор на таймере 555. Но расчет показал, что будет трудно добиться точности и стабильности измерения длительности импульса при попытке обеспечить приемлемую частоту опроса колеса, ведь процессор в основном занят измерением времени переключения клавиатурных контактов. Остался путь использования аналого-цифрового преобразователя (АЦП). Поскольку у меня использовался Pic16F84 без встроенного АЦП, я вспомнил инженерное прошлое (и родной завод) и сделал АЦП из нескольких резисторов с компаратором (и куска программы). Получилось просто, дешево и довольно точно.

Я привожу обе схемы – и с кнопками, и с колесом, а также программы для них. При желании обе схемы можно легко совместить, слегка изменив адреса внешних устройств, нужно только помнить, что режим CHORUS (STEREO) использует pitch для получения расстройки и его нужно или убрать, или озаботится передачей pitch с расстройкой по каналам.

Итак – собственно клавиатура

Схема устройства

Первым появился нединамический вариант, нечувствительный к силе удара по клавише – для проверки работоспособности макета.

Я использовал PIC16F84 в качестве процессора из нескольких соображений: эта микросхема доступна, дешева и удобно программируется, кроме того – именно она оказалась у меня под руками. Внимание: PIC16C84 не годится – у него ОЗУ всего 36 ячеек и программа не будет работать. Впрочем, схема с колесом использует меньше ячеек ОЗУ и ее программу можно втиснуть и в PIC16C84, сократив еще пару ячеек, например MIDCH (присвоив постоянный MIDI канал всем передаваемым данным).

Схема динамической клавиатуры с индикацией приведена ниже:

Схема во многом традиционна – трудно изобрести велосипед без педалей и колес.J Порт B работает на передачу – младшие 7 бит выводят адрес клавиши в матрице или данные для внешних устройств (индикатор и ЦАП колеса). Старший бит используется для вывода MIDI данных последовательным кодом – преобразование и вывод сделаны программными. Поэтому кварц должен быть на 4 MHz, если вы не хотите переписывать процедуру вывода байта по MIDI. Два младших бита порта A работают на прием – на них поступают  сигналы с мультиплексоров  “отпущенных” и “нажатых” контактов клавиш, а три старших бита определяют адрес внешнего устройства (через еще один дешифратор КР1533ИД7). В схеме с колесом от дешифратора адреса внешнего устройства я отказался для упрощения схемы и освобождения старшего бита порта PA4 для ввода данных с компаратора, поэтому адреса клавиатуры и кнопок другие. При совмещении схем эту микросхему придется вернуть, для дешифрации адреса использовать биты порта PA2 и PA3,и адресовать 4 устройства: клавиатуру, кнопки, регистр данных динамической индикации и регистр знакоместа динамической индикации. Индикацию режимов колеса придется переписать.

Схема с колесом  PITCH WEEL / MODULATION выглядит так:

На каждую клавишу ставится один диод для развязки. Резисторы на входах мультиплексоров не должны быть более 8k, иначе возможны глюки из-за емкости монтажа. Индикатор – любой с общим анодом на 3 разряда, если выводы сегментов каждого разряда выведены отдельно, выводы одноименных сегментов нужно объединить – индикация динамическая и разряды зажигаются последовательно. Кнопки любые, без фиксации, дребезг контактов давится программно. Светодиоды установлены возле одноименных кнопок и индицируют включение соответствующих режимов, кнопки  «+» и «- » светодиодов не имеют. Транзисторы на индикаторе любые маломощные высокочастотные обратной проводимости. Два регистра КР1533ИР23 использованы для  поочередного  защелкивания  адреса  и  кода  текущего разряда индикатора  (светодиоды тоже сгруппированы в два квазиразряда). У меня использована стандартная клавиатура от еще советских электроорганов на 48 клавиш (она выпускалась и отдельно как  радиоконструктор  «СТАРТ», и довольно широко распространена). Чтобы  уменьшить  высоту клавиатуры и  толщину  инструмента, из шести контактных групп  под каждой клавишей оставлено две, и все это обрезано и переклеено. Вообще достаточно одной переключающей группы на клавишу, но так было удобней клеить. Сборные шины  “отпущенных” и “нажатых” контактов имеют длину 8 клавиш. При желании можно использовать и клавиатуру, где вместо переключающей группы контактов используется две пары замыкающих контактов – одна пара замыкается в начале движения клавиши, другая в конце (как на инструментах YAMAHA). В этом случае  сигнал на PA0 нужно подавать с инверсного выхода мультиплексора (вывод 6). Без изменений в схеме можно использовать клавиатуру на 64 клавиши (стандарт – 61, т.е. 5 октав). При необходимости число клавиш может быть увеличено хоть до 127, для этого в схему нужно ввести еще один дешифратор КР1533ИД7.

Очень важно хорошо отстроить механику – верхние контакты ОБЯЗАТЕЛЬНО должны замыкаться при отпускании клавиш. Если этого не сделать, программа считает такие клавиши нажатыми и пытается их обрабатывать, поэтому повторное нажатие этих клавиш звука не дает. Кроме того, максимальное количество одновременно звучащих нот – 10 (если у кого-нибудь на руках выросло больше пальцев, это количество легко изменить), и не отпущенные клавиши уменьшают это количество. Из этих же соображений число клавиш, указанное в процедуре опроса клавиатуры, должно  ОБЯЗАТЕЛЬНО совпадать с количеством реальных клавиш. Дребезг контактов давится программно.

Для резистивной матрицы R-2R АЦП желательно подобрать резисторы с точностью 1–2%, причем абсолютные значения могут быть и другие, важно отношение. Впрочем, сильно увеличивать номинал не стоит, это увеличит время преобразования из-за входной емкости компаратора. Я использовал SMD резисторы без подбора, хотя измерения показали, что в одной монтажной полоске резисторы обычно согласованы с точностью выше 1%. Я уверен, что схема будет работать и с неточными резисторами, но линейность характеристики ухудшится. Само колесо сделано из ручки от старого телевизора и имеет пружинку на оси потенциометра, возвращающую его в среднее положение. Для удобства настройки механики, при включении питания с нажатой кнопкой режима, включается отладочная программа, зажигающая светодиод, когда колесо находится в среднем положении, это позволяет точно настроить нулевой положение колеса на оси потенциометра. Если есть потребность и желание сделать отдельное колесо MODULATION, его нужно подключить к свободному элементу компаратора (их там четыре), причем матрица R-2R у обоих колес общая. Для коммутации выходов компараторов лучше применить дополнительную микросхему, а в качестве управляющего сигнала использовать PA2.

При желании можно собрать динамический вариант клавиатуры и без индикации, кнопок и колеса PITCH WEEL / MODULATION – просто не собирая неиспользуемую часть схемы. Все изменяемые параметры будут установлены по умолчанию при включении питания…

Питать это все можно от чего угодно, ток потребления зависит от конкретного индикатора и не превышает 100 mA. У меня прямо на плате стоит стабилизатор 7805 без радиатора (его хорошо видно на фотографии). Небольшой радиатор нужен, если на него подавать более 9v. Компаратор питается напряжением 9 – 12 v, желательно стабилизированным. Да, я использовал микросхемы советского производства из старых запасов – существует большое количество их современных аналогов, замена возможна и даже желательна – современные аналоги имеют меньшее потребление.

Программа

Алгоритм обработки нажатых клавиш происходит от предложенного в журнале «Микропроцессорные средства и системы» №5 за 1986г. Именно эта публикация  (а точнее, ошибка в предложенной программе) и побудила меня к изучению ассемблера. Собственно, оттуда взята лишь идея записывать номер каждой нажатой клавиши в специально выделенную область ОЗУ (CHAN), чтобы при повторном опросе клавиатуры не обрабатывать снова уже обработанную клавишу. У меня под каждую из нажатых клавиш (всего не более 10) отведено две ячейки ОЗУ: в первой записывается номер  нажатой клавиши, во второй – ее VELOCITY (скорость нажатия). Повторюсь – этих ячеек всего 20 и начальный адрес задан именем CHAN. Признаком свободной пары является установленный старший бит первой ячейки. Установленный старший бит второй ячейки означает, что NOTE ON для этой клавиши уже передано и в дальнейшей обработке она не нуждается.

Подробно описывать всю программу я не буду, исходник изобилует комментариями и для подготовленного человека вполне доступен. Для остальных я даю сразу готовые прошивки в файле Dinamic.hex  и  Pitchmod.hex. Поясню только некоторые неочевидные моменты. Ну, прежде всего о динамике: в момент размыкания верхних контактов клавиши ее номер записывается в первую ячейку первой же свободной пары  из области CHAN, одновременно сбрасывая  признак свободной пары. Во вторую ячейку записывается начальное значение VELOCITY = 127. Чувствительность клавиатуры определяется частотой следования прерываний, так как обработка прерывания уменьшает значения VELOCITY для всех клавиш, NOTE ON которых еще не  передано. Прерывания вызываются  встроенным таймером. В момент замыкания нижних  контактов клавиши в соответствующей ячейке CHAN  устанавливается признак «переданности» и передается NOTE ON с текущей VELOCITY. Для улучшения кривой чувствительности уменьшение значений VELOCITY идет по логарифмическому закону: из текущего значения VELOCITY вычитается 1/16 его часть, уменьшенная на 1. Таким образом, во время движения клавиши от верхнего контакта к нижнему значение VELOCITY в соответствующей ячейке CHAN уменьшается по логарифмическому закону, и чем быстрее движется клавиша, тем больше VELOCITY в момент замыкания нижних  контактов клавиши и  передачи NOTE ON. Прерывания также управляют динамической индикацией, это сделано для устранения мерцания индикатора.

Функции кнопок: TRANSPOSE – все тональности приводятся к любимому ля-минору: диапазон +/- 15 полутонов. PRG назначает тембр (инструмент) для заданного пресета (UP1-UP5), а VOL – его громкость. Текущий параметр выводится на индикатор и может изменяться кнопками «+» и «-».TWIN выводит «двойной» тембр – звучат одновременно один из пресетов (UP1-UP5) и, одновременно пресет LOWER. STEREO выводит звук текущего пресета в правый и левый стереоканалы с небольшой «расстройкой» (эффект «хорус»). Кнопка SPLIT не задействована. Педаль SUSTAIN схемотехнически выполнена, как одна из кнопок, емкость ее провода не должна быть очень большой. Адреса обработчиков кнопок собраны в таблицу в начале программы, при изменении функций кнопок можно  подставить свои.

АЦП колеса наполовину программный, работает по алгоритму последовательных приближений, матрица R-2R выполняет преобразование “цифра – аналог”. Вначале на матрицу R-2R подается 1 в старшем разряде, и компаратор определяет, много это или мало. Если мало, в старшем разряде остается 1, если много – 0.Далее то же самое происходит с каждым следующим младшим разрядом (всего 6 шагов) и мы получаем шестибитное число, соответствующее углу поворота колеса. Такая точность мне представляется достаточной, но можно добавить еще один бит, увеличив матрицу и программу преобразования.

Конструкция

В качестве собственно клавиатуры я использовал конструктор «Старт» советского производства, сейчас, пожалуй, легче найти старую неработоспособную Ямаху или Касио, это решит и проблему изготовления корпуса – если он конечно у старого инструмента относительно цел…

Печатная плата не разрабатывалась – я посчитал нецелесообразным для изготовления единичного экземпляра устройства тратить время на разводку и изготовление платы, а макет был изготовлен на монтажной плате с помощью перемычек из МГТФа. В качестве разъема  и шлейфа к клавиатуре был использован шлейф от флоппи-дисководов из компьютера с соответствующим разъемом с каждой стороны – это облегчает сборку/разборку готового устройства.

В моем случае корпус был выгнут из тонкой листовой стали (что было под руками) – с деревянными боковинами (как у старых советских инструментов).

Ну вот, вкратце, и все. Творческих успехов!

Скачать исходники и прошивки

Автор: Семенов Михаил Валентинович (old1mike@rambler.ru)


Категория: Для музыкантов
Метки:
2 комментария на “Динамическая MIDI клавиатура на PIC16F84”
  1. Vadim:

    Супер статья!
    Подскажите как правильно организовать коммутацию выходов компараторов (PITCH WEEL / MODULATION) под управлением РА2 с применением какой микросхемы и если можно рисунок этой части схемы или более подробное описание.

  2. Vinchence:

    Данные схемы повторены неоднократно, при небольшой доработке работают как захочет пользователь.
    Если сменить PIC на посовременнее, возможности клавиатуры возрастают в разы.
    Vinchence@yandex.ru

Написать коментарий

*
= 4 + 6

Добавить изображение

Последние статьи