Как же надоело это вечное переключение раскладки. Если с буквами всё более менее просто и понятно, то ввести знаки препинания становиться непросто. То попадаешь на точку, когда хочешь ввести запятую. Или хочешь ввести точку с запятой, а там опять подстава. К концу рабочего дня накал страстей уже такой, что не приведи господи.
И вот с недавнего времени я начал задумываться о том, что надо как-то это решить, дальше так жить нельзя.
Недавно как раз освоил Arduino Pro Micro в роли клавиатуры и решил сделать мини клавиатуру, которая будет посылать только нужную команду независимо от раскладки.
От старого факсимильного аппарата взял кнопочки с лицевой панели, гетинаксовую макетную плату и распределительную коробку 75х75х20.
Одним из положительных качеств термоклея является плохое скольжение по поверхности стола и других глянцевых поверхностей, поэтому я из него сделал ножки — выдавил 4 большие капли клея, а затем поставил на плёнку растеленную на столе. После того как клей застыл между плёнкой и ножкой капнул микрокаплю спирта и плёнка легко отслаивается от ножки.
Кнопки включены по простейшей схеме между ножкой ардуино и общим проводом. Выводы подтянуты к + питания внутренними резисторами.
Как оказалось клавиатура посылает ASCII символы, а операционная система трактует по своему в зависимости от включенной раскладки.
Поэтому в Windows нужно принудительно включить английскую раскладку, ввести требуемый символ, а затем включить обратно русскую раскладку.
В Windows можно сделать так:
Соответственно код будет выглядеть так:
#include "Keyboard.h" #define button1 2 #define button2 3 #define button3 4 #define button4 5 #define button5 6 #define button6 7 #define button7 15 #define button8 14 #define button9 16 const unsigned int DelayTimeRepeatPressing = 300; const unsigned int Delay = 20; void setup() { pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(14, INPUT_PULLUP); pinMode(15, INPUT_PULLUP); pinMode(16, INPUT_PULLUP); Keyboard.begin(); } void loop() { if (digitalRead(button1) == LOW) {// button1, тчк Keyboard.press(KEY_LEFT_CTRL);// зажимаем LEFT_CTRL delay(Delay); // делаем задержку, а то в некоторых приложениях не срабатывает комбинация клавиш Keyboard.press(0x30); // зажимаем кнопку "0" Keyboard.releaseAll(); // отпускаем все кнопки Keyboard.write(0x2e); // посылаем символ Keyboard.press(KEY_LEFT_CTRL);// зажимаем LEFT_CTRL delay(Delay); // делаем задержку, а то в некоторых приложениях не срабатывает комбинация клавиш Keyboard.press(0x31); // посылаем символ Keyboard.releaseAll(); // отпускаем все кнопки delay(DelayTimeRepeatPressing);// делаем задержку } if (digitalRead(button2) == LOW) { // button2, зпт Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x30); Keyboard.releaseAll(); Keyboard.write(0x2c); Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x31); Keyboard.releaseAll(); delay(DelayTimeRepeatPressing); } if (digitalRead(button3) == LOW) { // button3, двойные кавычки Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x30); Keyboard.releaseAll(); Keyboard.write(0x22); Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x31); Keyboard.releaseAll(); delay(DelayTimeRepeatPressing); } if (digitalRead(button4) == LOW) { // button4, двоеточие Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x30); Keyboard.releaseAll(); Keyboard.write(0x3a); Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x31); Keyboard.releaseAll(); delay(DelayTimeRepeatPressing); } if (digitalRead(button5) == LOW) { // button5, точка с запятой Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x30); Keyboard.releaseAll(); Keyboard.write(0x3b); Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x31); Keyboard.releaseAll(); delay(DelayTimeRepeatPressing); } if (digitalRead(button6) == LOW) { // button6, логическое "или" Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x30); Keyboard.releaseAll(); Keyboard.write(0x7c); Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x31); Keyboard.releaseAll(); delay(DelayTimeRepeatPressing); } if (digitalRead(button7) == LOW) { // button7, конструкция "//" Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x30); Keyboard.releaseAll(); Keyboard.write(0x2f); Keyboard.write(0x2f); Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x31); Keyboard.releaseAll(); delay(DelayTimeRepeatPressing); } if (digitalRead(button8) == LOW) { // button8, конструкция "/*" Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x30); Keyboard.releaseAll(); Keyboard.write(0x2f); Keyboard.write(0x2a); Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x31); Keyboard.releaseAll(); delay(DelayTimeRepeatPressing); } if (digitalRead(button9) == LOW) { // button9, конструкция "*/" Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x30); Keyboard.releaseAll(); Keyboard.write(0x2a); Keyboard.write(0x2f); Keyboard.press(KEY_LEFT_CTRL); delay(Delay); Keyboard.press(0x31); Keyboard.releaseAll(); delay(DelayTimeRepeatPressing); } }
Теперь можно расположить мини клаву около основной и тыкать на нужный символ не думая о текущей раскладке.
Таким образом можно подавать любой ASCII символ в HEX виде
При необходимости можно по месту в Arduino IDE откорректировать функции кнопок.