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
最低限必要なファイルだけにするとこうなる。
修正が必要なファイルは
rm18f4550 - HID Bootload.lkr
----------------------
LIBPATH .
FILES c018i.o
FILES clib.lib
//FILES p18F4550.lib
FILES p18F2550.lib
---------------------
2550用のlibを使用する様に変更する。
とりあえずブレッドボードにCPUボードを組んで書込んでみる
書込み完了後に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);
}
}
次は加工編