おかゆ++

IT業界の片隅で生き残るブログ

10.組み立て&完成【手配線で自作キーボードを作る講座】

f:id:okayu-moka:20190901155614p:plain

この記事は、【手配線で自作キーボードを作る講座】の第10回目です。 そのほかの記事はこちら↓

okayu-moka.hatenablog.com

フタ取り付け

完成へ向けてキーボードを組み立てていきます。

まずは筐体のフタをして、ネジ止めします。

配線の仕方が悪いと、フタが閉まらないこともあるかもしれません。 そのような場合、スペースに収まるように配線しなおすか、少し背のあるフタに作り直すなどの対処が必要です。

滑り止めを張る

滑り止め用のシリコンシールを貼っておきましょう。

張らなくても使えなくはないですが、3Dプリントした筐体は意外と滑ります。 キーボードの使用環境に合わせて張る・張らないを決めてください。 個人的には張っておいたほうが無難だと思います。

シリコンシールはAmazonで買えるほか、ホームセンター、100円ショップなどでも入手できます。

今回は100円ショップで購入したシリコンシールを貼りました。

f:id:okayu-moka:20190828175008j:plain f:id:okayu-moka:20190828175746j:plain

キーキャップ取り付け

満を持してキーキャップ取り付けです。

取り付け自体は難しくないですが、 力を入れて無理やり嵌めようとすると、まれにキーキャップ側の十字溝が割れてしまうことがあります。 あまり力を入れすぎないように注意してください。

f:id:okayu-moka:20190828180123j:plain

ホームポジションが分かりにくいとき

無刻印のキーキャップの場合、ホームポジション用の突起がないものがほとんどです。 慣れればそのままでも使うことはできますが、あったほうがいいという方は、ラインストーンシール(デコレーションシール)を張るのがおすすめです。 こちらもAmazonのほかに、100円ショップなどでも入手できます。

完成

最終動作確認して問題なければ、晴れて自作キーボードの完成です!

f:id:okayu-moka:20190830084841j:plain

ぜひ、自分オリジナルの自作キーボードを使い込んでください。 そして、不満点が出てきたら、どんどん改良していってください。

  • キー配置を変更してみる
  • キーキャップを取り換えてみる
  • キーキャップも自作してみる
  • 筐体を塗装してみる
  • 別の配列の自作キーボードを作る

まだまだ自作キーボードの道は始まったばかりです。

自分が「これだ!」と思うキーボードが完成するまで、試行錯誤しながら頑張ってください!

9.配線その2(ProMicro部分)【手配線で自作キーボードを作る講座】

f:id:okayu-moka:20190901155550p:plain

この記事は、【手配線で自作キーボードを作る講座】の第9回目です。 そのほかの記事はこちら↓

okayu-moka.hatenablog.com

3.5mm ミニジャックの固定

配線の前に、3.5mm ミニジャックを筐体に固定しておきます。

グルーガンで固定します。 あまりたくさんつけるとミニジャックの穴の中に入ってしまうので注意してください。

f:id:okayu-moka:20190825182935j:plain

ProMicroのモゲ対策

ProMicroのMicroUSB端子は耐久性が低いことで有名です。 強い力が加わると、基板から剥がれて壊れてしまうことがあります。(いわゆる "モゲMicro")

モゲ対策のために、ホットボンドで補強をします。 ホットボンドはそこまで接着力が強くはないので、あまりに強い力がかかるとやはり壊れてしまいますが、 何も対策しないよりは断然強度が上がります。

端子の穴にホットボンドが入らないよう、マスキングテープで保護してからホットボンドで補強します。

f:id:okayu-moka:20190825180406j:plain f:id:okayu-moka:20190825181311j:plain

完璧に対策したい場合は、エポキシ系接着剤で固定するとよいでしょう。 もしくは、マグネット式のケーブルを使って端子の抜き差しをしないようにするのも有効です。

配線の手順について

配線の手順ですが、2パターン考えられます。

  • ProMicroにケーブルをはんだ付けして、次にスイッチと配線する
  • スイッチに配線して、次にProMicroに配線する

簡単なのはProMicroから先に配線する方法だと思います。

またどちらの手順でも、電線はあらかじめカットしておいたほうが作業しやすいと思います。 最後に無駄な部分はカットするために少し電線が無駄になりますが、作業のしやすさを優先します。

ProMicroへのはんだ付け

ProMicroから配線を伸ばします。

前述のとおり長めにカットした同線の被膜を剥いで 細く捻じってから、 先に電線だけをはんだ付けしておきます。

f:id:okayu-moka:20190826180916j:plain f:id:okayu-moka:20190826181532j:plain

ProMicroに差し込んで、はんだ付けします。 作業しやすいようにアームなどで固定すると良いでしょう。

f:id:okayu-moka:20190826182904j:plain f:id:okayu-moka:20190826182958j:plain

あまりきれいにできてませんが、とりあえずはんだ付けできました。 この調子で、使用するピンすべてに電線を取り付けていきます。

f:id:okayu-moka:20190826183522j:plain f:id:okayu-moka:20190826183905j:plain

最後にはみ出た部分をニッパーで切り落として、はんだ付け完了です。

f:id:okayu-moka:20190826184406j:plain

キースイッチとProMicroの配線

以前に作成した回路図を見ながら、キースイッチとProMicroを配線していきます。

この時注意が必要なのが、回路図がキーボードを表から見た時の図になっていることです。

f:id:okayu-moka:20190901143050p:plain

この回路図を実際のキーボード上に重ねると、次のようになります。

f:id:okayu-moka:20190907181549j:plain

列方向は左から、A2、A1、A0、15、14、16、10となっています。 しかし実際に配線するときは裏面から作業するので、列方向の順番が見た目逆になります。

f:id:okayu-moka:20190907181659j:plain

このように、左から10、16、14、15、A0、A1、A2となるように配線します。

それでは実際に配線していきます。 電線をケースの隙間に這わせるようにしながら、各キースイッチの行と列にはんだ付けしていきます。

