Привет, Хабр!
Зарегистрировался, чтобы поделиться статьёй о восстановлении работоспособности механической клавиатуры Royal Kludge R87 Pro. Быть может моя статья кому-то поможет в восстановлении своей клавиатуры, используя МК (STM32F103R8T6) или просто я опишу здесь некоторые моменты того, чего не было описано в других статьях на различных ресурсах, в т.ч. и вот здесь - https://habr.com/ru/articles/857914/. т.к. было потрачено очень много для первого раза, благо, свободного времени на её восстановление, хочу поделиться опытом. Не буду писать, как установить qmk на windows и т.д. Так же не буду описывать время на подбор, поиск, ожидание МК. Далее понимания, что это, возможно, не тот МК, т.к. я заказал аналог "stm32f103" - это "ch32f103", и заказ нового, плюс я из-за невнимательности ошибался и заказывал МК на 48 выводов, а еще, оказывается, эти МК могут не работать с кварцем на 12 мгц, установленным на плате, и еще какие-либо ошибки...
Ссылку на статью выше я буду использовать как скелет в написании этой.
ps для решения своих вопросов очень часто прибегал к ai. Но в статье уже будут этапы и готовый результат.
Начало
Итак, имеем клавиатуру Royal Kludge R87 Pro
с дефектом - нажимаешь 1, печатается 1 2 3 4 5, нажимаешь q, печатается q w e r t. И так далее по матрице клавиатуры. Про матрицу чуть ниже опишу. Разобрал клавиатуру, здесь используется МК(микроконтроллер) WB32FQ95RCT6 (кратко - Китай, который практически не найти у нас, да и в сети мало про него информации). Прозвонкой матрицы тестером пришел к выводу, что глючит сам МК, точнее его вывод, т.к. матрица к нему подключается напрямую без всяких диодов, резисторов и т.д. Решил искать аналоги МК, выбор пал на "STM32F103R8T6, МК ARM Cortex-M3 32-Bit 72MHz 64KB FLASH [LQFP-64]". Так же до этого приобретал RP2040zero, припаивался проводами к плате, но решил не применять этот колхоз, когда есть возможность заменить сам контроллер на плате, а к нему уже итак есть все необходимые дорожки. Далее перепаиваю МК. Использовал для выпайки WB32FQ95 фен, а для запаивания STM32F103 использовал паяльник и сплав розе на 92-95 градусов + оплетку(можно использовать многожильный провод) для удаления лишнего припоя
Про матрицу есть ссылка в предыдущей статье. Если кратко, чтобы не использовать 100500 выводов от микроконтроллера на каждую кнопку, придумали матрицу клавиш для экономии выводов. Т.е. есть строчки(ряды), в основном это 6 строк, нумерация в qmk начинается от 0 и заканчивая 5, где в первой нулевой ( 0 ) строке располагаются esc, f1, f2, f3 и так по ряду, далее на ряде 1 располагаются "ё, 1, 2, 3, 4". Ряд по номером 2, тут располагаются tab. q. w. e. r. t и так далее до ряда под цифрой 5, где идет ctrl, win, alt, space и т.д.
Так же есть колонки(столбцы) матрицы по такому же принципу. Отсчет так же начинается с 0. Тут индивидуально для каждого производителя клавиатуры и от количества клавиш в вашей клавиатуре. У меня на 88 клавиш получилось 17 колонок, и так же счет идет от 0 до 16. Для моей клавиатуры я нашел матрицу от производителя, но все равно для таких случаев нужен тестер, т.к. у меня 1 клавиша(точнее, энкодер) была не по этой матрице. Далее все это для удобства зарисовываем на бумаге. Далее я прозваниваю каждую колонку и каждый ряд матрицы, к какому выводу моей МК stm32f103 всё это дело идет:
По итогу каждая колонка(столбец) и каждый ряд(строчка) подключается к выводу МК. Получается у меня 6 строк и 17 столбцов и того 23 вывода.
По итогу матрицы всё это прописываю в файле keyboard.json с физическим расположением клавиш по координатам (x,y), где x это столбец, а y это ряд. Кстати, я так же использовал основу для клавиатуры от "moky88" для создания своей, т.к. расположение кнопок совпадало на 98%. В официальной документации QMK говорится, что координаты 0,0 это визуально левый верхний угол клавиатуры(кнопка ESC), а 224,64 это по диагонали правый нижний угол. Тут опять же, смотря какого размера у вас клавиатура, у меня на клавиатуре это стрелка вправо(см. изображение выше), у вас это может быть Enter. И вот пропорционально на каждую строку/столбец матрицы делятся эти значения.

