Jump to content
C-r-o-w

Самодельная Midi-клавиатура

Recommended Posts

Господа. Очень нужна помощь. Хочу сделать собственную миди-клаву. Советов по поводу изобретения велосипеда не требуется, т.к. собрал уже одну на PIC16F84. Теперь хочу свою собственную на атмеге. Уже написал обработчик клавиш, и процедуру отправки байта по МИДИ-протоколу. Но вот беда - комп не понимает никаких сигналов от МК (для проверки отправляется последовательность: 0b10010000, 120, 120 (NoteOn c каналом 1, номер ноты 120, динамика 120). Комп просто молчит (никакие миди-мониторы не помогают. Пробовал также Cubase). Прикладываю схему (на всякий случай):

qp5VoPdWpD.png

Также график выходного сигнала (из Протеуса) (для наглядности показана отправка байта 0b10101010:

1dOVMKqiHS.png

Вроде все "времена" соблюдены, все "биты" по 31-32 мкс. Всего одна посылка занимает 310 мкс (видно на графике). Что не так?

Может быть дело в подключении сего девайса к миди-ин пину компьютера? Почитал про всяческие переходники, опто-развязки итд... Но ведь схема на ПИКе и аналогичные цепляются напрямую! Дело вот в чем. При подключении моей атмеги к +-5 В игрового порта, напряжение сильно падает, примерно до 2 В. Поэтому для питания ее использую автономный БП. Изучив это:

0bQ9Rfpx7B.gif

подумал, что комп понимает под "токовой посылкой" (логич 0 в МИДИ-интерфейсе) замыкание 15-го вывода на землю. Поэтому соединил 15 вывод порта компа через резистор с моим выводом МК. Массу компа (4,5 выводы) с массой МК. Может в этом дело? Помогите, пож-та!

Edited by C-r-o-w

Share this post


Link to post
Share on other sites

Если я не ошибаюсь, то ты посылаешь данные по каналу 0. Я тоже как то давно делал собственную миди клавиатуру. Там передается 90+номер канала (для первого канала будет 91), потом номер ноты, потом скорость нажатия (отпускания). Я тоже подключал без опторазвязки, нормально работает.


Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

Share this post


Link to post
Share on other sites

Дык нулевого канала нету. 0000 (младшая тетрада байта NoteOn) соотв-ет 1-му каналу. 1111 - 16-му. Да и это неважно. Я же монитором смотрел (midimon), он все каналы мониторит, все сообщения из порта миди... Глухо...

А Вы на чем писали? Всмысле какой МК? Можете прислать мне? В протеусе не моделировали (мне для сравнения диаграмм)?

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Инновационные технологии Analog Devices в области управления питанием» (11.08.2021)

В программе вебинара технология Silent Switcher® - сочетание высокого КПД и сверхмалого уровня ЭМИ, технология uModule® - высокоинтегрированные решения для источников питания, микро- и нанопотребляющие DC/DC-преобразователи, решения для резервного питания, цифровое управление системой питания (PSM), безоптронные изолированные обратноходовые преобразователи. В практической части вебинара будут продемонстрированы примеры работы с инструментами Analog Devices для проектирования источников питания.
Подробнее

Если у вас гасит мега на 2 вольта - то у вас чтото не в порядке с схемой... На миди порте идёт 5 вольт напрямую с материнки... Я один раз замкнул... Искры, комп погас... Но ничего страшного не случилось..

Share this post


Link to post
Share on other sites

Концевые микропереключатели KLS – простая и надежная коммутация по оптимальной цене

На складе Компэл широко представлены нажимные переключатели от KLS в стандартных и миниатюрных корпусах с различными типами актуаторов. Микропереключатели серий KLS7-KW10 и KLS7-KW4-3Z соответствуют строгим стандартам электрической безопасности и эффективности, что гарантирует надежную коммутацию цепей управления.

Подробнее

Странно... Схема вроде в поряде... Правда я тестирую прошивку на моей плате от часов, там транзисторы, еще всякая всячина, микросхемы другие, может они садят питание... С компом ничего не происходит во время этого просаживания... Просто думаю схема слишком много хочет по току... Да и импульсы выдает (для проверки пробовал выдавать меандр глубиной 1 сек, чтобы мультиметр успел засечь. Все работает... Может кусок проги выложить? В нем че-нить не то?

Share this post


Link to post
Share on other sites

Датчики STMicroelectronics – новые возможности систем умного дома ST

Согласно прогнозам аналитиков, в ближайшие пару лет будет наблюдаться заметный рост рынка датчиков движения и положения для умного дома. Компания STMicroelectronics предлагает одну из самых широких линеек MEMS-датчиков, включая акселерометры, гироскопы, цифровые компасы, модули IMU, микрофоны и датчики параметров окружающей среды. Рассмотрим применение датчиков и тенденции их развития.
Подробнее

Я писал для контроллера 89с51 среда Keil uVision.

Прикрепить не удалось, так напишу.

//******************************************************//
//		MIDI Controller			         	                         //
//   		     Panda				                                         //
//		mart 2006 year				                                 //
//******************************************************//
#include <REGx51.H>

#define on 1
#define off 0

//P0.0 - P0.3 Octave
//P0.4 - P0.7 Tone 
//P2.0 - P2.7 Tone
//TxD  - MIDI out
//Speed 31250, 1 start bit, 1 stop bit, 8 data bit
unsigned char ch;
unsigned char vpress_rel;
unsigned char offset;

void send(unsigned char i, unsigned char s)
{
unsigned char tmp;
P1_1 = 0; //led on for first chanel
tmp = 9 - s;
tmp = tmp << 4;
tmp = tmp + ch;
SBUF = tmp;
while (!TI);
TI = 0;			//first byte channel 80 or 90 + chanal number

SBUF = i;
while (!TI);
TI = 0;			//second byte note number

SBUF = vpress_rel;
while (!TI);
TI = 0;			//third byte press or release speed
P1_1 = 1;
}


void main(void)
{
unsigned char key[48];
unsigned char i,j;
int mask;
//Set baude rate 31250
TMOD = 0x22;
TH1 = 0xFF;
TL1 = 0xFF;

SCON = 0x42;
TCON = 0x20;
TR1 = 1;

P0 = 0xF0;
P2 = 0xFF;

ch = 1;
vpress_rel = 0x63;
offset = 41;
P3_3 = 0;
for (i=0; i<48; i++)
key[i] = 1;
//Keyboard scan
while (1)
{
for (j=0; j<4; j++)
{
P0 = ~(0x01 << j);
P2 = 0xFF;
mask = P0 & 0xF0;
mask = mask << 4;
mask = mask + P2;
//P0 = 0xF0;
for (i=0; i<12; i++)
{
if (((mask >> i) & 0x01) != key[j*12+i])
{ key[j*12+i] = (mask >> i) & 0x01;
 send(j*12+i+offset, key[j*12+i]);
 }
	};
}; //for

};//while
}//main


Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

Share this post


Link to post
Share on other sites

Вот, что я понял из Вашей программы:

key[] - матрица 0 и 1 - состояния клавиш. В цикле идете и смотрите состояние каждой клавиши. Если оно изменилось, то запускается процедура Send с параметрами: номер клавиши tmp и состояние (нажата\отжата) s. В процедуре формируется байт на отправку tmp. И загоняется он в... Видимо в этом контроллере встроена функция отправки байтов TXD по схожему протоколу? Потому что дальше этот байт загоняется в какой-то буфер, и далее отправка идет уже на физическом уровня, насколько я понял...

Может в Атмега8 тоже есть похожая функция?

Вот мой текст программы. Очень схож с Вашим, мыслим одинаково. ))

/*****************************************************
Project : Atmega8 based MIDI-keyboard
Version : 15.09.08
Date    : 03.06.2008
Author  : Vladimir Podgoretsky
Company : OmSU
Comments: E-mail: r-a-v-e-n<dog>bk.ru, ICQ: 401118477
Chip type           : ATmega8
Clock frequency     : 8,000000 MHz
//*****************************************************/
//*****************************************************/

#include <mega8.h>
#include <delay.h>

char  i, j;
unsigned char temp1, temp2,ROWS[8];
unsigned char MATRIX[8][8];
unsigned char MatOLD[8][8];
unsigned char NoteNum;
//int eeprom *ptr_to_eeprom;

[b]SendByte(char bit7)
{
unsigned char tmp = 0b10000000; // MASK
 char k; // Counter
 PORTC.0 = 0;  // START
 delay_us(29); // START

 for (k=0; k<=7; k++)
   {
     if (bit7 & tmp)   // If sending bit is 1:
       PORTC.0 = 0; // If sending bit is 1:
     else                   // If sending bit is 0:
       PORTC.0 = 1; // If sending bit is 0:
     delay_us(29);
     tmp = tmp / 2; // Moving of the Mask to right >>
   }

 PORTC.0 = 1;  // STOP
 delay_us(29);  // STOP

}

NoteOn(char i, char j)
{
 NoteNum = i*8 + j + 1;   // Calculating of Code of Note
 SendByte(0b10010000); // Send Note-On Command with 1-st channel
 SendByte(NoteNum); // Send Data-Byte with number of Note
 SendByte(120);  // Send Press-Dynamics
}

NoteOff(char i, char j)
{
 NoteNum = i*8 + j + 1;
 SendByte(0b10000000);
 SendByte(NoteNum);
 SendByte(120);
}[/b]

//================================INTERRUPT HANDLER==================================//
//===================================================================================//
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// ~~~~~~~~~~~~~~~~~~~~~~~~~BUTTONS HANDLER~~~~~~~~~~~~~~~~~~~~~~~~~~ //
DDRD = 0x00;
PORTD = 0xFF;
DDRB = 0xFF;
PORTB = 0xFF;

temp1 = 1;
for (j=0; j<=7; j++)
 {
   PORTB = ~temp1;
   ROWS[j] = ~PIND;
   temp2 = 1;
   for (i=0; i<=7; i++)
     {
       MATRIX[i][j] = (0xFF) && (ROWS[j] & temp2);
       if (MATRIX[i][j] != MatOLD[i][j])
         {
           if (MATRIX[i][j]==1)
             NoteOn(i,j);
           if (MATRIX[i][j]==0)
             NoteOff(i,j);
         }

       MatOLD[i][j] = MATRIX[i][j];
       temp2 = temp2 * 2;
     }
   temp1 = temp1 * 2;
 }

//      MATRIX :    i - number of string
//                  j - number of column
// ~~~~~~~~~~~~~~~~~~~~~ END OF BUTTONS HANDLER ~~~~~~~~~~~~~~~~~~~~~ //
}
//===================================================================================//
//===================================================================================//

