記事一覧

音響用操作キーパッドをつくる その2

Windowsからキーボードとして認識させれば良い(もしくはMIDIの機能を持たせる必要がある)ので、USB上にHIDを実装してキーが押されたら対応するキーコードを送信するプログラムが必要になる。

以下、構成

CPU: Microchip 18F2550(秋月の基板を使用)
USBStack:Microchip Libraries for Applicationsから流用
キー入力処理:自作

まぁ、御約束の構成となる。

インストールすしたディレクトリにある以下の場所が、HID関連のものとなる。

C:\Microchip Solutions v20XX-XX-XX\USB\Device - HID - Keyboard\Firmware

プロジェクトファイルはこれ
USB Device - HID - Keyboard- C18 - PICDEM FSUSB.mcp

最低限必要なファイルだけにするとこうなる。
ファイル 6-1.jpg

修正が必要なファイルは
rm18f4550 - HID Bootload.lkr

----------------------
LIBPATH .

FILES c018i.o
FILES clib.lib
//FILES p18F4550.lib
FILES p18F2550.lib
---------------------
2550用のlibを使用する様に変更する。

とりあえずブレッドボードにCPUボードを組んで書込んでみる
ファイル 6-2.jpg

書込み完了後にUSBケーブルでPCとつなぐと、0~z迄が
延々と繰り返されて出力される。

なんで、繰り返し出続けるかというと、秋月基板はRBポートがプルアップされていないので、sw3(RB5)が押された事になっている。
なので、HardwareProfile - PICDEM FSUSB.h

#define mInitSwitch2() TRISBbits.TRISB4=1;

#define mInitAllSwitches()INTCON2bits.RBPU=0;TRISBbits.TRISB4=1;
に変更してポートBの内部プルアップを有効にする。
あとはKeyboard.cを適当に修正して、各キーが押された時に、対応するキーコードが送信されるようにする。

以下、適当に抜粋

BOOL SwitchIsPressed(unsigned char *keycode)
{
if(sw_PLAY != old_play_key){
old_play_key = sw_PLAY; // Save new value
if(sw_PLAY == 0){ // If pressed
*keycode = 0x28;// HID KeyCode
return TRUE; // Was pressed
}
}//end if
if(old_up_key != sw_UP){
old_up_key = sw_UP;
if(sw_UP == 0){ // If pressed
*keycode = 0x52;
return TRUE; // Was pressed
}
}
if(old_dn_key != sw_DN){
old_dn_key = sw_DN;
if(sw_DN == 0){ // If pressed
*keycode = 0x51;
return TRUE; // Was pressed
}
}
if(old_l_key != sw_L){
old_l_key = sw_L;
if(sw_L == 0){ // If pressed
*keycode = 0x50;
return TRUE; // Was pressed
}
}
if(old_r_key != sw_R){
old_r_key = sw_R;
if(sw_R == 0){ // If pressed
*keycode = 0x4f;
return TRUE; // Was pressed
}
}
if(old_sp_key != sw_SP){
old_sp_key = sw_SP;
if(sw_SP == 0){ // If pressed
*keycode = 0x2c;
return TRUE; // Was pressed
}
}


return FALSE; // Was not pressed
}//end Switch3IsPressed
void SendKeyMakeEvent(unsigned char key)
{
//Load the HID buffer
hid_report_in[0] = 0;
hid_report_in[1] = 0;
hid_report_in[2] = key;
hid_report_in[3] = 0;
hid_report_in[4] = 0;
hid_report_in[5] = 0;
hid_report_in[6] = 0;
hid_report_in[7] = 0;
//Send the 8 byte packet over USB to the host.
lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x08);
}


void Keyboard(void)
{
static unsigned char key = 4;
unsigned char keycode;
//Check if the IN endpoint is not busy, and if it isn't check if we want to send
//keystroke data to the host.
if(!HIDTxHandleBusy(lastINTransmission))
{
if(SwitchIsPressed(&keycode))
{
SendKeyMakeEvent(keycode); //CR
}
else
{
SendKeyMakeEvent(0);
}
}


次は加工編

音響用操作キーパッドをつくる その1

インターフェイスを替えたので、ついでに操作キーパッドも作る。

音響はableton liveをノートPCに入れて使っているが、狭いブースの暗い中で、ノートPCのキーを操作するのが、結構つらい。
なので、プロの音響さんとかはこんなのを使っている様だけど、ありもので作ってみる。

元ネタはALESISのDATのリモコンらしきキーパッドをオークションで落札\200(^_^)/
ファイル 5-1.jpg
PLAYキーとかが、いい具合に引っ込んでいて、誤操作を防いでくれそう。

liveで音だしに使うキーは、とりあえずはRETURNだけで良いが、
せっかくなので
RETURN
UP KEY
DOWN KEY
LEFT KEY
RIGHT KEY
SPACE
を割り当ててみる事にする。

まずは分解。背面のネジ2本を外すだけ。
ファイル 5-2.jpg
ファイル 5-3.jpg
中身は非常にシンプル。元々がボタンを押した時に
アサインされた抵抗値を6.3mmプラグで本体に伝える仕様なので、良くあるワンチップマイコンとかが入っていなくて、
かつ、SWもゴム接点ではなくタクトSWなので、改造しやすい。
(予備用にもっと買っておこう)