|
|
|
|
今回購入(同等品)![]() SparkFun Pro Micro 3.3V/8MHz DEV-12587 ASIN: B08KW46VXG |
今回購入![]() GAOHOU ミニUSBホストシールド2.0 ADK SLR開発ツール互換SPIインターフェイス ASIN: B074HTPK13 |
![]() HiLetgo USBホストシールド2.0 ADK USBホストシールドミニUSBホストシールド一眼レフ開発ツール GoogleアンドロイドADK Arduino UNO MEGA2560ディエシミラ/デュエミラノーブ ASIN: B093BZM54C |
![]() Hailege 5個セット TXS0108E高速全二重8ウェイ8チャネルレベル変換モジュール8ビット8 CHロジックレベル双方向コンバーターモジュール ASIN: B08R5WFJTH |





こんな感じで完成します。










| OLED SSD1306 128x32 | OLED Driver |
| Audio | Audio Driver :id=audio-driver |
| VIA(2 Layer) #16458を適用 | VIA Configuring QMK |
| Dynamic Macros | Dynamic Macros: Record and Replay Macros in Runtime |
| BootMagic | Bootmagic Lite :id=bootmagic-lite |

{
"name":"USB to USB keyboard protocol converter with #16458",
"vendorId":"0x4853",
"productId":"0x005B",
"lighting":"none",
"matrix":{
"rows":9,
"cols":16
},
"layouts":{
"keymap":[
[ {"x":2},"0,1","0,2","0,3","0,4", {"x":0.5},"0,5","0,6","0,7","0,8", {"x":0.5},"0,9","0,10","0,11","0,12" ],
[ "0,0", {"x":1},"0,13","0,14","0,15","1,0", {"x":0.5},"1,1","1,2","1,3","1,4", {"x":0.5},"1,5","1,6","1,7","1,8", {"x":0.5},"1,9","1,10","1,11", {"x":1.5},"1,12","1,13","1,14", {"x":0.5},"1,15","2,0" ],
[ {"y":0.5},"2,1","2,2","2,3","2,4","2,5","2,6","2,7","2,8","2,9","2,10","2,11","2,12","2,13","2,14","2,15", {"x":0.5},"3,0","3,1","3,2", {"x":0.5},"3,3","3,4","3,5","3,6", {"x":0.5},"3,7","3,8" ],
[ {"w":1.5},"3,9","3,10","3,11","3,12","3,13","3,14","3,15","4,0","4,1","4,2","4,3","4,4","4,5", {"w":1.5},"4,6", {"x":0.5},"4,7","4,8","4,9", {"x":0.5},"4,10","4,11","4,12","4,13", {"x":0.5},"4,14","4,15" ],
[ "5,0","5,1","5,2","5,3","5,4","5,5","5,6","5,7","5,8","5,9","5,10","5,11", "5,12", {"w":2},"5,13", {"x":4},"5,14","5,15","6,0","6,1", {"x":0.5},"6,2","6,3" ],
[ {"w":1.5},"8,1","6,4","6,5","6,6","6,7","6,8","6,9","6,10","6,11","6,12","6,13","6,14", "6,15",{"w":1.5},"8,5", {"x":1.5},"7,0", {"x":1.5},"7,1","7,2","7,3","7,4", {"x":0.5},"7,5","7,6" ],
[ {"w":1.5},"8,0","8,3","8,2","7,7","7,8", {"w":2},"7,9", "7,10","7,11","7,12","8,6","8,7","7,13",{"w":1.5},"8,4", {"x":0.5},"7,14","7,15","8,8", {"x":0.5, "w":2},"8,9", "8,10","8,11", {"x":0.5},"8,12","8,13" ]
]
}
}
{
"name":"USB to USB keyboard protocol converter",
"vendorId":"0xFEED",
"productId":"0x005B",
"lighting":"none",
"matrix":{
"rows":16,
"cols":16
},
"layouts":{
"keymap":[
[ {"x":2},"6,8", "6,9", "6,10", "6,11", {"x":0.5},"6,12", "6,13", "6,14", "6,15", {"x":0.5},"7,0", "7,1", "7,2", "7,3" ],
[ "2,9",{"x":1},"3,10", "3,11", "3,12", "3,13", {"x":0.5},"3,14", "3,15", "4,0", "4,1", {"x":0.5},"4,2", "4,3", "4,4", "4,5", {"x":0.5},"4,6", "4,7", "4,8", {"x":1.5},"8,1", "8,0", "7,15", {"x":0.5},"6,6","7,5" ],
[ "3,5", "1,14", "1,15", "2,0", "2,1", "2,2", "2,3", "2,4", "2,5", "2,6", "2,7", "2,13", "2,14", "8,9", "2,10", {"x":0.5},"4,9", "4,10", "4,11", {"x":0.5},"5,3", "5,4", "5,5", "5,6", {"x":0.5},"7,8", "7,9" ],
[ {"w":2},"2,11", "1,4", "1,10", "0,8", "1,5", "1,7", "1,12", "1,8", "0,12", "1,2", "1,3", "2,15", "3,0", "3,1", {"x":0.5},"4,12", "4,13", "4,14", {"x":0.5},"5,15", "6,0", "6,1", "5,7", {"x":0.5},"7,6", "7,10" ],
[ "3,9", "0,4", "1,6", "0,7", "0,9", "0,10", "0,11", "0,13", "0,14", "0,15", "3,3", "3,4", "3,2", {"w":2},"2,8", {"x":4}, "5,12", "5,13", "5,14", "8,5", {"x":0.5},"7,7", "7,12" ],
[ {"w":1.5},"14,1", "6,4", "1,13", "1,11", "0,6", "1,9", "0,5", "1,1", "1,0", "3,6", "3,7", "3,8", "8,7", {"w":1.5},"14,5", {"x":1.5},"5,2", {"x":1.5},"5,9", "5,10", "5,11", "6,7", {"x":0.5},"7,4", "7,13" ],
[ {"w":1.5},"14,0", "14,3", "14,2", "8,11", "9,1", {"w":2},"2,12", "9,0", "8,10", "8,8", "14,6", "14,7", "6,5", {"w":1.5},"14,4", {"x":0.5},"5,0", "5,1", "4,15",{"x":0.5, "w":2},"6,2", "6,3", "5,8", {"x":0.5},"7,14", "7,11" ]
]
}
}
enum my_keycodes {
MO_LAYER1 = SAFE_RANGE,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_via( ..., MO_LAYER1, ... )
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
...
// Momentary layer switching MO(1)
if (keycode == MO_LAYER1) {
if (record->event.pressed) {
layer_on(1);
} else {
layer_clear();
}
}
...
return true;
}
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_via( ..., KC_RGUI, KC_APP, ... ),
[_FN1] = LAYOUT_via( ..., ______, KC_NO, ... ),
};
bool isRGUI = false;
bool isLayer1 = false;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
...
下記をベースにして必要に応じて改良して使用します。
// Momentary layer switching MO(1) with KC_RGUI and KC_APP
if (isRGUI) {
isRGUI = false;
if (keycode == KC_APP) {
if (record->event.pressed) {
isLayer1 = true;
layer_on(1);
}
return false;
} else {
register_code(KC_RGUI);
}
}
if (keycode == KC_RGUI) {
if (record->event.pressed) {
isRGUI = true;
return false;
} else {
if (isLayer1) {
isLayer1 = false;
layer_clear();
return false;
}
}
}
...
return true;
}
#define VIA_MACRO_WAIT 100
void dynamic_keymap_macro_send(uint8_t id) {
...
if (data[2] == 0) {
break;
}
}
send_string(data);
#ifdef VIA_MACRO_WAIT
wait_ms(VIA_MACRO_WAIT);
#endif
}
}
#define DYNAMIC_MACRO_DELAY 50
void dynamic_macro_play(keyrecord_t *macro_buffer, keyrecord_t *macro_end, int8_t direction) {
dprintf("dynamic macro: slot %d playback\n", DYNAMIC_MACRO_CURRENT_SLOT());
layer_state_t saved_layer_state = layer_state;
clear_keyboard();
layer_clear();
while (macro_buffer != macro_end) {
process_record(macro_buffer);
macro_buffer += direction;
#ifdef DYNAMIC_MACRO_DELAY
wait_ms(DYNAMIC_MACRO_DELAY);
#endif
}
$ cat reset.eep :0100000000FF :00000001FF $ avrdude -p atmega32u4 -c avr109 -P /dev/ttyS9 -c avr109 -U eeprom:w:reset.eep:i
rules.mkの DEFAULT_FOLDER = converter/usb_usb/hasu を DEFAULT_FOLDER = converter/usb_usb/pro_micro に書き換える
qmk compile -kb converter/usb_usb -km default
USB シリアル デバイス USB\VID_1B4F&PID_9207&REV_0001 USB\VID_1B4F&PID_9207 USB シリアル デバイス USB\VID_1B4F&PID_9208&MI_00