Прошивка
Как я понял, что для создания прошивки в папке с названием клавиатуры должны использоваться такие файлы:

Забегая вперед сразу приложу содержимое моих файлов, которые получились по итогу рабочей прошивки для МК:
Файл config.h имеет следующий код:
config.h
#pragma once
#define F_CPU 72000000
#define MATRIX_ROWS 6
#define MATRIX_COLS 17
#define DEBOUNCE 5
#undef ENCODER_A_PINS
#undef ENCODER_B_PINS
#define ENCODER_MAP_ENABLE
#define ENCODER_A_PINS { B6 }
#define ENCODER_B_PINS { B7 }
#define ENCODER_RESOLUTION 4
#define LED_CAPS_LOCK_PIN A9
#define USB_POLLING_INTERVAL_MS 1
#define WS2812_DRIVER SPI
#define WS2812_DI_PIN A7
#define DRIVER_LED_TOTAL 121
#define RGB_MATRIX_LED_COUNT 121
#define ENABLE_RGB_MATRIX_BREATHING
#define ENABLE_RGB_MATRIX_BAND_SAT
#define ENABLE_RGB_MATRIX_BAND_VAL
#define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
#define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
#define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
#define ENABLE_RGB_MATRIX_CYCLE_ALL
#define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
#define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
#define ENABLE_RGB_MATRIX_HUE_BREATHING
#define ENABLE_RGB_MATRIX_HUE_PENDULUM
#define ENABLE_RGB_MATRIX_HUE_WAVE
#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
#define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
#define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
#define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_ALL
#define RGB_MATRIX_DEFAULT_HUE 0
#define RGB_MATRIX_DEFAULT_SAT 255
#define RGB_MATRIX_DEFAULT_VAL 150
#define RGB_MATRIX_DEFAULT_SPD 127
Файл halfconf.h:
halfconf.h
#pragma once
#undef HAL_USE_SPI
#define HAL_USE_SPI TRUE
#include_next "halconf.h"
Файл mcuconf.h:
mcuconf.h
#pragma once
#include_next "mcuconf.h"
#undef STM32_HSECLK
#define STM32_HSECLK 8000000U
#undef STM32_PLLMUL_VALUE
#define STM32_PLLMUL_VALUE 9
#undef STM32_USB_USE_OTG1
#undef STM32_USB_USE_USB1
#define STM32_USB_USE_USB1 TRUE
#define STM32_OTG1_IRQ_PRIORITY 6
#undef STM32_SPI_USE_SPI1
#define STM32_SPI_USE_SPI1 TRUE
Файл rules.mk:
rules.mk
MCU = STM32F103
BOARD = STM32_F103_STM32DUINO
BOOTLOADER = custom
PLATFORM = chibios
USE_USB = yes
USE_FPU = no
LTO_ENABLE = yes
EXTRAKEY_ENABLE = yes
RGB_MATRIX_ENABLE = yes
RGB_MATRIX_DRIVER = ws2812
ENCODER_ENABLE = yes
CONSOLE_ENABLE = no
COMMAND_ENABLE = no
Файл keymap.c, который расположен в "имя_вашей_клавиатуры\keymaps\default"
Скрытый текст
#include QMK_KEYBOARD_H
led_config_t g_led_config = { {
// Key Matrix to LED Index
{ 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68 },
{ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67 },
{ 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34 },
{ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, NO_LED, 33, NO_LED, NO_LED, NO_LED },
{ 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, NO_LED, NO_LED, NO_LED,8, NO_LED },
{ 85, 86, 87, NO_LED, NO_LED, 0, NO_LED, NO_LED, 1, 2, 3, 4, 5, 6, 7 }
},
{
// LED Index to Physical Position
{84, 64}, {140, 64}, {154, 64}, {168, 64}, {182, 64}, {196, 64}, {210, 64}, {223, 64},
{210, 52}, {154, 52}, {140, 52}, {126, 52}, {112, 52}, {98, 52}, {84, 52}, {70, 52}, {56, 52}, {42, 52}, {28, 52}, {14, 52}, {1, 52},
{1, 39}, {14, 39}, {28, 39}, {42, 39}, {56, 39}, {70, 39}, {84, 39}, {98, 39}, {112, 39}, {126, 39},{140, 39}, {154, 39},{182, 39},
{223, 26}, {210, 26}, {196, 26}, {182, 26}, {168, 26}, {154, 26}, {140, 26}, {126, 26}, {112, 26}, {98, 26}, {84, 26}, {70, 26}, {56, 26}, {42, 26}, {28, 26}, {14, 26}, {1, 26},
{1, 13}, {14, 13}, {28, 13}, {42, 13}, {56, 13}, {70, 13}, {84, 13}, {98, 13}, {112, 13}, {126, 13},{140, 13}, {154, 13},{168, 13}, {182, 13}, {196, 13},{210, 13}, {223, 13},
{223, 0}, {210, 0}, {196, 0}, {182, 0}, {168, 0}, {154, 0}, {140, 0}, {126, 0}, {112, 0}, {98, 0}, {84, 0}, {70, 0}, {56, 0}, {42, 0}, {28, 0}, {14, 0}, {1, 0},
{1, 64}, {14, 64}, {28, 64}, {1, 64}, {1, 60}, {1, 56}, {1, 52}, {1, 48}, {1, 44}, {1, 40}, {1, 36}, {1, 32}, {1, 28}, {1, 24}, {1, 20}, {1, 16}, {1, 12},
{224, 12}, {224, 16}, {224, 20}, {224, 24}, {224, 28}, {224, 32}, {224, 36}, {224, 40}, {224, 44}, {224, 48},{224, 52}, {224, 56},{224, 60}, {224, 64},
{222, 40}, {222, 41}, {222, 42}, {222, 43}, {222, 44}
},
{
// LED Index to Flag
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
}
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_CALC, KC_PSCR, KC_SCRL,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_MUTE,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT(
_______, KC_MYCM, KC_WHOM, KC_MAIL, KC_CALC, KC_MSEL, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_ON, RM_HUEU, RM_SATU,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_NEXT, RM_TOGG, RM_OFF, RM_HUED, RM_SATD,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_OFF,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU,
_______, GU_TOGG, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_VALD, RM_SPDU),
};
// энкодер
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[0] = { {KC_VOLU, KC_VOLD} },
[1] = { {RM_NEXT, RM_PREV} }
};
// индикатор capslock
void keyboard_post_init_user(void) {
palSetLineMode(A9, PAL_MODE_OUTPUT_PUSHPULL);
writePinHigh(A9);
// Индикатор Gu_togg
palSetLineMode(B8, PAL_MODE_OUTPUT_PUSHPULL);
// По умолчанию индикатор выключен
writePinHigh(B8);
}
void led_set_user(uint8_t usb_led) {
bool caps = usb_led & (1 << 0);
if (caps) {
writePinLow(A9); // LED ON (потому что минус на A9)
} else {
writePinHigh(A9); // LED OFF
}
}
bool gu_enabled = true; // хранит состояние индикатора
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case GU_TOGG:
if (record->event.pressed) {
// === ПЕРЕКЛЮЧЕНИЕ WIN LOCK ===
keymap_config.no_gui = !keymap_config.no_gui;
// === ИНДИКАТОР НА B8 ===
if (keymap_config.no_gui) {
writePinHigh(B8); // LED ON (инвертированно)
} else {
writePinLow(B8); // LED OFF
}
}
return false; // Не посылать GU_TOGG дальше — он чисто управляющий
}
return true;
}
С матрицей разобрался. Компилирую прошивку. Для прошивки МК использую программатор ST LINK Stlink ST-Link V2 (покупал на маркетплейсе). Выводы +3.3, SWDIO, SWCLK, GND (определил тестером) были на плате клавиатуры,
подпаял только ножки для подключения программатора. Заливаю прошивку через STM32CubeProgrammer, подключаю клаву к ПК ииии..... "USB-устройство не опознано". На этом моменте потрачено больше всего времени, пока я не купил дополнительно bluepill на stm32f103 и понял, что всё таки нужно было изначально прошивать сначала загрузчик в stm32f103, а потом прошивку qmk. Что самое интересное, я читал и знал, что на f103 нет встроенного загрузчика, но я думал что qmk сам его "подцепит". В итоге в rules.mk я использовал bootloader - "custom", т.к. отдельный бутлоадер я взял на гитхабе именно generic_boot20_pc13.bin т.к. пин c13 используется для подсветки светодиода на плате bluepill. Этот же bootloader я использовал и для своего мк STM32F103R8T6. После прошивки бутлоадера и скомпилированной прошивки, клавиатура определилась в винде как положено и заработали клавиши.
Далее пошла подсветка.
Подсветка
После того, как у меня заработали все кнопки я стал искать к какому пину у меня подключается подсветка. Светодиоды у меня адресные - ws2812 (в qmk они так же без проблем поддерживаются), где используются 4 пина, плюс, минус, дата+, дата-. Принцип простой. С питанием все понятно. На дата+ светодиод получает код от МК, далее он отрезает свой код и передает дальше через свой дата- на дата+ другого светодиода. Тот делает тоже самое: получает код, отрезает свой и передает дальше и так по цепочке светодиодов в вашей линейке. С помощью тестера определил пин на МК, откуда идет дата+ на светодиоды. Далее записываю, как у меня идет нумерация в линейке светодиодов на плате.
Получилось вот так в файле keymap.c:

