N-Key Rollover, или сокращённо NKRO, это свойство клавиатуры корректно передавать в компьютер любое число одновременно нажатых клавиш, вплоть до всех ста с лишним кнопок полноразмерного корпуса. На дешёвых моделях вместо этого действует жёсткий предел: после двух-трёх, иногда шести одновременных нажатий контроллер либо «теряет» новые клавиши, либо регистрирует клавиши, которые никто не нажимал. Геймер натыкается на это в самый неподходящий момент, когда бежит по диагонали, прыгает и перезаряжает оружие одновременно, а персонаж внезапно замирает. Чтобы понять, откуда берётся ограничение, нужно спуститься на уровень электрической разводки клавиш, протокола USB HID и экономики производства, где каждая лишняя деталь на плату стоит денег.

Матричная разводка клавиш и круговой опрос контроллера

Внутри любой клавиатуры, от офисной мембраны за пару сотен рублей до механики премиум-класса, клавиши не подключены к контроллеру индивидуальными проводами. Сто восемь отдельных линий потребовали бы микросхемы со ста восемью ножками ввода-вывода, а это дорогой кристалл и сложная разводка платы. Инженеры давно нашли выход: клавиши объединяются в матрицу из строк и столбцов. Типичная полноразмерная клавиатура использует сетку примерно восемь строк на восемнадцать столбцов, и каждая клавиша расположена на пересечении своей пары проводников. Для опроса всей матрицы достаточно двадцати шести пинов контроллера вместо ста восьмидесяти.

Работа контроллера устроена как бесконечный цикл сканирования. Он поочерёдно подаёт сигнал на каждый столбец, а строки в этот момент слушает как входы. Если клавиша на пересечении активного столбца и какой-либо строки нажата, контакт замыкается, сигнал протекает в строку, и контроллер фиксирует нажатие в виде пары координат. Затем активируется следующий столбец, и цикл повторяется. Полный проход всей матрицы называется одним фреймом сканирования, и современные контроллеры прокручивают его сотни раз в секунду: типичная частота опроса матрицы лежит в диапазоне от двухсот до тысячи герц, а у игровых моделей с частотой опроса USB в восемь тысяч герц сканирование идёт ещё быстрее, чтобы успеть собрать данные к каждому отчёту.

Именно матричная экономия порождает все дальнейшие проблемы. Контроллер видит не сами клавиши, а лишь факт замыкания между конкретной строкой и конкретным столбцом. Пока нажата одна клавиша, координаты однозначны. Пока нажаты две клавиши, тоже почти всегда всё понятно. Но начиная с трёх одновременных нажатий в определённых геометрических комбинациях у контроллера появляется фундаментальная неоднозначность, которую невозможно разрешить программно без дополнительных аппаратных мер.

Фантомные нажатия и эффект ghosting на прямоугольнике матрицы

Классическая демонстрация уязвимости матрицы выглядит так. Берутся три клавиши, стоящие в трёх углах воображаемого прямоугольника на матрице: например, пересечения строки один со столбцом один, строки один со столбцом два и строки два со столбцом один. Когда все три нажаты, току открывается обходной путь. Сканируя первый столбец, контроллер получает сигнал в первой строке через первую клавишу. Но тот же сигнал уходит дальше через замкнутый контакт второй клавиши во второй столбец, а оттуда через третью клавишу возвращается во вторую строку. В итоге контроллер видит замыкание между первым столбцом и второй строкой, хотя клавиша в этом четвёртом углу прямоугольника не нажата. Это и есть ghosting, фантомное нажатие призрачной клавиши.

С точки зрения контроллера фантом неотличим от реальности: на его ножках ровно та же электрическая картина, как если бы палец пользователя действительно давил на четвёртую клавишу. Прошивка не способна это исправить, потому что информация об истинном пути тока потеряна уже на уровне физики цепи. Производители дешёвых клавиатур выкручиваются иначе: прошивка отслеживает подозрительные комбинации, и если третья клавиша образует запрещённый прямоугольник с двумя уже нажатыми, контроллер просто блокирует все новые нажатия до освобождения части клавиш. Пользователь наблюдает это как «залипание» ввода: клавиша нажата, а символ не приходит. Такое поведение называется jamming, и оно задумано как защита от фантомов, хотя субъективно ощущается как неисправность.

