Keyboard.print() пропускает клавиши

Я играю с командой Arduino Leonardo Keyboard.print(), но столкнулся с неприятной проблемой:

Когда я напечатаю двойную кавычку, она не появится, а также заставит исчезнуть следующий символ (т.е.):

Keyboard.print("echo \"This is a demo\"");

Вывод:

echo his is a demo

И когда я использую эту строку:

Keyboard.print("echo -This is \"a demo-");

Вывод (обратите внимание на умлаут над a вместо получения "a):

echo 'This is ä demo'

Я подозреваю, что проблема в том, что мой компьютер настроен на использование испанской раскладки.

Какой файл исходного кода я могу изменить, чтобы исправить это? Я не могу найти определения, используемые Keyboard.print()

, 👍3


2 ответа


Лучший ответ:

1

В вашем конкретном случае необходимо ввести двойную кавычку (используя Испанская раскладка клавиатуры) с помощью Shift + физическая клавиша 2. На американской клавиатуре Shift + физическая клавиша с надписью 2 равно "@".

Таким образом, это просто даст желаемый результат (библиотека Arduino предполагает раскладку клавиатуры США):

Keyboard.print("echo @This is a demo@");

Более общее решение

В более общем случае строки можно закодировать, как показано в следующей таблице (точное сопоставление зависит от конкретной раскладки клавиатуры — это будет работать для многих европейских раскладок клавиатуры).

Если физический ключ (и ключ-модификатор, если он есть) существует в клавиатура США, чтобы ввести символ с использованием неамериканской раскладки клавиатуры, тогда этот метод работает нормально.

To get   Use   Notes
--------------------------------------------
;        <     Will result in Shift action
:        >     Will result in Shift action
(        *     Will result in Shift action
)        (     Will result in Shift action
/        &     Will result in Shift action
?        _     Will result in Shift action
=        )     Will result in Shift action
&        ^     Will result in Shift action

-        /
+        -
_        ?

"        @     Will result in Shift action

,        ,     The same
.        .     The same
#        #     The same

Еще более общее решение

Более того, некоторые клавиши отсутствуют на американской клавиатуре (например, 102-я клавиша на европейских клавиатурах для оригинальных клавиатур ПК, часто с <, >, \ и |), и не возможно использовать Keyboard.print().

Вместо этого используйте низкоуровневую функцию HID().SendReport() с код 100 (десятичный) для первого параметра для 102-го ключа. См. исходный код библиотеки, Keyboard.cpp (/libraries/Keyboard/src/Keyboard.cpp), чтобы узнать, как использовать HID().SendReport().

Альтернативное решение

Некоторые операционные системы позволяют вводить символы с помощью клавиатуры и цифрового кода.

Это происходит за счет того, что он становится зависимым от операционной системы (но делает его независимым от активной раскладки клавиатуры).

Например, Ctrl + Shift + U в Linux (только графический интерфейс, зависит от оконного менеджера(?)). Для конкретной проблемы (кодовая точка Unicode для " равна 0022) без какой-либо функциональной абстракции для уменьшения избыточности:

Keyboard.print("echo ");

Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press('u');
Keyboard.releaseAll();
Keyboard.print("0022");
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();

Keyboard.print("This is a demo");

Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press('u');
Keyboard.releaseAll();
Keyboard.print("0022");
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();

Коды Unicode можно найти на unicode-table.com.

Ключи мультимедиа

Несмотря на то, что мультимедийные ключи перечислены в таблице ( например, код 128 для «Увеличения громкости» на стр. 53), они не работают при использовании метода, описанного в предыдущем разделе. Но есть решение.

Платформа

Это было протестировано с:

  • Ардуино Леонардо
  • Раскладка испанской клавиатуры была добавлена в настройки Linux и активирована. На выбор было 14 разных, но я использовал тот, который помечен как «испанский». Было проверено, что "@" на самом деле приводит к выводу """. Также было проверено, что Ctrl + Shift + U сработал.
  • Linux, Ubuntu 19.10 (Eoan Ermine), но с глючный GNOME заменен на Cinnamon.
  • Arduino Leonardo подключен к сверхтоковому порту D- Link USB-концентратор (необходим, по неизвестным причинам - вероятно, локальная проблема)
  • IDE для Arduino версии 1.18.10
,

Я знаю это, потому что я реализовал это для макро-клавиатуры, где раскладка клавиатуры (обычно) датская в операционной системе (Windows или Linux)., @Peter Mortensen

Отличный ответ!, @0x2b3bfa0

(Код 128 для «Увеличения громкости» находится на странице 56, а не 53.), @Peter Mortensen

(Для будущего обновления: первая ссылка на самом деле не показывает, что двойная кавычка будет введена с помощью Shift + 2. Ее следует заменить чем-то получше. Например, [эта](https://en.wikipedia. org/wiki/List_of_QWERTY_keyboard_language_variants#Spanish).), @Peter Mortensen

(Для будущего обновления: и «#», и «?» также приведут к действию Shift (Shift + 3 и «/» соответственно). Также рассмотрите возможность использования таблиц Markdown, если они доступны. *102-й* → *102-й* ( ?)), @Peter Mortensen

(Для будущего обновления: ведущие нули в «0022» могут не потребоваться. В GNOME это не было необходимо.), @Peter Mortensen

(Для будущего обновления: для ввода кода Unicode: вместо Return в конце, альтернатива — удерживать нажатыми Ctrl и Shift (отпустив их в конце)), @Peter Mortensen


5

Для Arduino используется раскладка клавиатуры США. Дело в том, что клавиатуры на самом деле не посылают буквы или символы, напечатанные на клавишах. Вместо этого отправьте код сканирования, который определяет, где на клавиатуре находится клавиша. Затем компьютер должен преобразовать эти скан-коды в настоящие буквы и символы, что выполняется с помощью сопоставления клавиатуры, выбранного в операционной системе.

Некоторые специальные ключи называются мертвыми ключами. На самом деле они не печатают символ сами по себе — вместо этого они используются для изменения следующей нажатой клавиши — например, клавиша, которая занимает место «a» на американской клавиатуре, на испанской клавиатуре — мертвая клавиша, которая изменяет следующую клавишу, добавляя к ней умляут.

Поскольку Arduino не знает, что у вас есть испанское сопоставление, когда вы отправляете ", он просто отправляет то, что, по его мнению, является расположением этого символа на клавиатуре, и, конечно, он ошибается, поскольку предполагает неправильное раскладка клавиатуры.

Итак, есть две вещи, которые вы можете сделать, чтобы "исправить" это:

  1. Измените раскладку клавиатуры на американскую, но это будет означать, что ваша обычная клавиатура перестанет работать должным образом.
  2. Изменить то, как Arduino воспринимает раскладку клавиатуры, но это означает много работы, чтобы найти правильные скан-коды.

Раскладка клавиатуры Arduino хранится в файле HID.cpp в ядре Arduino (hardware\avr\cores\arduino или где-то в этом роде - я забыл навскидку ) и представляет собой массив _asciimap. Это список первых 128 символов ASCII и сопоставления скан-кодов клавиатуры для них, включая клавиши-модификаторы, такие как Shift. Вам нужно будет найти коды сканирования для клавиш, которые вы хотите сопоставить с раскладкой клавиатуры, и изменить коды в этом списке. Например, символ " указан как:

0x34|SHIFT,    // "

Это код сканирования 0x34 (десятичное число 52) в сочетании с модификатором SHIFT. Вам нужно будет выяснить (возможно, Google может помочь), на что следует изменить 0x34, чтобы он перемещал " туда, где он находится на испанской клавиатуре.

,

+35: Большое спасибо! Когда я найду точное местоположение файла, я скажу вам это!, @0x2b3bfa0

На моем компьютере находится в /usr/share/arduino/hardware/arduino/cores/arduino/HID.cpp. Я попытаюсь переопределить эти сопоставления некоторыми пользовательскими., @0x2b3bfa0