はんだ付けの際は、あらかじめ電線のほうに予備はんだをしておきます。 細かい作業になるので、テープやクリップなどで電線の位置を固定しながら作業するとやり易いでしょう。

f:id:okayu-moka:20190826190820j:plain f:id:okayu-moka:20190826191132j:plain

すべての電線を配線し終えたのが次の写真です。

f:id:okayu-moka:20190826195532j:plain

今回の例ではちょっと電線が長すぎました。 短くて届かない状況よりはマシですが、配線時に必要十分な長さにカットすればよかったです。

ProMicroの固定

配線が終わったら、ProMicroをグルーガンで固定します。

f:id:okayu-moka:20190826195533j:plain

これで片手分完成です! もう片手分、頑張りましょう。

動作確認

両手分の配線が完了したら、動作確認していきましょう。

f:id:okayu-moka:20190828174521j:plain

  • フタはちゃんと閉まりますか?
  • すべてのキーが正しく動作するか?

動作しない場合の確認点

  • 電線が干渉してフタが閉まらない
    • スペースを探して電線を這わせましょう。
  • 特定のキーのみ動かない
    • 動かないキーの配線はきちんとできていますか?
    • キースイッチ自体の品質は問題ないですか? テスターなどで確認してみましょう。
      • キースイッチ自体に問題があるなら取り替えましょう。
  • 特定の列/行のキーのみ動かない
    • 動かない列/行のProMicroへの配線はきちんとできていますか?
    • ProMicroのピンと、QMK Firmwareで指定したピンは一致していますか?
  • 右側のキーボードが反応しない
    • 右側のキーボードを直接つないだ時は動作しますか?
      • 右側だけつないだときは、左手用として動作します。
      • 問題なく動くなら、左右の接続が正しくできていないと思われます。
      • 右側単体でも動かないなら、まずは右側のどこに問題があるか調査しましょう。
    • VCC、GND、通信用ピンが正しく配線できていますか?
    • QMK Firmwareで指定した通信用ピンの配線はあっていますか?
    • Micro USBケーブル、オーディオケーブルを変えてみても発生しますか?

問題なく動作したら、あとはもう最後の仕上げだけです!

次の記事:

okayu-moka.hatenablog.com

8.QMK Firmwareの設定と書き込み【手配線で自作キーボードを作る講座】

f:id:okayu-moka:20190901155543p:plain

この記事は、【手配線で自作キーボードを作る講座】の第8回目です。 そのほかの記事はこちら

QMK Firmwareの入手

QMK Firmwareの本体はGitHubから取得できます。

github.com

また、ビルド環境の構築方法や書き込み手順などは、公式サイトおよびドキュメントに記載されています。 なにか困ったらここを確認するようにしてください。

qmk.fm

docs.qmk.fm

必要なソフトウェアのインストール

QMK Firmwareのアップデートなどによって色々と変更されることもあるため、ここではあまり詳細な手順は紹介しません。 基本的には公式ドキュメントの Getting Started を見て進めてください。

公式ドキュメントが英語で少々敷居が高いですが、日本語で解説している記事なども多くありますので、 随時調べながら作業していきましょう。

Window、MacLinuxでそれぞれ必要なソフトが異なってきます。 ご使用の環境に合わせてセットアップしてください。

QMK Firmware Getting Started

Windowsの場合の例

以下、2019/08/24 時点でのWindowsの場合の手順を記載します。 前述のとおり手順が変更されている可能性もあるため、基本的に公式ドキュメントを正として、以下は参考程度にしてください。

MSYS2をダウンロードします。環境に合わせて、32bit版か64bit版のどちらかを選んでください。 ダウンロード後、インストーラに従ってインストールします。

www.msys2.org

インストール完了後、MSYS2を起動して、以下のコマンドでGitをインストールします。

$ pacman -S git

Git を使って、QMK Firmware を取得します。

$ git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git

Cloneした中に util/qmk_install.sh というスクリプトがあるので、実行すると必要なソフトがインストールされます。 途中何度かインストール対象を選択する場面がありますが、おおよそ "All" や "Yes" を選択しておけば問題ないです。

$ git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
$ cd qmk_firmware
$ util/qmk_install.sh

インストールできたら、ビルドが正常にできるかテストしてみます。 以下のコマンドで試しにビルドしてみて、エラーが出なければOKです。

$ make ergo42/rev1:default

新しいキーボードの生成

QMK Firmwareは、色々な自作キーボード用の設定ファイルが大量に同梱されています。 しかし、今回作成しようとしている自作キーボードは完全なオリジナルなので、新しく設定ファイルを作成していく必要があります。

参考:QMK Firmware Building Your First Firmware

new_keyboard.shスクリプトで、自分用の新しいキーボードを作成することができます。

今回は、Ergo42 と同じ配列のキーボードなので、Ergo42 のものをベースにして作成します。 そういえば、今回作っているキーボードの名前を決めていませんでしたが、Ergo42 の Clone Keyboard ということで、Ergock としました。

new_keyboard.sh を実行すると、キーボード名などを聞かれるので、入力していきます。 Keyboard Type については、ProMicroを使う場合は avr のままでよいので、何も入力せずに Enter を入力してください。

$ util/new_keyboard.sh
Generating a new QMK keyboard directory

Keyboard Name: ergock
Keyboard Type [avr]:
Your Name [okayu]:

Copying base template files... done
Copying avr template files... done
Renaming keyboard files... done
Replacing %YEAR% with 2019... done
Replacing %KEYBOARD% with Ergock... done
Replacing %YOUR_NAME% with okayu... done

Created a new keyboard called Ergock.

To start working on things, cd into keyboards/Ergock,
or open the directory in your favourite text editor.

成功すると、 keyboards/ergock ディレクトリが作成され、中に設定ファイルのテンプレートがコピーされます。

$ cd keyboards/ergock
$ ls
config.h  ergock.c  ergock.h  info.json  keymaps  readme.md  rules.mk

各ファイルの説明

新しく作成したキーボード用の各ファイルの概要は以下の通りです。 <project_name> の部分は、 new_keyboard.sh で指定したキーボード名になります。

