Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Ambox content.png Черновик


Библиотека 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

См.также

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

  1. playground.arduino.cc - PS2Keyboard
  2. pjrc.com - td_libs_PS2Keyboard