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

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

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



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

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

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

Подключение

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

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

Функции

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

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

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

#include <PS2Keyboard.h>

#define DATA_PIN 4
PS2Keyboard keyboard;

void setup() {
  keyboard.begin(DATA_PIN);

  Serial.begin(9600);
  Serial.println("hi");
  delay(1000);
}

void loop() {
  if(keyboard.available()) {
    byte dat = keyboard.read();
    byte val = dat - '0';

    if(val >= 0 && val <= 9) {
      Serial.print(val, DEC);
    } else if(dat == PS2_KC_ENTER) {
      Serial.println();
    } else if(dat == PS2_KC_ESC) {
      Serial.println("[ESC]");
    } 
  }
}

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

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

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

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

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

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

// при каждом нажатии на клавиши осуществляется вызов функции read(), 
// возвращающей байт, который соответствует этой клавише; строчки ниже 
// задают, какой именно байт будет возвращаться для каждой 
// «специальной» клавиши; чтобы проигнорировать клавишу, 
// используйте значение «0»: 
#define PS2_TAB         9
#define PS2_ENTER       13
#define PS2_BACKSPACE   127
#define PS2_ESC         27
#define PS2_INSERT      0
#define PS2_DELETE      127
#define PS2_HOME        0
#define PS2_END         0
#define PS2_PAGEUP      25
#define PS2_PAGEDOWN    26
#define PS2_UPARROW     11
#define PS2_LEFTARROW   8
#define PS2_DOWNARROW   10
#define PS2_RIGHTARROW  21
#define PS2_F1          0
#define PS2_F2          0
#define PS2_F3          0
#define PS2_F4          0
#define PS2_F5          0
#define PS2_F6          0
#define PS2_F7          0
#define PS2_F8          0
#define PS2_F9          0
#define PS2_F10         0
#define PS2_F11         0
#define PS2_F12         0
#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. Можно исправить, добавив следующее:

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

Библиотека PS2Keyboard

См.также

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