mbed USBKeyboardについて質問です

02 Oct 2012

http://mbed.org/handbook/USBKeyboard このライブラリを使っているのですが、ESCキーの送信方法が分かりません… どなたか教えて頂けないでしょうか

02 Oct 2012

http://mbed.org/users/samux/code/USBDevice/file/140cdf8e2d60/USBHID/USBKeyboard.cppを眺めてみたのですが、無理そうです。

USBのキーボードは、簡単なので、

規格表

http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdfの53ページ

http://www.usb.org/developers/devclass_docs/HID1_11.pdfの60ページなど

を参考に、ライブラリを修正・追加すれば簡単にできると思います。

http://mbed.org/users/samux/code/USBDevice/file/140cdf8e2d60/USBHID/USBKeyboard.cpp
の445行あたりの関数を複製して、そのままキーコードが入るような関数を作ったらできると思います。

現状、同時押し(CTRL+ALT+DEL)とかも無理そうですし、簡単ですので作られたら良いと思います。

なお、規格表をみてわかるようにUSBキーボードは同時に特殊キーを除いて同時には6個までしか押せません。(豆知識)

05 Oct 2012

yasushi様

ご丁寧に返信有難うございます

実を言うとkeyCode()の使い方を完璧には理解していないのですが、取り敢えず頑張ってみます

05 Oct 2012

サンプルを作りました。

Import programUSBKeyboard_HelloWorld

keycode2 add USBKeyboard

なお、ライブラリはオリジナルからForkして追記したものです。

#include "mbed.h"
#include "USBKeyboard.h"

//LED1: NUM_LOCK
//LED2: CAPS_LOCK
//LED3: SCROLL_LOCK
BusOut leds(LED1, LED2, LED3);
DigitalIn key1(p17);
DigitalIn key2(p18);
//USBKeyboard
USBKeyboard keyboard;
void key1_on(void)
{
    //Ctrl+Alt+Del
    keyboard.keyCode2(0x4c,0,0,0,0,0, KEY_CTRL|KEY_ALT);
    wait(1);
}
void key2_on(void)
{
    //ESC
    keyboard.keyCode2(0x29);
    wait(1);
}
int main(void)
{
    bool k1,k2;
    k1=true;k2=true;
    key1.mode(PullUp);
    key2.mode(PullUp);
    while (1) {
        if (key1==0&&k1==1)key1_on();
        if (key2==0&&k2==1)key2_on();
        k1=key1;
        k2=key2;
        leds = keyboard.lockStatus();
    }
}

追加したメソッドのkeycode2では、生のKeyCodeを使用するので
http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdfの53ページを参照してください。
なお同時押しに対応しているのでKeyCodeを6個まで書けるようにしました。

なおkeyCode2の後に置いているWaitはチャタリング防止のためです。
p17をグランドにするとCTRL+ALT+DEL
p18をグランドにするとDEL
を押したことになります。

オリジナルのkeycodeは
http://mbed.org/users/samux/code/USBDevice/file/140cdf8e2d60/USBHID/USBKeyboard.cpp
を見てわかるように、キャラクターコードからキーコードへの変換MAPを持っています。
したがって、何も考えずに一文字ずつ文字を書けばOKです。

07 Oct 2012

なるほど…やっと理解する事が出来ました 色々と有難う御座います!