config.h          : ピン割当、USBデバイス設定、マトリックスの行列設定など。
<project_name>.c  : QMK Firmwareの機能の上書きなど。今回は使用しません。
<project_name>.h  : キーレイアウト設定。
info.json         : QMK API用の設定。今回は使用しません。
readme.md         : このキーボードの説明文。今回は使用しません。
rules.mk          : ハードウェアに関する設定、QMK Firmwareの機能のON/OFFなど。
keymaps           : キーマップ設定。
  └─default       : デフォルトキーマップ。
      ├─config.h  : config.hの設定を上書き設定する場合に使用します。今回は使用しません。
      ├─keymap.c  : 実際のキーマップ設定を記載します。
      └─readme.md : キーマップの説明文。今回は使用しません。

これらのファイルをテキストエディタで編集して、今回のキーボード用の設定を記載していきます。

ハードウェアの設定(rules.mk)

ハードウェアや、QMK Firmwareの機能を設定します。

まずブートローダーの設定を変更します。 ハードウェアとしてProMicroを使用しているので、ソースコード上のコメントに従って caterina に変更します。

# Bootloader selection
#   Teensy       halfkay
#   Pro Micro    caterina
#   Atmel DFU    atmel-dfu
#   LUFA DFU     lufa-dfu
#   QMK DFU      qmk-dfu
#   atmega32a    bootloadHID
BOOTLOADER = caterina

今回は左右分割キーボードを作成しているので、最終行に以下の設定を追加します。

SPLIT_KEYBOARD = yes

キーマトリックス、ピン設定(config.h)

キーマトリックス、ピンに関する設定をしていきます。

MATRIX_ROWS, MATRIX_COLS

キーマトリックスの行数、列数を指定します。

今回のキーボードは4x7分割キーボードです。 分割キーボードの場合、MATRIX_ROWS の値を2倍の値にする必要があります。今回は4×2で8を指定します。

#define MATRIX_ROWS 8 // 4*2=8
#define MATRIX_COLS 7

2倍にする理由はこちらを参照:Rows and columns of split using 2 pro micros : olkb

MATRIX_ROW_PINS, MATRIX_COL_PINS

キーマトリックスの行列に、ProMicroのどのピンを使用するかを設定します。

今回は以下のように設定しました。

#define MATRIX_ROW_PINS { D7, E6, B4, B5  }
//  Printed on ProMicro    6,  7,  8,  9
#define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6 }
//  Printed on ProMicro   A2, A1, A0, 15, 14, 16, 10

この時のピン指定はProMicroに印字されている番号ではなく、データシートに記載されているPort名で指定します。 少しわかりづらいので、ソース上にはコメントでProMicroの印字との対応を記載しておきました。

Port名はsparkfunのProMicroのページで、DOCUMENTS > Graphical Datasheet のPDFを参照してください。

Pro Micro - 5V/16MHz - DEV-12640 - SparkFun Electronics Pro Micro Graphical Datasheet

SOFT_SERIAL_PIN

分割キーボードの左右の通信を行うためのピンを指定します。 今回はデフォルトの D0 (ProMicroの印字では3)のままとします。

#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6

その他

その他にも、USBデバイスに関する設定などは、好みに合わせて変更するとよいでしょう。

#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0x0523
#define DEVICE_VER      0x0001
#define MANUFACTURER    okayu
#define PRODUCT         Ergock
#define DESCRIPTION     A splited keyboard for me

VENDOR_ID は通常は 0xFEED のままにしましょう。 PRODUCT_ID はほかの自作キーボードと被らない値にするべきですが、 このキーボード用ファームウェアをQMK Firmwareの本体に取り込んでもらわない場合(Pull Requestを送らない場合)は自由です。

キーレイアウトの設定(<project_name>.h)

#define LAYOUT の内容を設定します。

この設定は、2つのセクションから成っています。

/* 初期状態 */
#define LAYOUT( \
    k00, k01, k02, \
      k10,  k11   \
) \
{ \
    { k00, k01,   k02 }, \
    { k10, KC_NO, k11 }, \
}

上記は new_keyboard.sh で生成した直後の状態ですが、 ここで k00, k01~ となっている部分が前半のセクション、 { k00, k01, ~ となっている部分が後半のセクションです。

前半のセクションでは、キーボードの物理的なキーと同じ数だけの変数を指定します。ここはあくまで後半セクション用の引数になります。

後半のセクションでは、物理的なキーがキーマトリックスのどの位置に対応するかを設定します。この時に、前半で指定した変数を用います。

「習うより慣れろ」で、とりあえず今回の4x7キーボード用に作成してみます。

#define LAYOUT( \
    L00, L01, L02, L03, L04, L05, L06,    R00, R01, R02, R03, R04, R05, R06, \
    L10, L11, L12, L13, L14, L15, L16,    R10, R11, R12, R13, R14, R15, R16, \
    L20, L21, L22, L23, L24, L25, L26,    R20, R21, R22, R23, R24, R25, R26, \
    L30, L31, L32, L33, L34, L35, L36,    R30, R31, R32, R33, R34, R35, R36  \
) \
{ \
    { L00, L01, L02, L03, L04, L05, L06 }, \
    { L10, L11, L12, L13, L14, L15, L16 }, \
    { L20, L21, L22, L23, L24, L25, L26 }, \
    { L30, L31, L32, L33, L34, L35, L36 }, \
    { R00, R01, R02, R03, R04, R05, R06 }, \
    { R10, R11, R12, R13, R14, R15, R16 }, \
    { R20, R21, R22, R23, R24, R25, R26 }, \
    { R30, R31, R32, R33, R34, R35, R36 }  \
}

左右のキーがわかりやすいように、左手側は L00、右手側は R00 という命名規則で設定しました。

分割キーボードの場合、上の例のように左右のキーボードで行を分ける必要があります。 また、 MATRIX_ROWS の設定で行数を2倍の値で設定したのも、これが理由になります。

補足:キーマトリックスに空白を作りたいとき

今回作成しているキーボードでは、完全に格子状のキーボードのため、キーマトリックスがきれいに埋まります。 しかしレイアウトによっては、キーマトリックス上に「物理的なキーのない部分」が発生する場合があります。

