Arduino:Библиотеки/PS2Keyboard: различия между версиями
Нет описания правки |
Нет описания правки |
||
Строка 164: | Строка 164: | ||
<references /> | <references /> | ||
[[Категория:Функция]] | [[Категория:Функция]] | ||
[[Категория:Библиотека PS2Keyboard]] | [[Категория:Библиотека PS2Keyboard]] | ||
[[Категория:PS2Keyboard]] | [[Категория:PS2Keyboard]] |
Версия от 11:14, 8 июля 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Библиотека PS2Keyboard[1][2]
Библиотека PS2Keyboard позволяет использовать клавиатуру для ввода пользовательских данных. Интерфейс для клавиатур типа PS2 создается очень просто – нужно лишь 5-вольтовое питание и 2 сигнала: тактовый и для передачи данных. Реагирование на пользовательский ввод осуществляется при помощи одного из доступных прерываний. Полученные данные сохраняются в однобайтный буфер, после чего становятся доступными для считывания.
Последнюю версию библиотеки можно загрузить отсюда.
Подключение
Убедитесь, что контакт для тактового сигнала (Clock PIN) подключен к 3-ему цифровому контакту на Arduino. В противном случае не будет работать прерывание, а вместе с ними и вся библиотека.
Сигнал для передачи данных можно подключить к любому контакту, однако не стоит использовать контакт со светодиодом, подключенным к «земле», поскольку ток светодиода будет мешать сигналу для передачи данных.
Функции
- Создает объект PS2Keyboard. Хотя вы можете создать несколько объектов, эта библиотека поддерживает использование лишь одной клавиатуры.
PS2Keyboard keyboard
- Начинает принимать нажатия на клавиши. DataPin и IRQpin – это номера контактов, к которым подключаются сигнал для передачи данных и тактовый сигнал.
keyboard.begin(DataPin, IRQpin)
- Проверяет, было ли получено нажатие на клавишу. Возвращает true, если было получено хотя бы одно.
keyboard.available()
- Считывает следующее нажатие на клавишу. Если нажатий на клавишу получено не было, возвращает «-1». Нажатия на клавиши возвращаются в виде ASCII-символов. Специальные клавиши привязаны к контрольным символам.
keyboard.read()
Использование
Код ниже демонстрирует, как использовать библиотеку. Другие константы для клавиш смотрите в файле 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
- PS2Keyboard International - Работа с разными клавиатурными раскладками
- PS2Keyboard Simple Test - Отображение символов, введенных на клавиатуре