подключение PS2 клавиатуры

Luckoste
Offline
Зарегистрирован: 27.07.2019

Доброго времени суток, уважаемые форумчане.
Подключила клавиатуру PS2 к ардуино, загрузила библиотеку PS2Keyboard
Подскажите, пожалуйста, в скетче работают только  PS2_ENTER, PS2_DELETE, PS2_PAGEUP, PS2_PAGEDOWN.
PS2_HOME, PS2_END, PS2_INSERT не работают. В чем может быть причина?

#include <PS2Keyboard.h>
#include "Keyboard.h"


const int DataPin = 2;
const int IRQpin =  3;

PS2Keyboard keyboard;

void setup() {
  delay(1000);
  keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);  
}

void loop() {

  if (keyboard.available()) {

    // read the next key
    char c = keyboard.read();

    // check for some of the special keys
    if (c == PS2_ENTER) {

      Keyboard.write('E');
      delay(10);
      Keyboard.releaseAll();
    }

    if (c == PS2_PAGEUP) {

      Keyboard.write('U');
      delay(10);
      Keyboard.releaseAll();
    }

    if (c == PS2_PAGEDOWN) {

      Keyboard.write('P');
      delay(100);
      Keyboard.releaseAll();
    }
    
    if (c == PS2_HOME) {

      Keyboard.write('H');
      delay(100);
      Keyboard.releaseAll();
    }
    
    if (c == PS2_END) {

      Keyboard.write('G');
      delay(100);
      Keyboard.releaseAll();
    }
    
    if (c == PS2_INSERT) {

      Keyboard.write('T');
      delay(100);
      Keyboard.releaseAll();
    }
    
    if (c == PS2_DELETE) {

      Keyboard.write('D');
      delay(10);
      Keyboard.releaseAll();
    }

  }
}
asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Добавте в 22 строку 

Serial.println(c);

И посмотрите что вообще с клавиатуры приходит.

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam пишет:

Добавте в 22 строку 

Serial.println(c);

И посмотрите что вообще с клавиатуры приходит.

С Enter, Delete, PageUp, PageDown приходят значения E, D, U, P
С Insert, End, Home ничего не приходит, ардуино при их нажатии не моргает

Green
Offline
Зарегистрирован: 01.10.2015

Надеюсь клавиатурными светодиодами вам не надо играться?

Luckoste
Offline
Зарегистрирован: 27.07.2019

Green пишет:

Надеюсь клавиатурными светодиодами вам не надо играться?

Не надо

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Сделайте то что я сказал и сами увидете. По Еnter, например, должно будет печататься 13

Похоже PS2_HOME, PS2_END, PS2_INSERT не поддерживаются.

PS2Keyboard.h

#define PS2_INSERT			0
#define PS2_DELETE			127
#define PS2_HOME			0
#define PS2_END				0

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Смотрите файл PS2Keyboard.h. Там комментарий есть - часть "специальных" клавиш по умолчанию игнорируется. Их, я так понимаю, задать нужно.

Luckoste
Offline
Зарегистрирован: 27.07.2019

kalapanga пишет:

Смотрите файл PS2Keyboard.h. Там комментарий есть - часть "специальных" клавиш по умолчанию игнорируется. Их, я так понимаю, задать нужно.

Каким образом это можно сделать? Есть пример?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Luckoste пишет:

Каким образом это можно сделать? Есть пример?

 

Добавте в 22 строку 

Serial.println(c);

И посмотрите что вообще с клавиатуры приходит.

 

 

Сразу станет ясно какие коды генерируются для PS2_HOME, PS2_END, PS2_INSERT. И генерируются ли вообще.

 

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam пишет:

Luckoste пишет:

Каким образом это можно сделать? Есть пример?

 

Добавте в 22 строку 

Serial.println(c);

И посмотрите что вообще с клавиатуры приходит.

 

 

Сразу станет ясно какие коды генерируются для PS2_HOME, PS2_END, PS2_INSERT. И генерируются ли вообще.

 

Не генерируются

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Serial.println(c);

В 22 строчку добавили?

Luckoste
Offline
Зарегистрирован: 27.07.2019

Luckoste пишет:

asam пишет:

Добавте в 22 строку 

Serial.println(c);

И посмотрите что вообще с клавиатуры приходит.

С Enter, Delete, PageUp, PageDown приходят значения E, D, U, P
С Insert, End, Home ничего не приходит, ардуино при их нажатии не моргает

Добавила, они как-будто отключены

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Посмотрел код  библиотеки. Надо просто в PS2Keyboard.h прописать для этих клавишь значения отличные от 0. В принципе любые, главное что бы с другими клавишами не совпадали.

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam пишет:

Посмотрел код  библиотеки. Надо просто в PS2Keyboard.h прописать для этих клавишь значения отличные от 0. В принципе любые, главное что бы с другими клавишами не совпадали.

asam, подскажите, пожалуйста, как редактировать файл PSKeyboard.h?  В какой программе?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Luckoste пишет:

asam, подскажите, пожалуйста, как редактировать файл PSKeyboard.h?  В какой программе?

Это просто текстовый файл и его можно редактировать в любом текстовом редакторе. Хоть в ардуино IDE, хоть в notepad/wordpad/word etc.

Luckoste
Offline
Зарегистрирован: 27.07.2019

kalapanga, asam, большое спасибо. Отредактировала PS2_INSERT, PS2_END, PS2_HOME, PS2_SCROLL. Коды подключились, работают. Но не нашла где в файле PSKeyboard.h кнопки PrtSc, PauseBreak, NumLock. Подскажите пожалуйста, где их найти и подключить.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Надо лезть в PS2Keyboard.cpp и редактировать PS2Keymap_US.

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam пишет:

