Key3ビルドガイド(ファームウェアの書き込み)

Key3のファーム書き込みについての説明です。

f:id:ArtificialArts:20190515074953j:plain

Key3にはスイッチによって基板が異なりますが、ファームウェアは共通で使用できます。

現時点でのファームウェアは、下記のような仕様になっています。

  • 単体で使用している場合はマクロやマウス操作が実行可能
  • 複数台で使用している場合は、マクロやマウス操作は出来ず、通常のキーボードと同じような動作のみ

今後バージョンアップ予定です。

多くの自作キーボードで使用されているqmk firmwareはこのキーボードでは使用できず、Arduino IDEを使用して書き込みを行います。

環境構築(Arduino IDEのインストール)は多くの記事がありますのでここでは省略します。基本的には公式ページよりダウンロードし、表示に沿ってインストールするだけで大丈夫です。

単体キーボード

基本プログラム

基本プログラムは下記記事にある最新版のリンク先にアクセスしてください。

Key3(ファームウェア更新情報) - Artificial Arts

リンク先の右側に表示されている[OPEN IN WEB EDITOR]の隣のダウンロードボタンをクリックし、Sketchファイルをダウンロードします。

f:id:ArtificialArts:20190503215305j:plain

書き込み

書き込みにはいくつかの設定が必要になります。

ボードの選択

書き込みを行うArduinoの種類を選択します。Arduino IDE上部メニューバーの「ツール」内にある「ボード」で「Arduino Leonardo」を選択してください。

f:id:ArtificialArts:20190503220133j:plain

シリアルポートの選択

同じ「ツール」メニュー内の「シリアルポート」で書き込みを行うキーボードを選択します。何も接続していない状態ではグレーアウトして選択できない状態になっています。キーボードを接続していると「COMx」が選択可能な状態になります。(COMに続く番号は環境によって異なります)

1度も書き込みしていないPro Microでは「COMx (Arduino/Genuino Micro)」と表示されます。1度でも書き込みしていると「COMx (Arduino Leonardo)」と表示されます。

f:id:ArtificialArts:20190503220205j:plain

検証

Arduino IDE上部左側にあるチェックマークをクリックするとプログラムを検証(コンパイル)します。ここをクリックしてエラーが出た場合はプログラムの文法に間違いがあるなどの可能性があります。

マイコンボードに書き込み

Arduino IDE上部左側にある右矢印をクリックするとプログラムをコンパイルし、ボードに書き込みを行います。コンパイルでエラーがなく書き込みでエラーが発生るする場合は、ボード接続や選択しているボードの間違いなどが考えられます。

動作確認

初期状態では、上部3段がマウスの操作、下段左右がWindows10の仮想デスクトップの切り替え、真ん中はメモ帳を開いて「HelloWorld!」と表示するプログラムです。

動作はWindows10で使用することを想定しています。

{
/*|--------------|--------------|--------------|*/
   "LeftClick"   , "MiddleClick", "RightClick" ,
/*|--------------|--------------|--------------|*/
   "WheelDown"   , "MouseUp"    , "WheelUp"    ,
/*|--------------|--------------|--------------|*/
   "MouseLeft"   , "MouseDown"  , "MouseRight" ,
/*|--------------|--------------|--------------|*/
   "LeftDesktop" , "HelloWorld" , "RightDesktop",
/*|--------------|--------------|--------------|*/
};

キーの変更

キーに割り当てられている内容を変更したい場合、プログラムの最初の部分に書かれている表を編集します。

USB差込口が上側になるようにキーボードを置いたとき、それぞれのキーの初期状態は下記のとおりです。

最下段中央のキーは、HelloWorldとなっています。

{
/*|--------------|--------------|--------------|*/
   "LeftClick"   , "MiddleClick", "RightClick" ,
/*|--------------|--------------|--------------|*/
   "WheelDown"   , "MouseUp"    , "WheelUp"    ,
/*|--------------|--------------|--------------|*/
   "MouseLeft"   , "MouseDown"  , "MouseRight" ,
/*|--------------|--------------|--------------|*/
   "LeftDesktop" , "HelloWorld" , "RightDesktop",
/*|--------------|--------------|--------------|*/
};

