見出し画像

XD75をBLE Micro Proで無線化する

いままで自作していた優先のキーボードを無線化するというものです。
こちらのBLE対応ファームウエアからXD75を無線化します。

XD75は格子配列の75キーボードですが、わが家では、真ん中の縦3列を外して実験用PCBになっています。

一方で、keyboradsの中にble_micro_testという一体型キーボード用のプログラムがあり、これをなんとかかんとかして、XD75に適合させようという記事です。


■物理側の準備
XD75裏側の不要な部品を外す(破壊)
縦横の配線と各キーのダイオードは残しておきます。

基盤はこれです

これをこう繋ぐ感じ。

画像1

緑はROWSの配線。青色と紫色はCOLS側の配線になります。

画像2

この配線をarduinoの対応するピンへつなぎます。

画像3

電源側は純正のコイン電池ホルダーをセットして電源とGNDピンへ。

これで物理側の準備は完了
ブレッドボードの意味あるのかと感じられているかと思いますが、ブレッドボードの接触が悪いため、結局はんだづけしましたというあれです。

試作だから、よいのです。

※2024/8/15追記
上記写真ではXD75側のICを剥がしたりしていましたが、その後に作り直したところ、そのままでも問題無く動作しました。

■プログラム側の準備
QMKfirmwareの中身を対応させていきます。
例によって簡単なことだとは思うのですが、右往左往して数時間掛かってしまいました。
というわけで、プログラム素人が引っかかったところを纏めていきます。
ベストな方法かは分かりませんが、とにかく動いています。

1、keymap.cにキーマップを書き込む
まずは、冒頭にレイヤーの記載。
わたしは、_QW、_FN、_TEの3つのレイヤーを使っていたので、こんな風に。いずれは、bluetoothコントロール用にもう一枚追加します。

enum layer_number {
_QW = 0,
_FN,
_TE,
};

つぎに日本語キーにしたいので、これを記載。

#define KEYMAP_JP_H
#define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi
#define JP_YEN KC_INT3 // yen, |
#define JP_CIRC KC_EQL // ^, ~
#define JP_AT KC_LBRC // @, `
#define JP_LBRC KC_RBRC // [, {
#define JP_COLN KC_QUOT // :, *
#define JP_RBRC KC_NUHS // ], }
#define JP_BSLS KC_INT1 // \, _
#define JP_MHEN KC_INT5 // muhenkan
#define JP_HENK KC_INT4 // henkan
#define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi
//Aliases for shifted symbols
#define JP_DQT LSFT(KC_2) // "
#define JP_AMPR LSFT(KC_6) // &
#define JP_QUOT LSFT(KC_7) // '
#define JP_LPRN LSFT(KC_8) // (
#define JP_RPRN LSFT(KC_9) // )
#define JP_EQL LSFT(KC_MINS) // =
#define JP_TILD LSFT(JP_CIRC) // ~
#define JP_PIPE LSFT(JP_YEN) // |
#define JP_GRV LSFT(JP_AT) // `
#define JP_LCBR LSFT(JP_LBRC) // {
#define JP_PLUS LSFT(KC_SCLN) // +
#define JP_ASTR LSFT(JP_COLN) // *
#define JP_RCBR LSFT(JP_RBRC) // }
#define JP_UNDS LSFT(JP_BSLS) // _
// These symbols are correspond to US101-layout.
#define JP_MINS KC_MINS // -
#define JP_SCLN KC_SCLN // ;
#define JP_COMM KC_COMM // ,
#define JP_DOT KC_DOT // .
#define JP_SLSH KC_SLSH // /
// shifted
#define JP_EXLM KC_EXLM // !
#define JP_HASH KC_HASH // #
#define JP_DLR KC_DLR // $
#define JP_PERC KC_PERC // %
#define JP_LT KC_LT // <
#define JP_GT KC_GT // >
#define JP_QUES KC_QUES // ?

キーマップを書き込み。お好きなように。レイヤー3枚分を記載。
両親指周りにCTRLやALT、SHIFTだけでなくエンターキーやスペースキーなども集約。便利かつ肩こり解消。
また、右手のところにテンキーレイヤーを入れておくと、コンパクトなキーボードでもテンキーを使えます。これまた便利。

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = LAYOUT( \
KC_1 , KC_2 , KC_3 , KC_4 , KC_5 ,XXXXXXX, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS , \
KC_Q , KC_W , KC_E , KC_R , KC_T , KC_ESC, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC , \
KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB, KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT , \
LT(_FN,KC_Z), LGUI_T(KC_X), KC_C , KC_V , KC_B ,KC_LALT, KC_N , KC_M , KC_COMM , KC_DOT, KC_SLSH, KC_UP , \
XXXXXXX , XXXXXXX , KC_INT5 , KC_SPC,KC_LSFT,KC_LCTL, KC_BSPC, KC_ENT,LT(_TE,KC_INT4),KC_LEFT,KC_DOWN , KC_RGHT \
),
[_FN] = LAYOUT( \
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , XXXXXXX, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
MO(_FN), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INT1, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LSFT, KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
),
[_TE] = LAYOUT( \
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , XXXXXXX, XXXXXXX, KC_F10 ,KC_SLSH, JP_ASTR, KC_EQL, KC_INT3 , \
KC_VOLU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC , XXXXXXX, XXXXXXX,KC_7 , KC_8 , KC_9 , KC_MINS , \
KC_VOLD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TAB , XXXXXXX, XXXXXXX,KC_4 , KC_5 , KC_6 , JP_PLUS , \
KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LALT, XXXXXXX, XXXXXXX,KC_1 , KC_2 , KC_3 , KC_BSPC , \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LSFT, KC_LCTL, KC_DEL , XXXXXXX,LT(_TE,KC_INT4),KC_0,KC_DOT,KC_PENT \
),
};