У меня получается 88 светодиодов на клавиши + еще по 14 с каждой стороны(лево-право) и еще 5 светодиодов располагаются около индикатора caps и win. И того всего 121 светодиод. Линейка светодиодов от МК у меня начинается с резистора на 390 ом и после идет на клавишу "пробел". Это у меня светодиод под номером 0. Далее по цепочке/змейке на alt, fn,.... Прописываю все это в keymap.c Так же ниже в keymap.c прописывается значение каждого светодиода, где 4 означает что это подсветка клавиши, а 1 это просто подсветка. Так же для работы подсветки нужно прописать в файле rules.mk
RGB_MATRIX_ENABLE = yes
RGB_MATRIX_DRIVER = ws2812
Сами эффекты RGB Matrix можно найти вот здесь в официальной документации. Я использовал 24 эффекта.

Кстати, так же я указывал физическое расположение светодиодов для отдельных видов подсветки. Координаты светодиодов выглядели вот так, где 0 светодиод это "пробел" и располагался он по x,y вот здесь {84,64} и так далее по физическому расположение светодиодов на матрице:

Заливаю прошивку и у меня появляется новый глюк - при нажатии клавиш из столбца на F9, у меня вместо F9 нажимается F1, F2, F3, F4, F5 и так по матрице именно столбца F9. Глюк был именно после подключения подсветки. Так я еще провел некоторое время в поисках какого-либо лишнего резистора/диода на плате и было решено пересадить подсветку на другой вывод МК, путём подпаивания тонкой жилы от другого незадействованного вывода в прошивке МК к резистору 390 ом и отрезания дорожки от предыдущего вывода.
Теперь все заработало как надо, нет никаких глюков. Остается дело за малым, настроить слои клавиатуры через FN, подключить энкодер, индикатор caps. А так же чтобы работали мультимедийные клавиши(громкость+ и -, открытие браузера/калькулятора, пауза\стоп и т.д.)
Еще время...
С энкодером(крутилкой звука) тоже ушло у меня время. Пины самого энкодера я прописал сразу в config.h, но звук не хотел регулироваться. В итоге нужно было прописать в rules.mk EXTRAKEY_ENABLE = yes , после чего громкость звука начала регулироваться и остальные мультимедийные клавиши так же заработали, но на энкодере так же есть нажатие, что должно отключать звук. Опять взял тестер. Оказывается, визуально энкодер находится в 0 строке и 16 столбце, а его выводы, именно как кнопка нажатия, физически находятся на 3 строке и 14 столбце.
Пришлось еще раз корректировать keyboard.json с добавлением строки {"matrix": [3,14], "x": 196, "y": 39}, и убиранием строки {"matrix": [0,16], "x": 224, "y": 0}, Далее был момент с индикатором capslock. Индикатор (светодиод) есть и подключен напрямую к МК, а он не работает. Был использован код (в начале статьи описание keymap.c про вывод МК A9)
С добавлением второго слоя клавиатуры трудностей, как таковых, никаких не было. Копирую слой 0 в слой под номером 1, ненужные клавиши заменяю на ______. Оставляю только то, что будет активно при зажатой клавиши FN.
Изначально на нулевом слое на кнопку FN назначается параметр MO(1), где можно будет как раз таки использовать доп. кнопки второго слоя(он под номером 1 идет в qmk), а так же переключиться еще на 3 слой клавиатуры и т.д., если бы я его создавал и использовал, но мне не было в этом необходимости. (пример слоев и их переключение со значением клавиш можете посмотреть в moky88, ссылка выше)
Так же на плате клавиатуры совместно с WB32FQ95RCT6 была флешка spi 25d40, но в моём случае она осталась не задействованной. Физически я её оставил, но в коде для smt32f103 я нигде не упоминал её.
Финал
Итак, после всего проделанного, клавиатура имеет право на вторую жизнь, если даже не вечную(МК, как и свитчи, можно поменять, всё для этого есть). Все свои изначальные и основные функции клавиатура выполняет, работают все кнопки, так же подсветка с различными режимами. А что еще надо? А вот что! - в идеале использоваться другой МК stm32 с поддержкой встроенного бутлоадера, где можно будет назначить кнопку (обычно Esc, для перехода в режим загрузки прошивки).
А на этом все. Надеюсь, кому-нибудь это будет интересно и полезно.
P.S. сама клава, я считаю, не стоит своих финансов даже при условии, что не отказал бы вывод МК. Да, тут свитчи практически бесшумные и есть быстрая их замена, но они не прозрачные, и как и кейкапы - не подсвечивают само значение клавиши.
Комментарии (7)