例えばこのキーを「a」の1文字にしたい場合は下記のように変更します。

{
/*|--------------|--------------|--------------|*/
   "LeftClick"   , "MiddleClick", "RightClick" ,
/*|--------------|--------------|--------------|*/
   "WheelDown"   , "MouseUp"    , "WheelUp"    ,
/*|--------------|--------------|--------------|*/
   "MouseLeft"   , "MouseDown"  , "MouseRight" ,
/*|--------------|--------------|--------------|*/
   "LeftDesktop" , "a"          , "RightDesktop",
/*|--------------|--------------|--------------|*/
};

また、「abcdefg」と文字を入力したい場合も同様に変更します。

{
/*|--------------|--------------|--------------|*/
   "LeftClick"   , "MiddleClick", "RightClick" ,
/*|--------------|--------------|--------------|*/
   "WheelDown"   , "MouseUp"    , "WheelUp"    ,
/*|--------------|--------------|--------------|*/
   "MouseLeft"   , "MouseDown"  , "MouseRight" ,
/*|--------------|--------------|--------------|*/
   "LeftDesktop" , "abcdefg"    , "RightDesktop",
/*|--------------|--------------|--------------|*/
};

文字以外のキー入力をしたい場合には、下記表を参考に、指定されている文字を入力します。

例えばHelloWorldのキーをEnterキーにしたい場合は下記のように変更します。

{
/*|--------------|--------------|--------------|*/
   "LeftClick"   , "MiddleClick", "RightClick" ,
/*|--------------|--------------|--------------|*/
   "WheelDown"   , "MouseUp"    , "WheelUp"    ,
/*|--------------|--------------|--------------|*/
   "MouseLeft"   , "MouseDown"  , "MouseRight" ,
/*|--------------|--------------|--------------|*/
   "LeftDesktop" , "Enter"      , "RightDesktop",
/*|--------------|--------------|--------------|*/
};

文字の一覧は下記のとおりです。

指定文字 キーコード 備考
PageUp 0xD3
PageDown 0xD6
Home 0xD2
End 0xD5
Right 0xD7 方向キー
Left 0xD8 方向キー
Down 0xD9 方向キー
Up 0xDA 方向キー
Enter 0xB0
Esc 0xB1
Backspace 0xB2
Delete 0xD4
Tab 0xB3
PrtScr 0xCE PrintScreen
H/F 0x60 半角/全角
LCtrl 0x80
LShift 0x81
LAlt 0x82
LGui 0x83
RCtrl 0x84
RShift 0x85
RAlt 0x86
RGui 0x87
Caps 0xC1 CapsLock
F1 0xC2
F2 0xC3
F3 0xC4
F4 0xC5
F5 0xC6
F6 0xC7
F7 0xC8
F8 0xC9
F9 0xCA
F10 0xCB
F11 0xCC
F12 0xCD

それ以外、マクロを実行したい場合にはマクロ名を入れます。初期状態で入っているHelloWorldもマクロです。それ以外にも下記マクロが入っています。

マクロ名 内容
HelloWorld メモ帳を開いてHelloWorld!と入力
Cut Ctrl + x
Copy Ctrl + c
Paste Ctrl + v
Undo Ctrl + z
Redo Ctrl + y
Explorer Win + e
Desktop Win + d
LeftDesktop Ctrl + Win + ←
RightDesktop Ctrl + Win + →
Taskmanager Ctrl + Shift + Esc

マクロの作成

組み合わせ動作を行いたい場合はマクロを作成します。キー入力の組み合わせを作る場合、キーを押す動作(press)とキーを離す動作(release)を意識する必要があります。

