9keyビルドログ

9keyを作りました

9key: qmk_firmware/keyboards/9key at master · qmk/qmk_firmware

デフォルトのキーマップは以下のようになっています。

/* LAYER 0
 * ,-----------------------.
 * |   1   |   2   |   3   |
 * |-------+-------+-------|
 * |   4   | 5/ENT |   6   | Dbl Tap 5 for Enter
 * |-------+-------+-------|
 * |  7/0  |   8   | 9/FN  | 7/0 = Dbl Tap 7 for 0  -  9/FN = Hold 9 for FN
 * `-----------------------'
 */

/* LAYER 1
 * ,-----------------------.
 * |  ESC  |   +   |   -   |
 * |-------+-------+-------|
 * |  BSPC |   *   |   /   |
 * |-------+-------+-------|
 * |  00   |   .   |       |
 * `-----------------------'
 */

5のダブルタップでEnter7のダブルタップで0が入力されます。 また、9キーと同時押しで、演算子やバックスペースも入力できます。

キーボードのダブルタップって今まで使ったことがなかったので新鮮でした。

回路図

f:id:yskoht:20180113172814p:plain
回路図

配線の交差をなくしたかったためROWとpro microの結線を変更しています。

組み立て

ユニバーサル基板に電動ドリルで穴を開けて無理やりキースイッチを取り付けています。

スイッチは千石電商でばら売りされているのを買ってきました。

ファームウェア

QMKのkeyboards/9key/config.hを変更して、ピンの順番とダイオードの方向(スキャンする方向)を修正。

diff --git a/keyboards/9key/config.h b/keyboards/9key/config.h
index eee8407..3e03474 100644
--- a/keyboards/9key/config.h
+++ b/keyboards/9key/config.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_COLS 3
 
 /* 9Key PCB default pin-out */
-#define MATRIX_ROW_PINS { D1, D0, D4 }
+#define MATRIX_ROW_PINS { D4, D0, D1 }
 #define MATRIX_COL_PINS { F4, F5, F6 }
 #define UNUSED_PINS
 
@@ -45,7 +45,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define ws2812_DDRREG   DDRD
 
 /* COL2ROW or ROW2COL */
-#define DIODE_DIRECTION COL2ROW
+#define DIODE_DIRECTION ROW2COL
 
 #define TAPPING_TERM 200

ビルド・書き込み

f:id:yskoht:20180429174714j:plain

書き込みのためにUSBaspを購入しました。

ビルド

$ make 9key:default

書き込み

$ sudo avrdude -p atmega32u4 -c usbasp -e -U flash:w:9key_default.hex

これで無事に動作しました。よかった。

参考

キーマップの変更

今現在、MiSTEL BAROCCO MD600を使っていてDELキーと矢印キーがないのが辛いので、キーマップを以下のように変更しました。

 ,-----------------------.
 |  HOME |  BSCP |  DEL  |
 |-------+-------+-------|
 |  END  |   ↑   |  ENT  |
 |-------+-------+-------|
 |   ←   |   ↓   |   →   |
 `-----------------------'

参考

ROW_PINS, COL_PINSについてのメモ

以下、QMKのピンの指定方法について自分用のメモです。

ピンはconfig.hで指定される。

#define MATRIX_ROW_PINS { D4, D0, D1 }
#define MATRIX_COL_PINS { F4, F5, F6 }

このD?F?はコントローラのピンを表していて、pro microの回路図を見ると基板のどのピンに繋がっているのかがわかる。

f:id:yskoht:20180113192530p:plain
https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/Pro_Micro_v13b.pdfより引用

D?F?quantum/config_common.hで定義されていて、 例えばD40x94

quantum/matrix.cを見てみると、 MATRIX_ROW_PINS, MATRIX_COL_PINSは それぞれrow_pins, col_pinsに入れられて、 init_rowsの中でピンの初期化をしている。

static void init_rows(void)
{
    for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
        uint8_t pin = row_pins[x];
        _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
        _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF); // HI
    }
}

ここで出てくる_SFR_IO8については以下に詳しく書かれている。

pinがD4のとき、以下の動作をしていることになる。

uint8_t pin = 0x94;  // #define D4 0x94
_SFR_IO8(9 + 1) &= ~_BV(4); // IN
_SFR_IO8(9 + 2) |=  _BV(4); // HI

一方、AVRのIOピンは<avr/io.h>で定義されていて、<avr/iom32u4.h>を見てみると以下のように記述されている。

#define DDRD _SFR_IO8(0x0A)
#define PORTD _SFR_IO8(0x0B)

つまり、DDRD &= ~_BV(4);でD4を入力にして、 PORTD |= _BV(4);でプルアップしている。 これなら入門書でよく見る記述なので分かりやすい。

参考