たとえば、Helixキーボードは、 一番内側に1~2個のキーがあり、その上にはキーがありません。 このキーのない部分を表すには、 KC_NO キーコードを指定します。

詳細についてはQMK Firmwareの手配線ガイドに記載がありますので、参考にしてください。

QMK Firmware Quantum Hand-Wiring Guide

また、QMK Firmwareに入っているHelixキーボード用の設定ファイル keyboards/helix/rev2/rev2.h なども参考になります。

/* keyboards/helix/rev2/rev2.h から一部抜粋 */
#define LAYOUT( \
  L00, L01, L02, L03, L04, L05,           R00, R01, R02, R03, R04, R05, \
  L10, L11, L12, L13, L14, L15,           R10, R11, R12, R13, R14, R15, \
  L20, L21, L22, L23, L24, L25,           R20, R21, R22, R23, R24, R25, \
  L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35  \
  ) \
  { \
    { L00, L01, L02, L03, L04, L05, KC_NO }, \
    { L10, L11, L12, L13, L14, L15, KC_NO }, \
    { L20, L21, L22, L23, L24, L25, KC_NO }, \
    { L30, L31, L32, L33, L34, L35, L36 }, \
    { KC_NO, R00, R01, R02, R03, R04, R05 }, \
    { KC_NO, R10, R11, R12, R13, R14, R15 }, \
    { KC_NO, R20, R21, R22, R23, R24, R25 }, \
    { R36, R30, R31, R32, R33, R34, R35 }, \
  }

キーマップの設定(keymaps/default/keymap.c)

LAYOUT で設定した物理キーに対して、キーコード(押したときに入力される文字)を設定していきます。 また、ファンクションキー(レイヤー)の処理や、モードの切り替えなどについても、キーマップで行います。

今回は、一般的なQWERTY配列をベースとします。数字キーの列が存在しないため、Let's Splitなどと同じようにレイヤーの概念を導入します。

Baseレイヤー設定

キーマップの基本となるBaseレイヤーを作成して、キーコードを設定します。

キーマップ設定のメイン部分は、以下の部分です。

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* Base */
    /* ここにキーコードを書いていく */
  ),
};

<project_name>.h でも出てきた LAYOUT マクロで、実際のキーコードを割り当てていきます。

QMK Firmwareに用意されているキーコードは、以下の公式ドキュメントページで確認できます。

QMK Firmware keycodes

今回用にキーコードを設定しました。わかりやすくなるようにコメントも残していきます。

#define BASE  0
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  /* Base
   * ,------------------------------------------------.   ,------------------------------------------------.
   * | Tab  |   Q  |   W  |   E  |   R  |   T  | Reset|   | Reset|  Y   |   U  |   I  |   O  |   P  | Bksp |
   * |------+------+------+------+------+------+------|   |------|------+------+------+------+------+------|
   * | LCTL |   A  |   S  |   D  |   F  |   G  |  (   |   |  )   |  H   |   J  |   K  |   L  |   ;  |Enter |
   * |------+------+------+------+------+------+------|   |------+------+------+------+------+------+------|
   * |LShift|   Z  |   X  |   C  |   V  |   B  |  [   |   |  ]   |  N   |   M  |   ,  |   .  |   /  |  '   |
   * |------+------+------+------+------+------+------+   |------+------+------+------+------+------+------|
   * | LGUI | Alt  |LCTRL | LGUI | Lower| Space| ESC  |   | C-Spc| Space| Raise| Left | Down |  Up  |Right |
   * `------------------------------------------------'   `------------------------------------------------'
   */
  [BASE] = LAYOUT(
    KC_TAB , KC_Q   , KC_W   , KC_E   , KC_R   , KC_T   , RESET  ,     RESET  , KC_Y   , KC_U   , KC_I   , KC_O   , KC_P   , KC_BSPC, \
    KC_LCTL, KC_A   , KC_S   , KC_D   , KC_F   , KC_G   , KC_LPRN,     KC_RPRN, KC_H   , KC_J   , KC_K   , KC_L   , KC_SCLN, KC_ENT , \
    KC_LSFT, KC_Z   , KC_X   , KC_C   , KC_V   , KC_B   , KC_LBRC,     KC_RBRC, KC_N   , KC_M   , KC_COMM, KC_DOT , KC_SLSH, KC_QUOT, \
    KC_LGUI, KC_LALT, KC_LCTL, KC_LGUI, XXXXXXX, KC_SPC , KC_ESC ,     LCTL(KC_SPC), KC_SPC , XXXXXXX, KC_LEFT, KC_DOWN, KC_UP  , KC_RGHT  \
  ),
};

まだ Raise/Lowerレイヤーを作っていないので、それぞれのレイヤー用のキーは XXXXXXX にしています。 これは、押しても何も反応しないキーという意味です。

Raise/Lowerレイヤー設定

Let's Split等のように、Lower キーや Raise キーを押しているときのキーマップを設定します。

Baseレイヤーと同じように、キーマップを作製します。

レイヤー適用中もBaseレイヤーと同じキーでよい場合は、 キーコード KC_TRNS または _______ を指定します。