void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0b00000001;
DDRC=0b00000001;
PORTD=0x00;
DDRD=0x00;

TCCR0=0x03;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x01;
ACSR=0x80;
SFIOR=0x00;
for (i=0; i<=7; i++)
 for (j=0; j<=7; j++) 
   {
     MATRIX[i][j] = 0;
     MatOLD[i][j] = MATRIX[i][j];
   }
#asm("cli");
[b]
while (1)
 {
 NoteOn(5,5);
 delay_ms(500);
 NoteOff(5,5);
 delay_ms(500);

 }[/b]
}

Share this post


Link to post
Share on other sites

Почитал даташит на мегу8... Есть в ней UART... Даже USART. но миди - это асинхронный протокол... поэтому надо юзать УАРТ. Правда этот вывод висит на порте Д, на котором кнопки висят, ну да ладно, или мультиплексор поставлю, чтобы линии освободить, или другой вывод задействую... например из порта Ц. Хотя лучше мультиплексор. Ладно, завтра буду разбираться с этим УАРТом. А по поводу подключения схемы к игровому порту - всё нормально? так и должно быть? (если питание автономное, то используются только земля (4 или 5) и 15 выводы порта? +5 вольт не нужно для подключения?

Share this post


Link to post
Share on other sites

все верно SBUF это буффер передатчика UART, все передается по уарту, пакеты одинаковые, разница только в том что выбирается фиксированная определенная скорость 31250, 1стартовый бит, 1 стоповый и в физическом интерфейсе, все. :)

