keyboard slack

Slack用emoji入力キーボードを作ってみる

keyboard slack

カラーミーショッププロダクトチームでウェブアプリケーションエンジニアをしているyamotoです。

GMOペパボ株式会社では仕事道具としてキーボードにこだわりを持つ方が多く、Happy Hacking KeyboardやKinesisと言った市販の高級キーボードや、最近ブームとなっている自作キーボードを作成して業務を行っている人が多数在籍しています。私もHappy Hacking Keyboardや自作キーボードを使って業務を行なっています。

自作派パートナー一同のキーボードたち

これまではキットを購入して自作キーボードを作っていましたが、何台か作っていると自分でも設計からやってみたいという思いが出てきました。と言っても基板設計を1から行って、基板を発注するだけの知識がありませんでした。

今回はマイコンとキースイッチを配線して、QMK Firmware(以下QMKと呼ぶ)という自作キーボードで多く使われているファームウェアをビルドして最小限のキーボードとして動作できるものを作ってみたいと思います。

またせっかくなので今回はSlackでよく使うemojiをワンプッシュで入力できるようなマクロを設定して、日々のSlack emoji入力を便利にしてみたいと思います。

この記事の想定読者

  • 自作キーボードを組み立てた経験のある方
  • QMKのビルド環境を用意することができ、基本的なキーマップ編集などを行える方

QMKのビルドに関してはOSなどの環境の差によって手順が異なることがあります。この記事ではmacOS 10.15.2で実行することを想定しています。

またQMKのビルド環境は既に構築されている前提で書き進めています。

用意した部品

  • キースイッチ(Cherry MX互換のもの)
  • キーキャップ
  • ダイオード(小信号用シリコンダイオード、1N4148など)
  • Pro Micro(Arduino互換マイコンボード)
  • 無限の可能性
    • キースイッチ1つずつのプリント基板です。この基板にキースイッチとダイオードを半田付けして、適切な配線を行うと基板を設計しなくてもキーボードを作ることができます。
    • 無限の可能性の詳しいスペックや使い方 swanmatch/MxLEDBitPCB
  • 配線に使う電線
  • ブレッドボード

配線をする

配線をしていきます。まず初めにPro Microにピンヘッダを半田付けしてブレッドボードに載せておきます。ブレッドボードは半田を使わなくても配線をすることができるので試作に便利な道具です。

次に無限の可能性にダイオードを半田付けします。ダイオードは電流を一定の方向に流すための部品です。スイッチを先につけてしまうと半田付けが難しくなりますので先に行うことをお勧めします。 ダイオードの半田付けが終わったらキースイッチを半田付けします。

ダイオードとスイッチを無限の可能性に半田付けした様子

今回はキーマトリックス回路という二次元的にキースイッチを配置する回路を作成してキースイッチを接続します。キーマトリックス回路を作成するとマイコンの限られた入出力ピンを効率的に使うことができます。

今回は5キーのキーボードを作るのでキーマトリックス回路を使わずに直接Pro Microのピンに接続してもいいのですが、ダイオードが家にあったのでキーマトリックス回路を作ってキーを配線します。ダイオードを使わないキーマトリックス回路は誤動作の恐れがあるほか、同時入力の認識に制限があります。

マイコンとキー入力についてはルネサス エレクトロニクス株式会社のナレッジベースの記事が大変参考になりました。 FAQ 1006587 : マイコンでのキー・スイッチ入力

無限の可能性は行と列を簡単に接続することができます。今回は1行5列のキーボードを作るので、まず行を示すRow端子にジャンパー線を使って配線します。またRow端子の終端(今回は左端を使いました)からPro Microに接続するための配線を出しておきます。

次に列を配線します。今回は1行しかないためColomn端子はPro Microに接続するための配線を引き出して終了です。2行以上の場合はColomn端子をジャンパー線を使って配線したのち、Colomn端子の終端からPro Microに接続します。

無限の可能性に配線をした様子

早速Pro Microに接続したいところですが、Pro Microのどのピンを使用するかをまだ設定していません。次にQMKを設定してビルドします。

QMKで新しいキーボード設定を作成する

まずQMK FirmwareをCloneします。QMKには世界中の様々なキーボードキット用の設定が含まれていますが、今回は全く新しいキーボードを作成するのでキーボードの設定を新規作成します。

新しくキーボードを作成するための対話式シェルスクリプトがQMKには用意されています。公式ドキュメントに詳しい使い方が記載されています。 AVRマイコンを使用した場合のキーボード作成方法

キーボードの作成が完了するとkeyboardsというディレクトリに入力したキーボード名のディレクトリが作成され、その中にそのキーボードで使用するファイル一式が格納されています。シェルスクリプトを実行しただけでは設定は完了しないので、ソースコードを編集していきます。

主要な変更箇所を以下に記載します。

# rules.mk
BOOTLOADER = caterina