Надо лезть в PS2Keyboard.cpp и редактировать PS2Keymap_US.

Залезла в этот файл, пыталась разными способами NumLock подключить, не получилось(

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Luckoste пишет:

Залезла в этот файл, пыталась разными способами NumLock подключить, не получилось(

Какими именно? 

По идее достаточно в PS2Keymap_US заменить 0 на желаемый код слева от /*NumLock*/

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam пишет:

Luckoste пишет:

Залезла в этот файл, пыталась разными способами NumLock подключить, не получилось(

Какими именно? 

По идее достаточно в PS2Keymap_US заменить 0 на желаемый код слева от /*NumLock*/

asam, так нужно сделать везде, где встречается /*Numlock*/ в этом файле?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Достаточно только в той раскладке что вы пользуйтесь. Если при begin раскладка не указывается, то по умолчанию используется PS2Keymap_US

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam пишет:

Достаточно только в той раскладке что вы пользуйтесь. Если при begin раскладка не указывается, то по умолчанию используется PS2Keymap_US

asam, большое спасибо Вам! Получилось подключить и NumLock. Осталась последняя кнопка Print_Screen. Не нахожу ее в файлах PS2Keyboard.h, PS2Keyboard.cpp

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

В PS2Keyboard.cpp находишь функцию static char get_iso8859_code(void). После строки if (!s) return 0; добавляешь Serial.println(s);

Жмешь на клаве Print_Screen и смотришь в сериал мониторе какому числу это соответсвует. Это число будет номером позиции кода Print_Screen в таблице PS2Keymap_US. Вставляешь в ту позицию (там должен быть сейчас 0) тот код который ты хочешь что бы возвращался при нажатии Print_Screen. Учти что нумерация в таблице начинается с 0. Не забудь потом удалить Serial.println(s);

 

Green
Offline
Зарегистрирован: 01.10.2015

Всё становится веселее, когда ещё нужно зажигать индикаторы - NUM, CAPS, SCROLL. А без этого как то несерьёзно.)

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam пишет:

В PS2Keyboard.cpp находишь функцию static char get_iso8859_code(void). После строки if (!s) return 0; добавляешь Serial.println(s);

Жмешь на клаве Print_Screen и смотришь в сериал мониторе какому числу это соответсвует. Это число будет номером позиции кода Print_Screen в таблице PS2Keymap_US. Вставляешь в ту позицию (там должен быть сейчас 0) тот код который ты хочешь что бы возвращался при нажатии Print_Screen. Учти что нумерация в таблице начинается с 0. Не забудь потом удалить Serial.println(s);

 

Все так сделала. В сериал мониторе при нажатии Print_Screen выводит:

224
18
224
124
224
240
124
224
240
18
 

Получается 224 позиция?

А в таблице PS2Keymap_US всего 131 позиция...

 

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam, подскажите, пожалуйста, как включить PS2_PRNT_SCRN

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Попробуй так:

В PS2Keyboard.h добавь

#define PS2_PRNT_SCRN 14

В PS2Keyboard.cpp  после

case 0x74: c = PS2_RIGHTARROW; break;

добавь

case 0x7С: c = PS2_PRNT_SCRN; break;

Luckoste
Offline
Зарегистрирован: 27.07.2019

asam, спасибо Вам огромное! Все работает)

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

На здоровье! :)

lexeyka
Offline
Зарегистрирован: 24.09.2019

Luckoste, подскажите, какие строки Вы прописали в файлах PS2Keyboard.h и PS2Keyboard.cpp, чтобы заработал NumLock. Будьте так добры!

В коде Ардуино пишу:

    if (c == PS2_NUMLOCK) {

      Keyboard.write('N');
      delay(10);
      Keyboard.releaseAll();
    }

В PS2Keyboard.h добавил:

#define PS2_NUMLOCK     144

В PS2Keyboard.cpp, в массиве PS2Keymap_US:

, 144 /*NumLock*/,

 

Что делаю не так?

Luckoste
Offline
Зарегистрирован: 27.07.2019

lexeyka пишет:

Luckoste, подскажите, какие строки Вы прописали в файлах PS2Keyboard.h и PS2Keyboard.cpp, чтобы заработал NumLock. Будьте так добры!

В коде Ардуино пишу:

    if (c == PS2_NUMLOCK) {

      Keyboard.write('N');
      delay(10);
      Keyboard.releaseAll();
    }

В PS2Keyboard.h добавил:

#define PS2_NUMLOCK     144

В PS2Keyboard.cpp, в массиве PS2Keymap_US:

, 144 /*NumLock*/,

 

Что делаю не так?

Попробуйте в PS2Keyboard.h добавить:

#define PS2_NUMLOCK 8 

Проверьте в текстовом редакторе CTRL+F не используется ли у вас значение 8 для другой клавиши.

В PS2Keyboard.cpp в PS2Keymap_US добавить:

, 8 /*NUMLOCK*/ ,

Более точно смогу ответить 3.10, как доберусь до компа:)

lexeyka
Offline
Зарегистрирован: 24.09.2019

Luckoste, большое спасибо, всё получилось. Взял только не 8, а 12 (8 была уже занята)

Luckoste
Offline
Зарегистрирован: 27.07.2019

Уважаемый asam и знатоки подключения клавиатур! Может Вы поможете в моем вопросе? Заранее благодарю.

http://arduino.ru/forum/apparatnye-voprosy/podklyuchenie-usb-klaviatury-kak-ps2-ustroistva