Edited by Panda_y2k

Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

Share this post


Link to post
Share on other sites

Сконфигурил я УАРТ на меге... В протеусе также все ОК, идут импульсы, все норм. А комп не хочет их принимать... Выхода наверно 2: либо игровой порт спалил, пока экспериментировал, либо что-то с автономным питанием. Сейчас попробую снять мегу с платы часов и просто запаяться на нее, питание, и выход УАРТа. Кварцевание внутреннее... Эх, надеюсь, заработает...

Share this post


Link to post
Share on other sites

Питание к стати я тоже брал с миди порта, так что отдельного блока питания у меня нет. Распиновку не помню, но могу раскрутить разъем и посмотреть если надо. Питания потребляет очень мало, ни чего не просаживается.


Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

Share this post


Link to post
Share on other sites

Всем большое спасибо за внимание. Проблему решил. На материнке игровой порт не выведен в виде разъема наружу. Подключался я к нему на саму материнку. Там контакты пронумерованы... Сверху ряд - четные, снизу - нечетные (1,3..15). Оказалось, эта нумерация НЕВЕРНА!!! :angry: :angry: :angry: Нумерация идет так (слева направо): нижний ряд: 1,2,3..8, верхний: 9,10..15. Такие пироги. Так что, владельцы материнских плат Grantsdale-6A79DBKBC-00 (скопировал из какой-то утилиты), вообще на ней написано Albatron, БУДЬТЕ ОСТОРОЖНЫ! Нумерация выводов игрового порта не соответсвтует действительности!!!