Разводка матрицы при этом не случайна. Проектировщики недорогих клавиатур вручную распределяют клавиши по сетке так, чтобы типичные игровые комбинации не образовывали прямоугольников. Клавиши WASD стараются разнести по разным строкам, а пробел, Shift и Ctrl по возможности уводят в отдельные столбцы. Отсюда разнобой в характеристиках: одна бюджетная клавиатура честно держит шесть клавиш вокруг WASD и слепнет на цифровом блоке, другая наоборот. Заявления на коробке вроде «anti-ghosting для двадцати клавиш» означают лишь, что инженер проверил двадцать конкретных популярных сочетаний, а не что матрица защищена полностью.

Диод в каждой клавише и настоящий NKRO

Полное и электрически честное решение проблемы фантомов известно с семидесятых годов: последовательно с контактом каждой клавиши ставится диод. Диод пропускает ток только в одном направлении, поэтому сканирующий сигнал может пройти от столбца через нажатую клавишу в строку, но не может завернуть обратно через соседние замкнутые контакты. Обходной путь, порождавший призрачную клавишу, оказывается разорван, и каждая точка матрицы считывается абсолютно независимо от остальных. С диодной развязкой контроллер способен достоверно распознать хоть сто одновременных нажатий: электрический предел исчезает, и остаются только ограничения протокола передачи данных.

Цена вопроса объясняет, почему диоды есть не везде. Маломощный диод в корпусе SMD стоит доли цента, но клавиш на плате больше сотни, и к стоимости самих компонентов добавляется время монтажной линии, контроль пайки и место на плате. Навскидку полная диодная развязка обходится производителю в сумму порядка одного доллара на клавиатуру, а в нижнем ценовом сегменте, где вся электроника вместе с корпусом укладывается в несколько долларов, это заметная доля себестоимости. Поэтому мембранные клавиатуры массового сегмента выпускаются без диодов вообще, а в механике диоды появляются только начиная с определённой ценовой планки. Механические переключатели облегчают задачу конструктивно: диод припаивается прямо к ножкам каждого переключателя, и владельцы кастомных клавиатур нередко впаивают диоды самостоятельно при сборке на паяемой плате.

Альтернативный путь обходится без классической матрицы вовсе. Оптические переключатели прерывают луч инфракрасного света между излучателем и приёмником, а переключатели на эффекте Холла измеряют изменение магнитного поля от магнита на штоке клавиши. И в том и в другом случае каждый датчик можно подключить к мультиплексорам так, чтобы срабатывания считывались полностью независимо, без электрического контакта между клавишами и без риска обходных токов. Практически все клавиатуры на эффекте Холла и большинство оптических моделей заявляют полный NKRO уже на уровне схемотехники, а заодно получают настройку точки срабатывания, поскольку аналоговый датчик сообщает не факт замыкания, а глубину хода.

Шесть клавиш USB HID boot protocol и полный NKRO по отчётам

Даже идеальная матрица с диодами упирается во второй предел, программный: протокол, по которому клавиатура разговаривает с компьютером. Стандарт USB HID определяет так называемый boot protocol, упрощённый режим, который обязаны понимать даже примитивные загрузочные среды вроде BIOS и UEFI. Отчёт boot protocol имеет фиксированную длину восемь байт: один байт битовой маски модификаторов вроде Shift, Ctrl и Alt, один зарезервированный байт и шесть байт под коды обычных клавиш. Отсюда знаменитое ограничение 6KRO, шесть одновременных не-модификаторов плюс любые модификаторы. Многие механические клавиатуры в стандартном режиме работают именно так, и переключатель 6KRO/NKRO на корпусе как раз меняет формат отчёта.

Полный NKRO достигается через report protocol, в котором производитель описывает собственный формат отчёта с помощью HID report descriptor. Самый распространённый приём: вместо списка кодов клавиш передаётся битовая карта, где каждой из ста с лишним клавиш соответствует свой бит. Тринадцати-шестнадцати байт такого битмапа хватает, чтобы закодировать любую комбинацию нажатий одновременно. Операционная система с полноценным HID-стеком разбирает дескриптор и понимает нестандартный отчёт без проблем, тогда как старые загрузочные среды способны работать только с boot protocol, поэтому режим NKRO в BIOS некоторых плат может отображать лишь первые шесть клавиш. Известная заглушка при этом никуда не делась: если отчёт переполнен, клавиатура в boot-режиме шлёт код ошибки rollover во все шесть позиций, и в текстовом поле BIOS появляется мусор вместо символов.