#define BASE  0
#define LOWER 1
#define RAISE 2 
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

  ...
  
  /* Lower
   * ,------------------------------------------------.   ,------------------------------------------------.
   * |  ~   |  !   |  @   |  #   |  $   |  %   |      |   |      |  ^   |  &   |  *   |  (   |  )   |      |
   * |------+------+------+------+------+------+------|   |------|------+------+------+------+------+------|
   * |      |      |      |      | Del  | End  |PgDown|   |      |  _   |  +   |  {   |  }   |  |   |     |
   * |------+------+------+------+------+------+------|   |------+------+------+------+------+------+------|
   * | F1   | F2   | F3   | F4   | F5   | F6   |      |   |      |  F7  | F8   | F9   | F10  | F11  | F12  |
   * |------+------+------+------+------+------+------+   |------+------+------+------+------+------+------|
   * |      |      |      |      |      |      |      |   |      |      |      |      |      |      |      |
   * `------------------------------------------------'   `------------------------------------------------'
   */
  [LOWER] = LAYOUT(
    KC_TILD, KC_EXLM, KC_AT  , KC_HASH, KC_DLR , KC_PERC, _______,     _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
    _______, _______, _______, KC_DEL , KC_END,  KC_PGDN, _______,     _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, \
    KC_F1  , KC_F2  , KC_F3  , KC_F4  , KC_F5  , KC_F6  , _______,     _______, KC_F7  , KC_F8  , KC_F9  , KC_F10 , KC_F11 , KC_F12 , \
    _______, _______, _______, _______, _______, _______, _______,     _______, _______, _______, _______, _______, _______, _______  \
  ),
  /* Upper
   * ,------------------------------------------------.   ,------------------------------------------------.
   * |  `   |  1   |  2   |  3   |  4   |  5   |      |   |      |  6   |  7   |  8   |  9   |  0   |      |
   * |------+------+------+------+------+------+------|   |------|------+------+------+------+------+------|
   * |      |      |      |Insert| Home | PgUp |      |   |      |  -   |  =   |  [   |  ]   |  \   |      |
   * |------+------+------+------+------+------+------|   |------+------+------+------+------+------+------|
   * |      |PtScr |ScLock| Pause|      |      |      |   |      |      |      |      |      |      |      |
   * |------+------+------+------+------+------+------+   |------+------+------+------+------+------+------|
   * |      |      |      |      |      |      |      |   |      |      |      |      |      |      |      |
   * `------------------------------------------------'   `------------------------------------------------'
   */
  [RAISE] = LAYOUT( \
    KC_GRV,  KC_1   , KC_2   , KC_3   , KC_4   , KC_5   , _______,     _______, KC_6   , KC_7   , KC_8   , KC_9   , KC_0   , _______, \
    _______, _______, _______, KC_INS , KC_HOME, KC_PGUP, _______,     _______, KC_MINS, KC_EQL , KC_LBRC, KC_RBRC, KC_BSLS, _______, \
    _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, _______,     _______, _______, _______, _______, _______, _______, _______, \
    _______, _______, _______, _______, _______, _______, _______,     _______, _______, _______, _______, _______, _______, _______  \
  ),

LowerレイヤーとRaiseレイヤーを作りましたが、 BaseレイヤーのLowerキーとRaiseキーに何も割り当てられてないので、動作しません。

MO(layer) を使用して、LowerキーやRaiseキーを押下している間のみ、それぞれのレイヤーが適用されるように修正します。 先ほど仮に XXXXXXX としていたところを MO(LOWER) MO(RAISE) に変更してください。

  [BASE] = LAYOUT(
    KC_TAB , KC_Q   , KC_W   , KC_E   , KC_R   , KC_T   , RESET  ,     RESET  , KC_Y   , KC_U   , KC_I   , KC_O   , KC_P   , KC_BSPC, \
    KC_LCTL, KC_A   , KC_S   , KC_D   , KC_F   , KC_G   , KC_LPRN,     KC_RPRN, KC_H   , KC_J   , KC_K   , KC_L   , KC_SCLN, KC_ENT , \
    KC_LSFT, KC_Z   , KC_X   , KC_C   , KC_V   , KC_B   , KC_LBRC,     KC_RBRC, KC_N   , KC_M   , KC_COMM, KC_DOT , KC_SLSH, KC_QUOT, \
    KC_LGUI, KC_LALT, KC_LCTL, KC_LGUI, MO(LOWER), KC_SPC , KC_ESC ,     LCTL(KC_SPC), KC_SPC , MO(RAISE), KC_LEFT, KC_DOWN, KC_UP  , KC_RGHT  \
  ),

これでLowerキーとRaiseキーが動作するようになりました。 ひとまずこれでファームウェアの設定は完了です。

ビルドと書き込み

ファームウェアの設定ができたら、まずはビルドします。

$ make ergock:default

エラーが出た場合は、メッセージに従って修正してください。

ビルドに成功したら、書き込み先のProMicroをPCに接続して、 以下のコマンドで書き込みます。

$ make ergock:default:avrdude

コマンドを実行してしばらくすると Detecting USB port, reset your controller now. と表示され、 avrdude が書き込み対象のデバイスを探し始めます。 ここでProMicroをリセットすると、 avrdude がProMicroを認識し、処理が再開されます。

ProMicroの RST ピンと GND ピンを短絡させることでリセットできます。ピンセットなどで一瞬だけ短絡させてください。 (すでにQMK Firmware書き込み済みのProMicroの場合は、 キーコードに RESET を設定したキーを押下したのでもOKです。)

書き込みが正常に終われば、以下のようなメッセージが表示されているはずです。

avrdude.exe: verifying ...
avrdude.exe: 24448 bytes of flash verified

avrdude.exe done.  Thank you.

これでファームウェアの準備が整いました。 次は、キースイッチとProMicroを配線していきます。

次の記事:

okayu-moka.hatenablog.com

7.配線その1(キースイッチ部分)【手配線で自作キーボードを作る講座】

f:id:okayu-moka:20190901155232p:plain

この記事は、【手配線で自作キーボードを作る講座】の第7回目です。 そのほかの記事はこちら↓

okayu-moka.hatenablog.com

キーマトリックスについて

自作キーボードのファームウェアとしてよく採用される QMK Firmware - An open source firmware for AVR and ARM based keyboards は、キーマトリックスをスキャンして入力を検知します。

キーマトリックスは、以下のような回路のことを言います。

f:id:okayu-moka:20190901143050p:plain

このように、格子状にスイッチを配線することで、どのスイッチが押されたかを検出することができます。

また、キーの同時押しに対応させるため、キースイッチと同じ数だけのダイオードが必要になります。

キーマトリックスの仕組みや、なぜダイオードが必要なのかについては、 ゆかりさん(id:eucalyn)の記事が非常に参考になります。 一度は目を通しておくと、理解が深まって良いでしょう。

eucalyn.hatenadiary.jp

ほかには、英語ですがQMK Firmwareの手配線ガイドも参考になります。