Всем еще раз спасибо за внимание.

Share this post


Link to post
Share on other sites

Господа, это опять я... Доделал МИДИ-клавиатуру... Но вот беда... Она ТО РАБОТАЕТ, ТО НЕ РАБОТАЕТ... В том смысле, что комп иногда понимает миди-команды, а иногда нет... В чем баг, отловить не могу. Перезагрузка компа не помогает. Только вчера вечером наблюдал в МИДИ-мониторе Note On'ы и Note Off'ы... А сейчас пусто... Есть какие-нибудь идеи? Может дрова?

P.S. В протеусе все эмулится, Virtual Terminal распознает все команды с УАРТА.

Кстати, кому интересно, могу выложить схему и исходники с прошивкой. В клаве реализована поддержка Pitch-Bend (с использованием АЦП, правда, к сожалению испытать не успел, опять черная полоса - комп опять не видит клавы), LCD-дислей, 64 нотных клавиши, 16 управляющих... Пока идет тестирование сего девайса.

Share this post


Link to post
Share on other sites
Кстати, кому интересно, могу выложить схему и исходники с прошивкой. В клаве реализована поддержка Pitch-Bend (с использованием АЦП, правда, к сожалению испытать не успел, опять черная полоса - комп опять не видит клавы), LCD-дислей, 64 нотных клавиши, 16 управляющих... Пока идет тестирование сего девайса.

Уважаемый конечно выкладывайте! можете в ЛС что бы тему нне засорять. вашей работой очень заинтересован.


russian3ob3.png

Share this post


Link to post
Share on other sites
Уважаемый конечно выкладывайте! можете в ЛС что бы тему нне засорять. вашей работой очень заинтересован.

Ок, если хоть у кого-то появился интерес... Выкладываю. Думаю, можно и сюда, да простят меня модеры... )

Если будут вопросы, пишите: ася, мыло, эта тема, в конце концов.

Проблемы с "общением" платы с компьютером вроде решил - не было задержек между отправкой байтов... Добавил. Но появились другие проблемы... В-общем, пишите, обсудим!

MIDI_KEYBOARD_ATMEGA8.rar

Share this post


Link to post
Share on other sites

Очень заинтересовала статья. Насколько я понял в файле прошивки записаны готовые MIDI мелодии? Выложите пожалуйста схему принципиальную получше разобраться. Какие фьюзы надо ставить при прошивке меги. Заранее благодарю. :rolleyes:

Share this post


Link to post
Share on other sites

К сожалению, мое упущение, что схему не вложил в файл в графическом формате типа .jpg или .png. Если Вас не затруднит, поставьте Proteus (например, версии 7). Там в архиве есть файл проекта (если не ошибаюсь, расширение .dsn). После отркытия можно будет увидеть как саму схему, так и просимулировать ее, т.е. посмотреть работоспособность.

Все-таки, настоятельно рекомендую Вам это сделать, т.к. проект не доведен до логического завершения, его надо допиливать напильником.

Готовых МИДИ-мелодий там нет. В-общем, ставьте, проверяйте. А там уже будем разбираться с фьюзами, если интерес не пропадет.

Share this post


Link to post
Share on other sites

Уже больше 2-х лет прошло! У меня так где то и валяется незаконченная платка. Всё таки было бы круто завершить проект, так как в инете не много таких проектов, а на момент создания этой темы вообще небыло.


russian3ob3.png

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Цитата