Arhammon
20.11.2025 03:23Дорожкозаместительный волосок выглядит скорее как бревно, которое от температуры удлиняется-сокращается давая нагрузку на нештатное крепление, ну и вес у бывшего вывода резистора? ненулевой. Обычно используется реально волосок, еще и фиксируется маской или на крайняк лаком.

alexon05 Автор
20.11.2025 03:23Про нагрев я что-то и не подумал, хотя там идут только data+. Само питание светодиодов идет от usb по штатным дорожкам, не от МК. Была мысль закрепить его просто термоклеем(хотя цапон-лак так же имеется).
Про резистор R14. Изначально для чего он использовался в штатном МК WB32, я не стал выяснять и смотреть, просто убрал его и кинул перемычку-бревно.
Про еще одно "бревно" от самого МК - я в статье это не описал, но это мой косяк. когда второй раз уже перепаивал МК и лудил дорожки, вот 1 дорожка от нагрева отвалилась. Пришлось делать такую перемычку. Эта дорожка от 13 колонки вроде

F1eex
20.11.2025 03:23За статью и в карму плюсану вам, сразу как только смогу)
В официальной документации QMK говорится, что координаты 0,0 это визуально левый верхний угол клавиатуры(кнопка ESC), а 224,64 это по диагонали правый нижний угол. Тут опять же, смотря какого размера у вас клавиатура, у меня на клавиатуре это стрелка вправо(см. изображение выше), у вас это может быть Enter. И вот пропорционально на каждую строку/столбец матрицы делятся эти значения.
Т.е. 6 выводов МК назначены как Rows и 17 назначены как Cols. Значит для прошивки нужно задать табличку, где сочетания Rows и Cols будут равны коду клавиши. Я так и не понял, зачем вообще нужно прописывать какие-то координаты? И в каких они единицах - в миллиметрах? Прошу объяснить мне, неразумному)