docs.qmk.fm

どうやって配線したらいいのかわからない!! という方は、 この記事の最後に配線完了後の写真がありますので、そちらを参考にしてみてください。 回路図で考えるよりも、まだわかりやすいと思います。

配線の例

では、4x7キーボードを実際に配線していきます。

先に回路図を書いておく

回路図は、簡単なものでいいので作成しておくと良いでしょう。 手書きでもなんでもよいので、作業するときに参考にするものがあったほうが良いです。

今回は以下の回路図を BSch3Vで作成しました。これを見ながら配線していきます。

f:id:okayu-moka:20190901143050p:plain

ただ、この回路図をちゃんと書くためには、QMK Firmwareの設定等も考慮する必要があります。 現時点ではまだそこまで考慮できてないので、どのピンに配線するかどうかについては未定のままで大丈夫です。

横方向の配線

まずは、横方向(行方向)の配線をしていきます。

横方向は、ダイオードをつなぐ必要があります。 ダイオードは電流の流れる向きが決まっているため、つける向きが逆だと正常に動かなくなってしまいます。 十分注意してください。

補足:
すべてのダイオードの向きがそろってさえいれば、QMK Firmwareの設定で向きを指定できます。 1つだけ逆を向いていたりなどしないようにだけ注意してください。
また、QMK Firmwareのデフォルトでは "COL2ROW" つまり列方向から行方向へ電流を流す設定になっています。 今回はCOL2ROWで動作するように設計しています。

f:id:okayu-moka:20190901152943j:plain

次の写真のように、ダイオードの足を90度曲げて、 キースイッチのピンとの接触面がなるべく広くなるようにすると、はんだ付けしやすいでしょう。

f:id:okayu-moka:20190825122402j:plain

はんだ付けの際、はんだこてが筐体に接触しないように注意します。PLAは70度程度で溶け始めるので、はんだこてであっさり溶けます。

また、はんだ付けの際は、先にピン側にはんだを多めに盛り、そのはんだで利用してダイオードを付けるのがやり易いと思います。

f:id:okayu-moka:20190825123223j:plain f:id:okayu-moka:20190825123300j:plain

この時、なるべく配線位置が低くなるよう(スイッチに近くなるよう)にしてください。

この後に縦方向の配線をしますが、縦方向の配線に使うスズメッキ線は絶縁被膜などがついていません。 縦横の配線が接触しないように、なるべく低い位置で配線するようにしてください。

f:id:okayu-moka:20190825124650j:plain f:id:okayu-moka:20190825140111j:plain

ダイオード同士のはんだ付けは、線同士なので多少難しいですが、接触面が大きくなるように気を付けながらはんだ付けするとうまくいくでしょう。 やりづらいときは、マスキングテープやカプトンテープなどで補助してやると、作業しやすくなります。

横方向の配線が一通り終わると、こんな感じです。

f:id:okayu-moka:20190825142302j:plain

縦方向の配線

縦方向はダイオードが必要ありませんので、スズメッキ線で配線します。

あらかじめ必要な長さに切って作業しましょう。

f:id:okayu-moka:20190825142904j:plain

すでに述べたように、すでに配線した横方向の配線(ダイオード)と接触しないように注意しながらはんだ付けしていきます。

ピンセットなどを使い、やけどに注意しながら作業してください。

f:id:okayu-moka:20190825143956j:plain

縦方向が終わったら、片手分完了です!

f:id:okayu-moka:20190825145731j:plain

もう片手分、頑張りましょう。

スイッチ部分の配線完了後

両手分のはんだ付けをして、キースイッチ部分の配線が完了した状態となりました。

f:id:okayu-moka:20190825155701j:plain

次回は、ProMicroとつなげていく……前に、ちょっとはんだ付けは小休憩して、 QMK Firmwareの準備をしていきます。

次の記事:

okayu-moka.hatenablog.com

6.キースイッチ取り付け【手配線で自作キーボードを作る講座】

f:id:okayu-moka:20190820192710p:plain

この記事は、【手配線で自作キーボードを作る講座】の第6回目です。

そのほかの記事はこちら↓

okayu-moka.hatenablog.com

キースイッチ取り付け

筐体のプリントアウトが完了したら、キースイッチがきちんとはまるか確認しましょう。

スイッチ用の穴が小さすぎて入らない場合

多くの場合、穴が小さすぎて入らないキーがあると思います。

14mmちょうどで設計した場合、3Dプリンターの特性にもよりますが、素材の収縮などにより14mmよりも小さくなり、キースイッチが入らないことがあります。 この場合、ヤスリやカッターで穴を広げ、スイッチが入るよう調整します。

調整しても入らない場合、モデルを修正することを検討しましょう。 14mmよりも少し大きい穴に修正して、プリントアウトしなおしてください。

スイッチ用の穴が大きすぎる場合

あまりにも穴が大きく、スイッチがぐらついたり、意図した位置に配置できない場合は、モデルを修正しましょう。 スイッチが抜けやすい程度であれば、グルーガンで固定する方法もあります。

※ただし、後述のキー配列の確認を済ませてから固定するようにしましょう。

キー配列の使用感を確認する

キースイッチを取り付けたあと、キーキャップも取り付けて、試し打ちしてみましょう。

狙った通りの使用感になっているかを確認して、問題があればモデルを修正しましょう。

キー配列、キースイッチの打鍵感、キーキャップの形状は、自作キーボードの使い勝手に大きく影響する要素です。 しっかりと確認して、納得のいくものにしていきましょう。

そのほかの確認事項

はんだ付けを始めてからは変更が難しくなるため、今のうちに以下の点を確認しておきましょう。

  • 筐体の反りは許容範囲か?
  • ProMicroをきちんと取り付けられるか?
  • 3.5mm ジャックは取り付けられるか?
  • すべての部品を取り付けた状態で、筐体のフタをすることができるか?
    • 部品が干渉して、フタが閉まらない場合があります。
  • フタをネジ止めすることはできるか?
    • ネジ穴が小さい場合は、ドリルなどで少し穴を広げてやりましょう。無理にネジ止めしようとすると、筐体が割れる可能性があります。
  • 配線するスペースは十分にあるか?