...Теперь хочу свою собственную на атмеге...

добрый день

C-r-o-w, 

схемой не поделитесь? 

- проект более не развивается?

спасибо

 

Share this post


Link to post
Share on other sites

зачем

5 часов назад, sunjob сказал:

схемой не поделитесь? 

если не так дорого можно готовую купить с нормальным функционалом ....

Share this post


Link to post
Share on other sites

спасибо, краб, огромное! от вас меньшего и не ожиЖдал!!! прям вот так вот с сылками, примерами, своими пояснениями, что лучше, вот тут вот, так-то, вот тут такая-то фенечка, вот эту вот я только вчера настраивал а... вот эту тЁще установил в туалет, пусть помнит зятька...!!!

p.s. если не сложно, аргументируйте, я обязательно прочитаю, ознакомлюсь и приму к сведения! :thank_you2:

 

Edited by sunjob
!!!

Share this post


Link to post
Share on other sites
11 часов назад, sunjob сказал:

если не сложно, аргументируйте, я обязательно прочитаю, ознакомлюсь и приму к сведения!

да элементарно - взял себе и сыну в довесок к нескольким синтезаторам пару миди-клав на Аукционах - CME U-KEY за 35 у.е. и CME Mkey за 25 у.е. И они разные постоянно появляются в продаже в нете на торговых площадках ...

Какой смысл что-то делать самому при такой цене ?

 

 

12345.jpg

123456.jpg

На днях, перебирая хлам, нашел платку от АОН, на которой я начинал делать миди-клаву лет 15-20 назад .... посмеялся над потраченным временем и под нож ее ...

Нужны еще аргументы?

Edited by KRAB

Share this post


Link to post
Share on other sites
Цитата

Нужны еще аргументы?

конечно нужны, че-бы мы тут делали без них?! :o)

сейчас "изучаю тему", как отпишусь, с вопросами, мымслями, приглашаю к беседе (стукну в личку)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Есть в продаже специальные димеры, см рис:
    • Доброго времени суток всем!Пытаюсь неастроить схему компрессора на лампе. Честно говоря, работает так себе. Примерно тоже самое и писали на форуме, откуда брал схему. Как считаете, работоспособна ли она? Дело в том, что это часть схемы, которая взята из лампового усилителя для бас гитары.
    • Такую манипуляцию не производил. Но в любом случае резистор это расходный материал. Вот и ищу. Получилось снова заняться данной темой спустя только больше месяца. В местном магазине сказали, что это китайская копия потенциометра Alps и рекомендовали искать на оф. сайтах. Вроде нашёл какой-то сайт alpsalpine, но там предлагают только сопротивлением 10 и тип шлица "половинчатый" ( а не ребристый). Вот и думаю, что будет, если вместо 50кОм взять 10?? 
    • Почему  мобилка не взрывается, если она сутками  подключенна на заряд? Аккумулятор от мобилки имеет встроенный контроллер, который отключает зарядку когда аккумулятор полностью заряжен.  Не верите? Ну вот  знающие люди пишут: "Что такое контроллер батареи? Контроллер заряда аккумулятора — простыми словами, это печатная плата внутри элемента питания. Правильное её название «BMS-плата» (Battery Management System), то есть плата системы управления аккумулятором. Прежде всего, контроллер нужен для сохранения дорогостоящего аккумулятора от критических отклонений напряжения от номинальных 3,7 Вольт путём отключения. На BMS-плате распаяны электронные компоненты для защиты устройства от неисправностей по электроцепи питания. Без неё работать литий-ионные аккумуляторы теоретически могут, но это приведёт к их скорейшему выходу из строя с высокой вероятностью взрыва."
    • Корпус и трансик 1000 р. На морду хорошо встает плоский наличник на дверную коробку. Цена вопроса 100 рублей за 2,2 метра. Остальное актуально.
    • ПП Симметрона и тор проданы. Остальное в продаже. Сборка обсуждается. Также обсуждается комплектовка и сборка других УМЗЧ с этого форума и не только. Возможна трассировка ПП УМЗЧ и ПУ на заказ.
    • Если просто читать, то хоть 10 устройств, главное не пытаться писать более чем с одного. Мастер тот, кто спрашивает, т.е. БК. На кой тогда цеплять туда и БК и ардуйню? Кто мешает спрашивать сразу ардуйней?
×
×
  • Create New...