Arduino:Библиотеки/PS2Keyboard

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Библиотека PS2Keyboard[1][2]

Библиотека PS2Keyboard позволяет использовать клавиатуру для ввода пользовательских данных. Интерфейс для клавиатур типа PS2 создается очень просто – нужно лишь 5-вольтовое питание и 2 сигнала: тактовый и для передачи данных. Реагирование на пользовательский ввод осуществляется при помощи одного из доступных прерываний. Полученные данные сохраняются в однобайтный буфер, после чего становятся доступными для считывания.

Последнюю версию библиотеки можно загрузить отсюда.

Подключение

Ps2keyboard schematic.png

Убедитесь, что контакт для тактового сигнала (Clock PIN) подключен к 3-ему цифровому контакту на Arduino. В противном случае не будет работать прерывание, а вместе с ними и вся библиотека.

Сигнал для передачи данных можно подключить к любому контакту, однако не стоит использовать контакт со светодиодом, подключенным к «земле», поскольку ток светодиода будет мешать сигналу для передачи данных.

Функции

  • PS2Keyboard keyboard
    
    Создает объект PS2Keyboard. Хотя вы можете создать несколько объектов, эта библиотека поддерживает использование лишь одной клавиатуры.
  • keyboard.begin(DataPin, IRQpin)
    
    Начинает принимать нажатия на клавиши. DataPin и IRQpin – это номера контактов, к которым подключаются сигнал для передачи данных и тактовый сигнал.
  • keyboard.available()
    
    Проверяет, было ли получено нажатие на клавишу. Возвращает true, если было получено хотя бы одно.
  • keyboard.read()
    
    Считывает следующее нажатие на клавишу. Если нажатий на клавишу получено не было, возвращает «-1». Нажатия на клавиши возвращаются в виде ASCII-символов. Специальные клавиши привязаны к контрольным символам.

Использование

Код ниже демонстрирует, как использовать библиотеку. Другие константы для клавиш смотрите в файле PS2Keyboard.h.

 1 #include <PS2Keyboard.h>
 2 
 3 #define DATA_PIN 4
 4 PS2Keyboard keyboard;
 5 
 6 void setup() {
 7   keyboard.begin(DATA_PIN);
 8 
 9   Serial.begin(9600);
10   Serial.println("hi");
11   delay(1000);
12 }
13 
14 void loop() {
15   if(keyboard.available()) {
16     byte dat = keyboard.read();
17     byte val = dat - '0';
18 
19     if(val >= 0 && val <= 9) {
20       Serial.print(val, DEC);
21     } else if(dat == PS2_KC_ENTER) {
22       Serial.println();
23     } else if(dat == PS2_KC_ESC) {
24       Serial.println("[ESC]");
25     } 
26   }
27 }

Распиновка коннектора PS2

Td libs PS2Keyboard pins.jpg

Неамериканские раскладки

Функция read() возвращает ASCII-код – значение, преобразованное из необработанного скан-кода клавиши. Это преобразование осуществляется при помощи двух массивов в PS2Keyboard.cpp, называющихся scan2ascii_noshift и scan2ascii_shift.

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

Специальные клавиши

У многих клавиатур типа PS2 есть множество специальных клавиш, не привязанных к символам ASCII. По умолчанию некоторые из них привязаны к контрольным символам ASCII – к тем, что имеют похожие функции. Все остальные не работают вовсе, но их можно привязать к любому байту при помощи редактирования PS2Keyboard.h.

 1 // при каждом нажатии на клавиши осуществляется вызов функции read(), 
 2 // возвращающей байт, который соответствует этой клавише; строчки ниже 
 3 // задают, какой именно байт будет возвращаться для каждой 
 4 // «специальной» клавиши; чтобы проигнорировать клавишу, 
 5 // используйте значение «0»: 
 6 #define PS2_TAB         9
 7 #define PS2_ENTER       13
 8 #define PS2_BACKSPACE   127
 9 #define PS2_ESC         27