今回は3Dプリントの影響で、3.5mm ジャックを取り付ける穴が小さかったため、やすりで穴を拡張しました。

f:id:okayu-moka:20190820143010j:plain

実際に取り付けたところ

取付中。今回もやはり穴が小さく、やすりとカッターで削りながらの作業でした。

f:id:okayu-moka:20190820185127j:plain

全部とりつけました。次はいよいよ配線です!

f:id:okayu-moka:20190820190020j:plain f:id:okayu-moka:20190820190042j:plain f:id:okayu-moka:20190820190759j:plain

次の記事:

okayu-moka.hatenablog.com

5.筐体のプリント【手配線で自作キーボードを作る講座】

f:id:okayu-moka:20190819214448p:plain

この記事は、【手配線で自作キーボードを作る講座】の第5回目です。 そのほかの記事はこちら↓

okayu-moka.hatenablog.com

3Dプリンターでプリントする

個人で所有できるような小型の3Dプリンターでも、自作キーボードの筐体程度であれば十分プリント可能です。

左右分割型の場合は片手分ずつプリントすれば良いでしょう。 一体型で3Dモデルが大きい場合、まずはモデルをある程度分割してプリントし、後から接着剤などで接着することになるでしょう。

3Dプリンターには FDM(熱溶解積層方式)や SLA(光造形方式)などの種類がありますが、一般的に安く手に入るのは FDM のプリンターでしょう。 FDMの3Dプリンターはコストパフォーマンスに優れ、造形物の強度も十分なので、自作キーボードの筐体にはもってこいです。

ただ、 FDM でプリントアウトした造形物には積層痕が残り、あまり滑らかな出力結果になりません。 筐体のような大きな造形物では問題になりませんが、キーキャップなど、細かさや滑らかさが重要な部品には、SLA のプリンターのほうが適しています。

プリントのコツ

フィラメントは、PLAフィラメントを選択するのが無難です。 キーボードのように平たい造形物の場合、ABSでは"反り"が大きすぎてきれいにプリントできません。 PLAの造形物は加工が大変ですが、ヤスリで削る程度であれば何とかなります。

Infill(内部埋め)は30%~50%くらいがおすすめです。 あまり内部を埋めすぎると、反りがひどくなったりするので注意が必要です。

プリント時の設定は、3Dプリンターの機種やスライサーソフトによっても大きく変わってきます。 あくまでも参考程度にしてください。

プラットフォーム(ベッド、ステージ)への接着が弱い場合は、個人的にはマスキングテープを張るのがおすすめです。 もちろん専用のプラットフォームシートや、定番の強化ガラス+ケープなどでもOKです。 マスキングテープは3Mの幅広のものを購入するとよいでしょう。

プラットフォームから造形物が剥がしづらいときは、ニトムズのテープはがしカッターがおすすめです。 スクレーパーなどよりも断然剥がしやすいです。

ニトムズ テープはがしカッター T087

ニトムズ テープはがしカッター T087

3Dプリンターでのプリントは結構慣れと経験が必要なので、試行錯誤を繰り返して頑張ってください。

3Dプリントサービスで発注する場合

価格の安さを求めるならナイロン素材、強度や実用性を高めるならMJF素材での出力になると思います。

3Dプリントサービスで発注する場合、避けたいのは 「発注後に設計ミスが見つかる」 パターンです。 これを避けるためには、3DCAD上で十分チェックするという手もありますが、 おすすめしたいのは個人所有の3Dプリンターでプロトタイプをプリントして確認するという手段です。 きちんとキースイッチがはまるか? 思った通りの形状か? など、実際にプリントしてみないと確認できないことは多々あります。 最終的に3Dプリントサービスに発注する場合でも、安い素材や個人の3Dプリンターでプロトタイピングすることをおすすめします。

実際のプリント結果

今回は緑色のPLAフィラメントでプリントしました。

f:id:okayu-moka:20190818211400j:plain

フィラメントはこれ↓です。

前述のとおり、3Dプリンターでのプリントは結構慣れと経験が必要です。 自分の3Dプリンターにあった設定を探して試行錯誤してみてください。

次の記事:

https://okayu-moka.hatenablog.com/entry/2019/09/08/160000okayu-moka.hatenablog.com

4.筐体の3Dモデル作成【手配線で自作キーボードを作る講座】

f:id:okayu-moka:20190818171153p:plain

この記事は、【手配線で自作キーボードを作る講座】の第4回目です。 そのほかの記事はこちら↓

okayu-moka.hatenablog.com

Fusion360のインストール

本講座では Autodesk 社の Fusion360 を使用します。 こちらは ¥60,480/年 の有料アプリケーションですが、趣味での工作(非商用利用)やスタートアップ企業であれば無償で利用できます。

詳しくは Autodesk 社の Web サイトを参照してください。 オンライン CAD/CAM 設計ソフト | 無償体験版とダウンロード | Fusion 360

上記のURLからインストーラをダウンロードし、インストールしてください。

Fusion360の入門について

自作キーボードのモデリング程度であれば、難しい機能は使わなくても、Fusion360の基本的な操作ができれば大丈夫です。

この講座では、Fusion360の使い方などについては特に触れません。別途、入門記事などで学習しておいてください。

入門には、以下のチュートリアルPDFがおすすめです。 このPDFを一通り体験すれば、ある程度操作できるようになります。

Fusion 360 チュートリアル

Fusion360の最初の設定

基本的にそのままで良いのですが、1点だけ変更しておいたほうがよい設定があります。

Fusion360の初期設定では平面部分がxz軸、高さ方向がy軸となっていますが、 3Dプリンターでは平面部分がxy軸、高さ方向がz軸であることが多いです。 そのままモデリングしていくと、3Dプリント前にモデルを回転させる必要が出てくるので、最初に変更しておいたほうが無難です。

画面右上のユーザー名をクリック>基本設定を選択して、設定画面を開きます。 「一般」の「既定のモデリング方向」をZ(上方向)に変更します。

f:id:okayu-moka:20190818171207p:plain

