Как же надоело это вечное переключение раскладки. Если с буквами всё более менее просто и понятно, то ввести знаки препинания становиться непросто. То попадаешь на точку, когда хочешь ввести запятую. Или хочешь ввести точку с запятой, а там опять подстава. К концу рабочего дня накал страстей уже такой, что не приведи господи.
И вот с недавнего времени я начал задумываться о том, что надо как-то это решить, дальше так жить нельзя.
Недавно как раз освоил 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 откорректировать функции кнопок.