Стопы сверху ставит и беспроводной канал. По Bluetooth классический HID over GATT исторически тоже ориентирован на шестиклавишный отчёт, поэтому беспроводные клавиатуры нередко заявляют NKRO только по проводу или через фирменный радиодонгл на два и четыре десятых гигагерца, где производитель волен формировать собственные пакеты. На практике геймеру достаточно честных десяти-двадцати одновременных нажатий: десять пальцев плюс пара модификаторов упрётся в любую реализацию выше этого порога, а сто восемь клавиш одновременно нажимают разве что ладонью по корпусу в тестах.

Bounce, время сканирования и чипы контроллеров

Электрическая сторона ввода не сводится к матрице. Когда контакты механического переключателя сходятся, они не замыкаются идеально мгновенно, а несколько миллисекунд дребезжат, порождая серию коротких импульсов вместо одного чистого фронта. Это явление называется bounce, или дребезг контактов. Если прошивка воспримет каждый импульс как отдельное нажатие, одно нажатие породит лес повторных символов. Контроллер поэтому применяет debounce: после первого зафиксированного изменения состояния он игнорирует сигнал клавиши заданное время, обычно от двух до пяти миллисекунд у качественных механических переключателей и до десяти миллисекунд у дешёвых мембран. Это время напрямую добавляется к задержке ввода, и в игровых прошивках его сокращают, балансируя на грани ложных срабатываний. Оптические и магнитные датчики дребезга не имеют в принципе, поэтому их задержка срабатывания ограничена только частотой сканирования и обработкой.

Сам скан цикл и передача отчёта тоже складываются в итоговую реакцию. При частоте опроса USB сто двадцать пять герц отчёт уходит раз в восемь миллисекунд, при тысяче герц раз в миллисекунду, а при восьми тысячах герц каждые сто двадцать пять микросекунд. Чтобы воспользоваться такой частотой, контроллеру нужно сканировать матрицу сопоставимо быстро, а это нагрузка на процессор и на спящие режимы энергосбережения, поэтому беспроводные модели редко выходят за тысячу герц.

Сердцем схемы служит микроконтроллер. В массовых механических клавиатурах встречаются 32-битные ARM-чипы семейств STM32 и GD32, недорогие ядра Cortex-M0, а в кастомном сегменте долгие годы правили 8-битные AVR ATmega32U4, ценимые за встроенный USB-стек, а теперь их вытесняет RP2040 с двумя ядрами Cortex-M0+. От ресурсов чипа зависят частота сканирования, объём прошивки, поддержка слоёв и макросов, а от прошивки, будь то QMK, ZMK или закрытый код вендора, зависит корректная реализация дескрипторов и поведение при переполнении отчёта. Прошивки QMK позволяют переключать режим NKRO горячей клавишей прямо на лету.

Диагональ бега, прыжок и перезарядка или как проверить свою клавиатуру

Практическая проверка не требует никаких инструментов. Классический сценарий из шутеров: зажать W и A для бега по диагонали, добавить Shift на ускорение, затем пробел на прыжок и R на перезарядку. Это пять одновременных клавиш, и на многих бюджетных моделях прыжок или перезарядка молча игнорируются. Если персонаж в игре перестаёт стрелять в прыжке или не меняет магазин на бегу, виновата вовсе не игра, а матрица. Второй быстрый тест: зажать обе руки ладонями на клавиатуре в обычном текстовом редакторе и посмотреть, сколько символов появилось в строке. Меньше шести означает ограничение boot protocol, ровно шесть намекает на 6KRO, а длинный ряд букв говорит о полноценном NKRO.

Для точной диагностики удобны онлайн-тестеры клавиатур, которые открываются в браузере и подсвечивают каждое зарегистрированное нажатие на схеме клавиатуры в реальном времени. Такие страницы получают события через веб-интерфейс событий клавиатуры и позволяют визуально увидеть и предел одновременных нажатий, и фантомные срабатывания, когда на схеме загорается клавиша, которой никто не касался. Важно учитывать один нюанс: браузер показывает лишь то, что дошло до операционной системы, поэтому фантом, отфильтрованный прошивкой через jamming, в тесте выглядит как отсутствующее нажатие. Для чистоты эксперимента стоит повторять тест и по проводу, и в беспроводном режиме, потому что у многих моделей пределы в этих режимах различаются, а также проверить клавиши в разных районах корпуса, чтобы нарисовать карту реальных, а не маркетинговых возможностей матрицы. Владельцам разъёмных кастомных плат остаётся самый надёжный критерий: посмотреть на плату и убедиться, что у каждого переключателя припаян собственный диод. Где диоды есть, ghosting исключён физически, и единственным потолком остаётся формат отчёта прошивки, который обычно переключается в полный NKRO одной комбинацией клавиш.