Digg StumbleUpon LinkedIn YouTube Flickr Facebook Twitter RSS Reset

Мини клавиатура

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

И вот с недавнего времени я начал задумываться о том, что надо как-то это решить, дальше так жить нельзя.

Недавно как раз освоил 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 откорректировать функции кнопок.