10 #define PS2_INSERT      0
11 #define PS2_DELETE      127
12 #define PS2_HOME        0
13 #define PS2_END         0
14 #define PS2_PAGEUP      25
15 #define PS2_PAGEDOWN    26
16 #define PS2_UPARROW     11
17 #define PS2_LEFTARROW   8
18 #define PS2_DOWNARROW   10
19 #define PS2_RIGHTARROW  21
20 #define PS2_F1          0
21 #define PS2_F2          0
22 #define PS2_F3          0
23 #define PS2_F4          0
24 #define PS2_F5          0
25 #define PS2_F6          0
26 #define PS2_F7          0
27 #define PS2_F8          0
28 #define PS2_F9          0
29 #define PS2_F10         0
30 #define PS2_F11         0
31 #define PS2_F12         0
32 #define PS2_SCROLL      0

Версии

Версия 2.4

Поддержка Teensy 3.0, Arduino Due, Arduino Leonardo и других плат.

Французская клавиатурная раскладка – благодарность Дэвиду Чочо (David Chochoi).

Версия 2.3

Исправлено несколько небольших багов.

Версия 2.2

Добавлена поддержка неамериканских клавиатур. На данный момент поддерживается только немецкая клавиатура (пока) – спасибо Райнеру Бруху (Rainer Bruch), приславшему немецкую клавиатуру для тестирования!

Смотрите пример в Файл > Примеры > PS2Keyboard > International (File > Examples > PS2Keyboard > International).

Версия 2.1

Добавлены следующие улучшения:

  • Таймаут для повторной синхронизации. При рассинхронизации прерывания запускается таймаут продолжительностью 0,25 секунды, после которого автоматически запускается повторная синхронизация. Это должно повысить надежность системы, если условия ее работы далеки от идеальных.
  • Совместимость с новыми версиями Arduino. В последнюю версию Arduino (которая в конце концов стала версией 1.0) были внесены изменения, из-за которых она потеряла совместимость с библиотекой PS2Keyboard. Теперь это исправлено.

Версия 2.0

Добавлены следующие улучшения:

  • Буфферизация скан-кода. Данные, собранные прерыванием, сохраняются в кольцевой буфер. То есть если ваш скетч занят чем-то другим, данные о нескольких нажатых клавишах могут быть сохранены в буфер, что избавляет от необходимости каждый раз вызывать функцию read(). Буфферизация также поддерживает события для отпускания клавиш. Предыдущие версии могли буфферизировать только один скан-код и отклоняли все коды отпускания клавиш.
  • Поддержка функционала клавиш  ⇧ Shift . Теперь библиотека умеет отслеживать состояния обеих клавиш  ⇧ Shift , так что преобразование в формат ASCII теперь генерирует корректные заглавные и прописные символы. Цифры и другие клавиши с несколькими символами теперь тоже корректно реагируют на  ⇧ Shift . Предыдущие версии были ограничены только заглавными буквами и вообще не поддерживали использование  ⇧ Shift .
  • Вывод только символов формата ASCII. Функция read() возвращает только символы формата ASCII или специальные символы, привязанные к контрольным символам ASCII. В предыдущих версиях возвращалась смесь из ASCII и необработанных скан-кодов, причем отличить одни от других было нельзя.
  • Эффективная конверсия. Медленный линейный алгоритм поиска уступил место более быстрой таблице поиска.
  • Поддержка нескольких плат. Добавлена поддержка контактов прерывания для Arduino Mega, Teensy и Sanguino. Также есть возможность без труда добавить другие платы, более того – эти платы могут работать автоматически (безо всяких дополнительных настроек), если их файлы ядра способны определять некоторые псевдонимы, имеющиеся в библиотеке PS2Keyboard.

Баги

Ошибка Missing 'byte' declaration. Можно исправить, добавив следующее:

1 #include "binary.h"
2 typedef uint8_t boolean;
3 typedef uint8_t byte;
4 Ошибка WProgram.h : No such file or directory. Можно исправить, поменяв #include "WProgram.h" в PS2Keyboard.cpp на #include "Arduino.h".

Библиотека PS2Keyboard

См.также

Внешние ссылки