まず、マクロを追加する場合には"//Macro"と書かれている以降のif文にelse if文を追加します。

    else if (KeyName == "Taskmanager")
    {
        if(keyPress == true)
        {
            Keyboard.press(0x80);
            Keyboard.press(0x81);
            Keyboard.press(0xB1);
            Keyboard.releaseAll();
        }
    }
    //ここに追加
    else if (KeyName == "MacroName")
    {
        if(keyPress == true)
        {
            //ここにマクロを記述
        }
    }
    else
    {
        return false;
    }

マクロ名は指定するときに使用するものなので、他と同じ名前は使用できません。

2つ目のif文はマクロが実行されるタイミングを指定しています。 if(keyPress == true)またはif(keyPress)となっている場合は、キーが押されたときに実行されます。
if(keyPress == false)またはif(!keyPress)となっている場合は 、キーを離したときに実行されます。

次にマクロの内容を"HelloWorld"を参考に解説します。キーの操作としては下記の通りです。

  1. 「ファイル名を指定して実行」を起動(Windowsキー + Rキー)
  2. 「メモ帳」を起動("notepad.exe"と文字列を入力してからEnterキー入力)
  3. "HelloWorld!"と文字列を入力

この操作をプログラムにすると下記のようになります。

else if(KeyName == "HelloWorld")
{
    if(keyPress == true)
    {
        // Windowsキーを押す
        Keyboard.press(0x83);
    
        //Rキーを押す
        Keyboard.press('r');
    
        //すべてのキーを離す
        Keyboard.releaseAll();
    
        //「ファイル名を指定して実行」の起動待ち(200ms)
        delay(200);
    
        //文字列入力
        Keyboard.print("notepad.exe");
    
        //文字の入力待ち(50ms)
        delay(50);
    
        //Enterキーを押す
        Keyboard.press(0xB0);
    
        //すべてのキーを離す
        Keyboard.releaseAll();
    
        //「メモ帳」の起動待ち(200ms)
        delay(200);
    
        //文字列入力
        Keyboard.print("HelloWorld!");
    {
}

文字列の入力では必要ありませんが、英数字やEnterなど、キーを押したあとにはキーを離す動作を行う必要があり、キーを離さなければ押しっぱなし状態になるので注意が必要です。

キーを押すときにはKeyboard.press(KeyCode);と入力します。KeyCodeにはキーコードや、rのように英数字や記号を直接指定できます。注意点として、Arduinoは英字キーボードとして認識されるため、記号は指定したものと異なるものが入力される場合があります。

キーを離す場合にはKeyboard.release(KeyCode)と入力します。KeyCodeにはKeyboard.press();で指定したものと同じものを入力します。 もしくは、Keyboard.releaseAll()と入力すれば、その時点で押しているすべてのキーを離します。

文字列の入力や、アプリケーションの立ち上げなどには時間がかかるので、意図した動きになるように待ち時間を挟む必要がある場合があります。その場合にはdelay(time);を使用します。

timeにはミリ秒単位で止める時間を数値で指定します。1秒間止めたければdelay(1000);、3秒であればdelay(3000);というように指定しますが、最大値は32767ですので、1回の関数で約32秒間止めることができます。

それ以上の時間止めたい場合は複数回使うか、forループの中に入れれば長時間止められますが、その間は何もできない(キー入力も受け付けない)ので、長時間止めることは推奨しません。

複数キーボード

Key3同士の通信

現時点では上記プログラムで相互通信が出来ないため、下記プログラムを使用します。

create.arduino.cc

ダウンロードや書き込みの準備は同じです。

キーの変更

キーに割り当てられている内容を変更したい場合も、単体プログラムの場合と同じです。

ただ今回は1文字だけもしくはEnterなどのキーのみしか指定することが出来ません。また、ダブルクォーテーションではなく、シングルクォーテーションで囲みます。

{
/*|--------------|--------------|--------------|*/
   '7'           , '8'          , '9'          ,
/*|--------------|--------------|--------------|*/
   '4'           , '5'          , '6'          ,
/*|--------------|--------------|--------------|*/
   '1'           , '2'          , '3'          ,
/*|--------------|--------------|--------------|*/
   '0'           , ','          , '.'          ,
/*|--------------|--------------|--------------|*/
};