alexon05 Автор
20.11.2025 03:23про выводы МК всё верно.
про координаты, если речь идет о файле keyboard.json, то это в первую очередь для самого qmk конфигуратора(или для via. Но этот via я не добавлял). Т.е. в теории их можно не использовать в файле keyboard.json , но я не помню выдавал ли компилятор ошибку.
Про единицы измерения, это точно не миллиметры) Я понял, что это стандарт: 0-0 и 224-64. Для удобства счета координат колонок просто делим 224 на 16 и получаем 14. Почему на 16, а не 17 делить? потому что не учитываем первую нулевую колонку. С рядами тоже самое, 64/5 получаем 12.8, но округляем до 13. (Так же можно заметить, что если по координатам Y 64 вычесть 52 получаем 12, т.к. изначально было не целое число)
итог, если у вас полноразмерная клавиатура с num-падом, то тогда получается, например, всего 20 колонок. Значит 20-1(нулевой ряд) = 19. 224 делим на 19 получаем 11.78, округляем до 12 И тогда координаты X можно прописать с шагом 12, (0,0 _ 12-0 _ 24-0 _ 36-0 и т.д.) или же еще вдобавок для красоты координатов можно учесть разделение блоков клавиатуры между собой. Про блоки я имею ввиду блок num-pad, блок где находятся "стрелки, end, home, pg up и т.д. и блок основных клавиш - буквы, f1-12, shift, caps...
ну и если клавиатура, например, 60 клавиш, тогда правый CTRL это будет 224. Значит, получается, например, 14 колонок. 14-1 и того 13. 224 делим на 13 получаем 17.2. тут используем шаг 17. ( 0-0 _ 17-0 _ 34-0 и т.д.)

F1eex
20.11.2025 03:23Спасибо! У меня как раз валяется Microsoft Sculpt Ergo без свистка. И я хочу посадить ее на провод.
GooseWing
Загорелся интересом поискать информацию про него тоже. Ну и сами по себе WB32 видимо делают вполне существующая компания https://www.westberrytech.com/support.php, вот только номенклатуры такой (FQ95) у них нет. Т.е. видимо производитель плат для клавиатур лепят совсем лютую подделку, дабы сэкономить.
И я, хоть убей, но помню что где-то видел "FQ95", но интернет как всегда ничего не дает :(.
alexon05 Автор
Кстати, чью раскладку я использовал в создании этой(в статье указывал) - человек с ником "moky" на GH, а точнее его раскладку "moky88" вот как раз в ней он и использует у себя WB32FQ95:
"manufacturer": "moky","keyboard_name": "moky88",
"processor": "WB32FQ95",
"bootloader": "wb32-dfu",