この状態でモデリングすれば、違和感なく3Dプリンターで使用できます。

3Dモデルを作るにあたって

最終的には自分の好きなようにモデリングすればOKですが、前提知識として以下のことは知っておきましょう。

  • キースイッチ取り付け用の穴は、一般的には14.0mmの正方形
  • キーピッチ(キーとキーの間隔)は一般的に19.0mmか19.5mm
    • したがって穴と穴の距離は5.0mmか5.5mm
  • ProMicroのサイズは個体差があるが、以下の通り
    • 幅18.5mm, 高さ34mm、厚み2mm
    • これは基盤部分の大きさ。実際にはmicroUSBの差込口などがあるため、もう少し大きい。
    • 定規やノギスで実寸を測ったほうが確実です。
  • PLA素材で3Dプリントする場合、筐体の厚みは2mm程度で大丈夫
    • ぶ厚いほうが重くなるので使用時に安定しますが、プリントアウト後に微調整するのが大変になるので注意。

モデリング

今回作成する、4x7左右分割キーボードの筐体をモデリングしていきます。 まずは右手用の筐体を作成して、左手用は右手用をコピーして作成します。

メイン部分の箱を作成

箱型を基本として、筐体のメインとなる部分を作っていきます。

今回は4x7の格子配列なので、サイズが簡単に割り出せます。 前述のとおり、キースイッチ取付穴は14mm、穴と穴の距離は5mmとします。 両端も同じく5mmの余裕を持たせるとすると、

  • 縦:(14*4) + (5*3) + 10 = 81mm
  • 横:(14*7) + (5*6) + 10 = 138mm

となります。

スケッチでこのサイズの長方形を作成します。 また、ProMicroを設置するための場所も必要なので、別途スケッチしてスペースを作ります。 スケッチできたら、「押し出し」ツールで押し出してベース部分を作ります。

f:id:okayu-moka:20190818205730p:plain

この状態で「シェル」機能を利用して、厚さ2mmになるようにくり抜きます。

f:id:okayu-moka:20190818205735p:plain

くり抜いて箱状になりました。

キースイッチ取付の穴をあける

次に、キースイッチ用の穴をあけていきます。箱の端から5mmの位置から、14mm × 14mmの正方形をスケッチします。 その後、矩形状パターンを利用して、ピッチが5mmになるように等間隔で配置します。

f:id:okayu-moka:20190818205746p:plain f:id:okayu-moka:20190818205743p:plain

押し出しツールで穴をあけます。

f:id:okayu-moka:20190818205754p:plain

キーボードっぽくなってきました。

少し穴を調整します。 多くのキースイッチには、穴から抜けにくくなるようにツメがついています。このツメは厚み1.4mmの板に嵌めることを想定しています。 今回の筐体は厚みが2mmなので、このツメが引っかかりません。ツメが引っかかるように、ツメの部分だけ1.4mm未満になるように削ります。

f:id:okayu-moka:20190818205800p:plain

以降もスケッチと押し出しツールを使って筐体を作っていきます。

ProMicro取付場所を作る

ProMicroの取付場所と、MicroUSB端子用の穴を作ります。

ProMicroの取付方法はいろいろ考えられますが、私は下のような形状にしています。

f:id:okayu-moka:20190818205807p:plain f:id:okayu-moka:20190818205814p:plain

穴の左右に固定用の出っ張りを作り、反対側の端も同じ高さになるように出っ張りを作っておきます。 穴側の出っ張りに差し込んだ後、グルーガンで固定します。

3.5mmジャック用の穴をあける

3.5mmジャックの部品に合わせて穴をあけます。

今回は5mmの穴をあけ、高さ調整用に少し出っ張りも作りました。

f:id:okayu-moka:20190818205822p:plain

フタ固定用のねじ穴作成

フタを固定するためのねじ穴を作成します。

スケッチと押し出しツールで、円柱とねじ穴を作成します。また、補強のために円柱には支えを追加します。

f:id:okayu-moka:20190818205828p:plain

ねじ穴の位置は筐体の位置に左右されますが、なるべく外側が良いでしょう。 場合によっては4隅+中央など、強度を考慮した位置にねじ穴を作ると良いでしょう。

フィレットツールで角を丸める

ある程度形になったら、フィレットツールで角を丸めておくと、見た目が整って良いでしょう。

f:id:okayu-moka:20190818205838p:plain

フタの作成

メイン側が完成したら、フタを作っていきます。

メイン筐体の穴をふさぐように、フタのスケッチをしていきます。

f:id:okayu-moka:20190818205847p:plain

フタがずれないように、高さ1mm程度のフチを作っておきます。

f:id:okayu-moka:20190818205855p:plain

ねじ穴を作成していきます。 メイン筐体のねじ穴との距離が0mmになるように、高さを計算して円柱を作成します。少し大きき目に作成したほうが良いでしょう。 今回はかなり大きめに作り、面取りツールを使って丸めました。

f:id:okayu-moka:20190818205903p:plain

底面側から、ねじを通すための穴を円柱を貫通するようにしてあけます。 また、ねじの頭が隠れるように、深さ2mm程度の穴をあけます。この穴は円柱を貫通しないようにします。

f:id:okayu-moka:20190818205912p:plain

これでフタは完成です。

f:id:okayu-moka:20190818205923p:plain

左手用筐体をミラーで作成する

基本フィーチャの「ミラー」ツールを使って、左手用の筐体を作成します。

下の画像のように、右手側のボディをすべて選択し、ミラーツールで左右反転したものを作成します。

f:id:okayu-moka:20190818205942p:plain

フタもおなじようにミラーを作成すれば、左手用の筐体も完成です。

完成後の筐体

完成した筐体の全体像です。

f:id:okayu-moka:20190818205929p:plain

今回はこれで完成ですが、実際には何度も微調整を繰り返しながら作成することになるでしょう。 3DCAD上ではうまく作れていても、実際に3Dプリンターで印刷するとうまく印刷できないこともあります。 試行錯誤しながら、オリジナルの筐体を作り上げてください。

次の記事:

okayu-moka.hatenablog.com