ブートローダーを指定します。Pro Microの場合はcaterinaとなります。

/* config.h */
/* key matrix size */
#define MATRIX_ROWS 1
#define MATRIX_COLS 5

キーボードの行数と列数を設定します。今回は1行5列のキーボードを作成するため、ROWSは1、COLSは5となります。

/* config.h */
/* Keyboard Matrix Assignments */
#define MATRIX_ROW_PINS { D1 }
#define MATRIX_COL_PINS { F4, F5, F6, F7, B1 }

使用するピンを設定します。ここではポート番号でピンを指定する必要があります。

Pro Microの表面に印刷されているピン番号を入力しないように注意してください。

Pro Microのポート番号はSparkfun社のドキュメントが参考になります。 Pro Micro - 5V/16MHz

上記リンクDOCUMENTSタブ内のGraphical Datasheetからピンとポート番号の対応に関するPDFを閲覧できます。

/* {設定したキーボード名}.h */
#define LAYOUT( \
    k00, k01, k02, k10,  k11   \
) \
{ \
    { k00, k01, k02, k10, k11 }, \
}

キーボードのレイアウトを設定します。

キーマップを設定する

次にキーマップを作成します。キーマップは {キーボード名}/keymaps/default というディレクトリに格納されています。

今回はemojiをSlackに便利に入力できるキーボードを作ります。Slackではemojiを :sushi: というような形式で入力します。なので普通のキーボードと違って1つのキー入力で複数の文字が入力されないといけません。

QMKには設定した文字列をキー入力として送信することができる便利な関数が用意されているので今回はこれを使います。

文字列入力以外にもキーコンビネーションを送信するのに利用できる関数なども用意されています。例えば Ctrl+Z をワンプッシュで入力したりといった設定も可能です。

まずkeymap.cファイルにあるcustom_keycodesというEnumを編集します。

/* keycap.c */
enum custom_keycodes {
  HYAKU,
  SUGOI,
  ARIGATOU,
  SASUGA,
  OSU
};

このEnumに追加されたメンバは任意のキーコードとして使用することができます

次にprocess_record_user関数を編集していきます。送信する文字列をcustom_keycodesに記述したメンバに対応するようにCase文で書いていきます。

/* keycap.c */
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case HYAKU:
      if (record->event.pressed) {
        SEND_STRING(":100:" SS_TAP(X_ENTER));
      }
      break;
    case ARIGATOU:
      if (record->event.pressed) {
        SEND_STRING(":arigatou-gozaimasu:" SS_TAP(X_ENTER));
      }
      break;
    case SUGOI:
      if (record->event.pressed) {
        SEND_STRING(":sugoi:" SS_TAP(X_ENTER));
      }
      break;
    case OSU:
      if (record->event.pressed) {
        SEND_STRING(":osu:" SS_TAP(X_ENTER));
      }
      break;
    case SASUGA:
      if (record->event.pressed) {
        SEND_STRING(":sasuga:" SS_TAP(X_ENTER));
      }
      break;
  }
  return true;
}

次にキーコードとキースイッチを対応させるためのキーマップを作成していきます。デフォルトのキーマップを編集します。

/* keycap.c */
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* Base */
    SASUGA, SUGOI, HYAKU, ARIGATOU, OSU    \
  ),
};

QMKの設定はこれで完了です。

QMKをビルドする

QMKの設定が完了したらビルドを行います。

qmk_firmwareディレクトリ直下で make {作成したキーボード名}:default を実行します。ビルドに成功すると {作成したキーボード名}_default.hex というファイルが作成されます。これがマイコンに書き込まれるファームウェアのバイナリデータです。

ビルドに成功したらPro MicroにQMKを書き込んでみます。書き込みを行う際は make {作成したキーボード名}:default:avrdude を実行します。

avrdude を付けてビルドすると、ビルド完了後にマイコンの検索が始まります。

Detecting USB port, reset your controller now... という表示がされたらPro Microをリセットします。今回はリセットスイッチをつけていないので、Pro Microのリセット端子とGND端子を直接ショートさせます。

avrdude done. Thank you. が表示されれば完了です。

Pro Microとスイッチを接続する

QMKで設定したピンと合うようにスイッチとPro Microを配線します。

スイッチとPro Microを配線する

入力してみる

早速入力してみます。

完成したキーボードでemojiを入力してみる

ワンプッシュでemojiが入力できるようになりました。便利ですね!!!!!

まとめ

かっこいい仕上がりとは程遠いですが、世界にひとつだけのキーボードを作ることができました。

emojiキーボード

自作キーボードキットの組み立て経験はあっても、1からキーボードの設定を書いたり、キーマトリックス回路の配線をすることはなかったので自作キーボードの知見をさらに深めることができました。今後はこれにきれいなケースをつけたりとキーボードらしいものを作っていけるようなMaker活動をしていきたいと思います。