このままmakeしてもエラーが出ます。
縦5行、横12列のレイアウトを書き込んでいないためです。

※2024/8/15追記
その後に作り直したところ、何故かbluetoothドライバーエラーが出てしまいました。
keymap.cから以下の文章を削除するとエラーなく動作するようになりました。

冒頭部分のこれ⤵
#include "app_ble_func.h"

後半のこれ⤵
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
char str[16];
if (record->event.pressed) {
switch (keycode) {
case DELBNDS:
delete_bonds();
return false;
case AD_WO_L:
restart_advertising_wo_whitelist();
return false;
case USB_EN:
set_usb_enabled(true);
return false;
break;
case USB_DIS:
set_usb_enabled(false);
return false;
break;
case BLE_EN:
set_ble_enabled(true);
return false;
break;
case BLE_DIS:
set_ble_enabled(false);
return false;
break;
case ADV_ID0:
restart_advertising_id(0);
return false;
case ADV_ID1:
restart_advertising_id(1);
return false;
case ADV_ID2:
restart_advertising_id(2);
return false;
case ADV_ID3:
restart_advertising_id(3);
return false;
case ADV_ID4:
restart_advertising_id(4);
return false;
case DEL_ID0:
delete_bond_id(0);
return false;
case DEL_ID1:
delete_bond_id(1);
return false;
case DEL_ID2:
delete_bond_id(2);
return false;
case DEL_ID3:
delete_bond_id(3);
return false;
case BATT_LV:
sprintf(str, "%4dmV", get_vcc());
send_string(str);
return false;
case ENT_DFU:
bootloader_jump();
return false;
}
}
else if (!record->event.pressed) {
switch (keycode) {
case ENT_SLP:
sleep_mode_enter();
return false;
}

}
return true;
}
;bool process_record_user(uint16_t keycode, keyrecord_t *record) {
char str[16];
if (record->event.pressed) {
switch (keycode) {
case DELBNDS:
delete_bonds();
return false;
case AD_WO_L:
restart_advertising_wo_whitelist();
return false;
case USB_EN:
set_usb_enabled(true);
return false;
break;
case USB_DIS:
set_usb_enabled(false);
return false;
break;
case BLE_EN:
set_ble_enabled(true);
return false;
break;
case BLE_DIS:
set_ble_enabled(false);
return false;
break;
case ADV_ID0:
restart_advertising_id(0);
return false;
case ADV_ID1:
restart_advertising_id(1);
return false;
case ADV_ID2:
restart_advertising_id(2);
return false;
case ADV_ID3:
restart_advertising_id(3);
return false;
case ADV_ID4:
restart_advertising_id(4);
return false;
case DEL_ID0:
delete_bond_id(0);
return false;
case DEL_ID1:
delete_bond_id(1);
return false;
case DEL_ID2:
delete_bond_id(2);
return false;
case DEL_ID3:
delete_bond_id(3);
return false;
case BATT_LV:
sprintf(str, "%4dmV", get_vcc());
send_string(str);
return false;
case ENT_DFU:
bootloader_jump();
return false;
}
}
else if (!record->event.pressed) {
switch (keycode) {
case ENT_SLP:
sleep_mode_enter();
return false;
}

}
return true;
}
;

追記部分おわり


2、ble_micro_test.hにキーレイアウトを書き込む
これを記載します。
LとかRと数字の組み合わせですが、上下が対応するならなんでも良さそう。
60キーあるので、60種類の動物の名前などでもいけるかも。

#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, R30, R31, R32, R33, R34, R35, \
L40, L41, L42, L43, L44, L45, R40, R41, R42, R43, R44, R45 \
) \
{ \
{ 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, R30, R31, R32, R33, R34, R35 }, \
{ L40, L41, L42, L43, L44, L45, R40, R41, R42, R43, R44, R45 } \
}

これでmakeしてもエラー。
config.hに編集が必要です。

3、二つのconfig.hにROWSとCOLSの数を書き込む
どちらも同じ数になるように記載します。

#define THIS_DEVICE_ROWS 5
#define THIS_DEVICE_COLS 12

さらに、片方のconfig.hに、それぞれの行や列に対応するPINを割り当てます
ROWSはキーボードの上側、つまり数字キーの行からとなります。5行あるので5行。
COLSは左側から。12列あるので12カ所のピンを指定。

#define MATRIX_ROW_PINS { PIN1, PIN2, PIN5, PIN6, PIN7 } 
#define MATRIX_COL_PINS { PIN8, PIN9, PIN10, PIN11, PIN12, PIN13, PIN14, PIN15, PIN16, PIN17, PIN18, PIN19 }

ピンの番号はこちらを見て、しっかり確認しましょう。


4、これから追加すること
bluetoothに関するレイヤーを作成してキーを割り当てる。
端末の切り替えなどができるようにしなければなりません。
端末1台のみで使うなら不要かも。

ともかく、机の上がひろい!
スタバでドヤ顔で使ってみたいですね。

画像4


■必要な材料

Gateron mechanical keyboard switch

xd75re xd75am xd75 Custom Mechanical Keyboard 75 keys Underglow RGB PCB

ちぎっては投げ、ちぎっては投げ、試行錯誤を繰り返して、楽しかったり上手く行ったところを書いていたりします。 貴重なサポートを頂けますと、なおさら色んなことを試して書きます!