キーボードを自作してます(2)

前回の不満点を改善する試作2号を検討します。

配列の変更

親指キーを1つにするというのは前回書きましたが、さらに外側のキーを1つ減らし、変形の6×4の配列にすることにしました。これは Let’s Split というキーボードと同じキーの数になります。違いは最下段が1キー分、親指側にずれているということです。これはなかなか良い配列と思いました。

検討中

LEDの変更

LEDはSMDタイプからスルーホールタイプに変更することにしました。 モノが届く前に、この形状だと逆には刺さらないのではないかという勘違をし、この時点でリバーシブル基板を諦めPCBの設計を始めてしまいました。ですが 結果的には良かったと思います。

問題なかった

PCB設計

試作1号の不満としてはI/Oエキスパンダ MCP23017 の書き込みがAポートとBポートの両方必要だったということがあります。 対策として、LEDの行選択とマトリックスキースキャンの行選択を同じピンで行うようにしてBポートだけで済むように考えました。

試作1号はLEDの行はアクティブハイでキースキャンの行はアクティブローでした。これをキースキャンもアクティブハイにするようにして論理を合わせることにします。

入力側がプルアップだったものをプルダウンにする必要があり、そのためには外付けの抵抗が必要になってしまいますので追加します。またダイオードも合わせて逆にします。(前回のように間違えないように…)

配線を簡略化するためにLED用のソースドライバからの出力をそのままキースイッチに繋げています。 スイッチを押下するとプルダウン抵抗と入力ピンで若干電流の流出がありますが、ドライブ能力は1chあたり500mAもあるのでLEDの点灯には影響無いかなと考えています。 実際省略できる配線も大した量でも無いのですが、そのうち機能を集約したコア基板を作る予定なのでここで実験したいと思いました。

また、背面にバックライトLEDを配置したかったので、マトリックスの5行目として追加しています。

左側
右側

シルク

リバーシブル基板を諦めたことで、デザインにも余裕が出たので、思い切ってシルクで遊ぶことにしました。

シルクとはPCBに部品番号や部品の位置などを入れるシルク印刷のことですが、その用途を完全に無視してイラストを入れてしまおうと考えました。

そのために元になるストーリーを考え、バンド・デシネ風のイラストを遊舎工房専属デザイナーに描いてもらいました。これをKiCadに取り込み、PCBの裏面全体に配置します。 これが実際のところなかなか大変でした。データがとても大きくなってしまい、KiCadの動作も緩慢になり、3Dのプレビューでうまく表示されないなどトラブルがありました。

ぶっ壊れた様子

PCB発注の際にデータがアップロード出来なかったり、発注後にもデータがエラーになるということで作り直したり色々苦労しました。 データサイズがなるべく小さくなるように、ゴミを取ったりするなどの対策をしてなんとかなりました。

おすすめしません

ケース作り

今まで3DCADは Designspark Mechanical を使用していましたが、今回から Fusion 360 を使っています。パラメトリックなCADなのでうまく使いこなせれば設計が楽になるのでは無いかと思っていますが、まだ慣れていないので難しいです。

イメージCGです。MODO を使っています。

こんなTRRSケーブル売ってないですかねぇ
ソリッドもかっこいい

QMKへの対応

QMKはオープンソースのキーボード用ファームウェアで、 Planck など様々な自作系キーボードが対応しています。

Quantum Mechanical Keyboard Firmware

これに対応できれば、キーマップの共有も容易になるのでは無いかと思いました。

手順

まずは、下記ページの説明に従います。

Porting your keyboard to QMK

簡単に説明すると、下記のスクリプトでキーボードのプロジェクトを作成します。

 $ util/new_project.sh <keyboard>

あとは、 /keyboards/<keyboard>/config.h の

/* key matrix size */
#define MATRIX_ROWS 2
#define MATRIX_COLS 3
#define MATRIX_ROW_PINS { D0, D5 }
#define MATRIX_COL_PINS { F1, F0, B0 }
#define DIODE_DIRECTION COL2ROW

あたりを、自分のキーボードに合わせて変更し、

/keyboards/<keyboard>/<keyboard>.h の

#define KEYMAP( \
    k00, k01, k02, \
      k10,  k11   \
) \
{ \
    { k00, k01,   k02 }, \
    { k10, KC_NO, k11 }, \
}

と、
/keyboards/<keyboard>/keymaps/default/keymap.c の

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = KEYMAP( /* Base */
  KC_A,  KC_1,  KC_H, \
    KC_TAB,  KC_SPC   \
),
};

を修正してキーマップを完成させます。

KEYMAP() というマクロはkeymaps配列と実際のキー配列の違いを吸収するものですので、必要なければ使わなくてもかまいません。

このキーボードの5行目はLEDのみですので、以下のようにしています。

/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 12
#define MATRIX_COLS_SPLIT 6
#define MATRIX_ROW_PINS { E2, C7, C6, B6, B5 }
#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7 }
#define KEYMAP( \
    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
    k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \
) \
{ \
  { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
	{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
	{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
	{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \
  { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
}
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = KEYMAP( \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, 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_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
MO(_ADJUST),KC_ESC,KC_LALT, KC_LGUI, MO(_LOWER),KC_SPC, KC_SPC, MO(_RAISE),KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
...

通常はこれだけで使えるようになりますが、I2Cを使ったセパレート型はここからひと手間が必要です。

マトリックスキースキャンを行っているのは /quantum/matrix.c ですが、これを修正するわけにはいきませんので、プロジェクト直下にコピーしてきます。

必要に応じて下記ファイルも複製してきます。
/keyboards/ergodox/ez/i2cmaster.h
/keyboards/ergodox/ez/twimaster.c

追加したファイルをコンパイル対象にするのと、/quantum/matrix.c を無効にするために、プロジェクト直下の rules.mk に下記の行を追加します。

SRC = twimaster.c \
      matrix.c \
CUSTOM_MATRIX ?= yes

これで、matrix.cをカスタマイズ出来るようになりますので、I2Cを使ったスキャンを行うように修正していきます。

今回、I2Cのライブラリは ErgoDox EZ で使われているものを使用しましたが、MCP23017 と PCA9956 のライブラリは自前で用意しました。

開発中のコードはここにあります。まだ調整中で、とりあえず動くレベルです。参考になれば。

https://github.com/MakotoKurauchi/qmk_firmware/tree/feature/alter/keyboards/alter

試作2号の完成

そんなこんなで、一応形になりました。名前は Alter RGB と名付けました。

imgur への投稿
http://imgur.com/a/KIMb5

reddit への投稿
https://www.reddit.com/r/MechanicalKeyboards/comments/6jzolm/photos_i_made_the_original_split_keyboard_40/

投稿者:

ないん

30半ば過ぎで突然電子工作にはまりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です