CH9329を使う際は、
しごぶさんのCH9329のライブラリーをありがたく利用させていただいている。
https://github.com/shigobu/CH9329_Keyboard
しかし、デフォルトのままでは、英語のUSキーボードの出力しかできない。正確には、ドイツ語やスペイン語といったキーボードの配列が入っているが、肝心な日本語キーボードが入っていない。

そこで、日本語キーボードへの対応をして、すべてのキーを入力できるようにする手順を残しておく事にする。
まず、ライブラリーのフォルダーに、KeyboardLayout_jp_JP.cppという名前のファイルを作成する。
中身は日本語のキーボードにあわせて以下にした。
/*
* Japanese keyboard layout.
*/
#include "KeyboardLayout.h"
extern const uint8_t KeyboardLayout_jp_JP[128] PROGMEM =
{
0x00, // NUL
0x00, // SOH
0x00, // STX
0x00, // ETX
0x00, // EOT
0x00, // ENQ
0x00, // ACK
0x00, // BEL
0x2a, // BS Backspace
0x2b, // TAB Tab
0x28, // LF Enter
0x00, // VT
0x00, // FF
0x00, // CR
0x00, // SO
0x00, // SI
0x00, // DEL
0x00, // DC1
0x00, // DC2
0x00, // DC3
0x00, // DC4
0x00, // NAK
0x00, // SYN
0x00, // ETB
0x00, // CAN
0x00, // EM
0x00, // SUB
0x00, // ESC
0x00, // FS
0x00, // GS
0x00, // RS
0x00, // US
0x2c, // " "
0x1e|SHIFT, // !
0x1f|SHIFT, // "
0x20|SHIFT, // #
0x21|SHIFT, // $
0x22|SHIFT, // %
0x23|SHIFT, // &
0x24|SHIFT, // '
0x25|SHIFT, // (
0x26|SHIFT, // )
0x34|SHIFT, // *
0x33|SHIFT, // +
0x36, // ,
0x2d, // -
0x37, // .
0x38, // /
0x27, // 0
0x1e, // 1
0x1f, // 2
0x20, // 3
0x21, // 4
0x22, // 5
0x23, // 6
0x24, // 7
0x25, // 8
0x26, // 9
0x34, // :
0x33, // ;
0x36|SHIFT, // <
0x2d|SHIFT, // =
0x37|SHIFT, // >
0x38|SHIFT, // ?
0x2f, // @
0x04|SHIFT, // A
0x05|SHIFT, // B
0x06|SHIFT, // C
0x07|SHIFT, // D
0x08|SHIFT, // E
0x09|SHIFT, // F
0x0a|SHIFT, // G
0x0b|SHIFT, // H
0x0c|SHIFT, // I
0x0d|SHIFT, // J
0x0e|SHIFT, // K
0x0f|SHIFT, // L
0x10|SHIFT, // M
0x11|SHIFT, // N
0x12|SHIFT, // O
0x13|SHIFT, // P
0x14|SHIFT, // Q
0x15|SHIFT, // R
0x16|SHIFT, // S
0x17|SHIFT, // T
0x18|SHIFT, // U
0x19|SHIFT, // V
0x1a|SHIFT, // W
0x1b|SHIFT, // X
0x1c|SHIFT, // Y
0x1d|SHIFT, // Z
0x30, // [
//0x89, // Yen(Backslash)
0xF0, // Yen(Backslash)
0x31, // ]
0x2e, // ^
0x87|SHIFT, // _
0x2f|SHIFT, // @
0x04, // a
0x05, // b
0x06, // c
0x07, // d
0x08, // e
0x09, // f
0x0a, // g
0x0b, // h
0x0c, // i
0x0d, // j
0x0e, // k
0x0f, // l
0x10, // m
0x11, // n
0x12, // o
0x13, // p
0x14, // q
0x15, // r
0x16, // s
0x17, // t
0x18, // u
0x19, // v
0x1a, // w
0x1b, // x
0x1c, // y
0x1d, // z
0x30|SHIFT, // {
0x89|SHIFT, // |
0x31|SHIFT, // }
0x2e|SHIFT, // ~
0x00 // DEL
};
CH9329_Keyboard.hのファイルを開き、作製したKeyboardLayout_jp_JPの配列をexternで下記のように追加する。
// Supported keyboard layouts
extern const uint8_t KeyboardLayout_de_DE[];
extern const uint8_t KeyboardLayout_en_US[];
extern const uint8_t KeyboardLayout_es_ES[];
extern const uint8_t KeyboardLayout_fr_FR[];
extern const uint8_t KeyboardLayout_it_IT[];
extern const uint8_t KeyboardLayout_pt_PT[];
extern const uint8_t KeyboardLayout_sv_SE[];
extern const uint8_t KeyboardLayout_da_DK[];
extern const uint8_t KeyboardLayout_jp_JP[];
スケッチでは、
#include "CH9329_Keyboard.h"
をインクルードした状態で、
セットアップの中で、
CH9329_Keyboard.begin(Serial, KeyboardLayout_jp_JP); //KeyboardLayout_jp_JP
と、レイアウトを指定するようにする。
CH9329_Keyboard.println("zxcvbnm,./");
この状態でほとんどのキー入力が、printやprintfで日本語キーボードにあわせて利用する事ができる。ボタンひとつで、メールアドレスを送る場合は大抵は問題はない。しかしフォルダーを指定するとか、メアドに"_"が入っている場合などこれだけだと対応できない。
利用できないのは、右側シフトのすぐ左の\、同じくShiftを押しながら右側シフトのすぐ左のキーを押した際の"_"、アンダーバー、それとバックスペースのすぐ左のキーで¥、それとそれをShiftを押しながらの”|"。¥はどちらかで入力できれば問題ないので結果、"\"、”_"、”|"の3つを入力できるようにしないといけない。
しごぶさんの用意してくれているwriteの部分をいじれでは多分できるが、まずはこの3つを力業でも入力できるようにする。
https://qiita.com/Surgo_elec/items/ce532fca881204c7dda1
を参考にして、
void sendKeyPacket(uint8_t ckey, uint8_t ukey) {
uint8_t sum = 0x10C + ckey + ukey;
uint8_t packet[14] = {0x57, 0xAB, 0x00, 0x02, 0x08, ckey, 0x00,
ukey, 0x00, 0x00, 0x00, 0x00, 0x00, sum};
Serial.write(packet, 14);
}
void press1key(uint8_t ckey, uint8_t ukey) {
sendKeyPacket(ckey, ukey);
//delay(1);
sendKeyPacket(0x00, 0x00);
}
2つの関数を用意する。
press1key(0x00, 135);//<- \ (yen) is output. it works.
press1key(0x02, 135);//<- _ is output. it works.
press1key(0x02, 137);//<- | is output. it works.
この3つ呼び出してやる。
\_|zxcvbnm,./
と出力できなかった3つが出力できるようになる。
CH9329_Keyboard.print("1234567890-^");
delay(1);
press1key(0x00, 135);//<- \ (yen) is output. it works.
CH9329_Keyboard.println("");
CH9329_Keyboard.println("qwertyuiop@[");
delay(1);
CH9329_Keyboard.println("asdfghjkl;:]");
delay(1);
CH9329_Keyboard.print("zxcvbnm,./");
press1key(0x00, 135);//<- \ (yen) is output. it works.
CH9329_Keyboard.println("");
delay(1);
CH9329_Keyboard.print("!\"#$%&'()=~");
press1key(0x02, 137);//<- | is output. it works.
CH9329_Keyboard.println("");
delay(1);
CH9329_Keyboard.println("QWERTYUIOP`{");
delay(1);
CH9329_Keyboard.println("ASDFGHJKL+*}");
delay(1);
CH9329_Keyboard.print("ZXCVBNM<>?");
press1key(0x02, 135);//<- _ is output. it works.
CH9329_Keyboard.println("");
というように呼び出すと、ノートパッドにキーボードで出力した結果
キーボードの左上から順に押し、右下まで行ったら、シフトを押しながら押した結果と同じ主力が出せるよになる。
あまり美しくはないが、必要な事はできるようになる。
ここで、delay(1);と間をあけているが、連続でいれつづけるとエラーをはくことがあるのであまり大量にCH9329に送りつけるのではなくて、おくりつける文字数を適当に切って、かつ時間をあけてあげる必要があるもよう。
アプリを立ち上げる場合、
CH9329_Keyboard.press(KEY_LEFT_GUI);
CH9329_Keyboard.release(KEY_LEFT_GUI);
delay(1);
CH9329_Keyboard.println("notepad");
KEY_LEFT_GUI(これはWindowsのボタン)を押して、リリース。windowsボタンを押した際の検索の欄に、notepadを入力して、エンターを押すので、これでノートパッドが立ち上がる。
ここまでできれば、コードの美しさは別として、一通りの事が実施できる。
コメント
コメントを投稿