CH9329で日本語キーボード109で正しく表示する方法

 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を入力して、エンターを押すので、これでノートパッドが立ち上がる。


ここまでできれば、コードの美しさは別として、一通りの事が実施できる。






コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

Attiny85 FuseRest