Программирование BASCOM
Меню сайта
Категории каталога
Мои статьи [115]
Наш опрос
Оцените мой сайт
Всего ответов: 1297
Главная » Статьи » Мои статьи

Атомная клавиатура виндуксоида (HID USB)
Кто не знает этого воистину целительного сочетания клавиш - CTRL+ALT+DEL? 
А попробуйте ка нажать их одной рукой! То-то, тут без распальцовки никак не обойтись! Не вдаваясь в историю проектирования клавиатуры, формата пальцев разработчика и выбора данной комбинации, очень популярной, кстати говоря, в народе, можно смело утверждать - нужно тренировать пальцы или включать мозги! С пальцами у автора напряженка - не музыкальные они, больше с паяльником... А вот со второй частью вроде всё в порядке. Идеей послужила вот эта клавиатура неизвестного ценителя постмодернистского искусства реинкарнации винды а ля "оживим покойничка":



Но она только для очень "продвинутых" пользователей. Нам бы, простым программистам, что нибудь попроще, не такое замысловатое. Например, такую клавиатуру, которая будет по нажатию на определённую клавишу отдавать системе целую комбинацию не только стандартных сочетаний, но и своих, заранее определённых. Ну например, стандартный кусок часто повторяющегося в разных проектах кода, целые макросы для управления системой, шаблоны писем с приветствием и подписью. Да мало ли чего ещё может понадобиться! Кто-то скажет - а зачем это всё нужно, бери копируй и вставляй или на клавиатуре пальчиками долби... Может для кого то это и так, а для меня - разработать железо, написать ПО, разобраться в проблеме и воплотить это в реальную конструкцию - часть моей жизни. Моё хобби. Моя работа. Мой отдых. Мой сон. Мои планы. Поддержка моей семьи и коллег. Игрушка конечно, но это ещё один шаг к вершинам мастерства :))

Схема стандартная для подключения подобного рода устройств, собранных на софтовой реализации USB.



У меня завалялась клавиатура от старого кассового аппарата размерностью 5х7, вот её я и решил приспособить для своих нужд. 



Вы можете использовать свою другой размерности (даже больше -осталось ещё 2 свободных пина), придется только немного переделать функцию опроса клавиш. Можете подключить полноценную PS/2 клавиатуру или клавиатуру от вашего любимого древнего ПК, с которого начинали свой путь. Или поставить всего лишь несколько одиночных клавиш. Или вообще без клавиш - подарок другу на 1 апреля smile - с генерацией случайных символов через случайный промежуток времени, смену регистра, подачу команд. Только потом, когда убедитесь, что друг уже "очень доволен", не забудьте вернуть девайс туда, куда ему и положено - в дальний ящик стола до следующего праздника.

Итак, в результате экспериментов получилось устройство - HID клавиатура, первые 33 клавиши которой передают в компьютер символы клавиш от "а" в английской раскладке до цифры "7" или соответствующие русские символы - от "ф". 34 клавиша - такие вожделенные для нас CTRL+ALT+DEL! 35 клавиша - передаёт "Qwerty! ". Ну а дальше ориентируйтесь на код, изменяйте свои сочетания клавиш, программируйте целые фразы. Прошу только об одном - не делайте "клавиатуру ПАДОНКА"! Их и так хватает, сделайте что-нибудь полезное! Кстати, светодиоды клавиатуры отражают реальное состояние стандартной клавиатуры. Помимо своего визуального предназначения, их состояние может пригодиться для анализа кода, который нужно передавать в том или ином случае. Например, будут буквы в верхнем или нижнем регистре - зависит от состояния Caps Lock.

Следует обратить внимание на формат передаваемого репорта:

' Формат передаваемого репорта  - usb_tx_buffer:

   _usb_tx_buffer2(2) = 0    ' modifier    - комбинация из 8-ми модификаций (левые и правые Ctrl, Alt, Shift, Win)
   _usb_tx_buffer2(3) = 0    ' reserved    - резерв
   _usb_tx_buffer2(4) = 0    ' keycode 0 - код клавиши 0
   _usb_tx_buffer2(5) = 0    ' keycode 1 - код клавиши 1
   _usb_tx_buffer2(6) = 0    ' keycode 2 - код клавиши 2
   _usb_tx_buffer2(7) = 0    ' keycode 3 - код клавиши 3
   _usb_tx_buffer2(8) = 0    ' keycode 4 - код клавиши 4
   _usb_tx_buffer2(9) = 0    ' keycode 5 - код клавиши 5

' modifier
' bit0  LEFT CTRL   (1)
' bit1  LEFT SHIFT  (2)
' bit2  LEFT ALT    (4)
' bit3  LEFT WIN    (8)
' bit4  RIGHT CTRL  (16)
' bit5  RIGHT SHIFT (32)
' bit6  RIGHT ALT   (64)
' bit7  RIGHT WIN   (128)

' CTRL + ALT + DEL
' Эту комбинацию нужно передать так: &H05, &H00, &H4С, &H00, &H00, &H00, &H00, &H00 = 5[Ctrl(1) + Alt(4)], 0, 76, 0, 0, 0, 0, 0
' В первый байт попадает сумма модификаций клавиш (левые и правые Ctrl, Alt, Shift, Win)

Не забывайте после передачи кода клавиши передать в репорт все нули - признак отпускания клавиши! Иначе вы рискуете подвесить компьютер, что я успешно и делал несколько раз, пока отлаживал код. 
Что может пригодиться для самостоятельного изменения логики работы?

  1. Скан коды клавиатуры HID и их соответствие PS2
  2. Графическое представление клавиш стандартной клавиатуры с её HID-кодами.
  3. Полный список системных "горячих клавиш" в XP -> Пуск -> Справка и поддержка -> Настройка компьютера -> Клавиатура и мышь -> Общие сведения о сочетаниях клавиш WINDOWS.


Ну а мне пока предстоит самая интересная часть работы - придумать необходимые мне сочетания клавиш, заготовки текста, участки кода...
Облагородить клавиатуру - сделать соответствующие наклейки... Ну и привыкнуть к ней... 
Ну а на её основе можно сделать генератор паролей и поместить чудо в корпус б/у флешки, визитную карточку, "подарок другу"...

   Удачи и вам в ваших творческих порывах!

P.S. Если добавить RC5, получится дистанционное управление компьютером! А клавиши вы сможете в коде назначить так, как вам удобно. 

Фото отчёт от MAX50:







Информация к размышлению...
Для организации мультимедийных клавиш необходимо установить такой дескриптор:

Item Tag (Value) Raw Data
Usage Page (Consumer Devices) 05 0C 
Usage (Consumer Control) 09 01 
Collection (Application) A1 01 
    Report ID (1) 85 01 
    Usage Minimum (Undefined) 19 00 
    Usage Maximum 2A F0 02 
    Logical Minimum (0) 15 00 
    Logical Maximum (752) 26 F0 02 
    Report Count (1) 95 01 
    Report Size (16) 75 10 
    Input (Data,Ary,Abs) 81 00 
End Collection C0 
Usage Page (Generic Desktop) 05 01 
Usage (System Control) 09 80 
Collection (Application) A1 01 
    Report ID (2) 85 02 
    Usage Minimum (System Power Down) 19 81 
    Usage Maximum (System Wake Up) 29 83 
    Logical Maximum (1) 25 01 
    Report Size (1) 75 01 
    Report Count (3) 95 03 
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 
    Report Count (5) 95 05 
    Input (Cnst,Ary,Abs) 81 01 
End Collection C0 

Посмотрите документ - Universal Serial Bus (USB) HID Usage Tables со страницы 75. 
Там вы найдёте коды мультимедийных клавиш. Они передаются 3 байтами.

Пример:
[Play/Pause] -- 01CD00
[Mute] -- 01E200
[Stop] -- 01B700
[Volume UP] -- 01E900
[
Volume Down] -- 01EA00
[Rewind] -- 01B600
[FastForward] -- 01B500

[My PC] -- 019401
[My Doc] -- 01A302

[calculator] -- 019201
[sleep] -- 0202

Internet:
[<-] -- 012402
[->] -- 012502
[reload] -- 012702
[close] -- 012602
[browser] -- 012302
[search] -- 012102
[faworites] -- 012A02
[e-mail program] -- 018A01


Можно поменять репорт, не забывая указывать его размерность в 2 местах и передавать нужные коды клавиш, а можно попробовать сделать составное устройство с обычными клавишами и мультимедийными. Вышеуказанный документ очень поучительный в плане где брать коды всяких разных стандартных устройств. О существовании некоторых я и не догадывался! 
Ещё один не менее поучительный документ  -   Device Class Definition for Human Interface Devices (HID).  Здесь можно познакомится с дескрипторами и иже с ними.
Удачи вам в ваших творениях, товарищи! Не забывайте делиться кодом с нами, мы вас никогда не забудем!

Попробовал сделать мультимедийную клавиатуру
Обрабатываю 3 кнопки - вызов калькулятора и управление громкостью. Всё работает! И даже без дублирования команд!

Осталось слить 2 дескриптора и их обработку. Кто смелый?!

Категория: Мои статьи | Добавил: bascom (16.02.2011)
Просмотров: 41345 | Комментарии: 70
Всего комментариев: 69« 1 2 3 »
43 max50  
0
Вот что получилось http://ifolder.ru/22251360. Есть о чем подумать.

44 bascom  
0
Работает?

46 max50  
0
Еще не проверял. Пока только с клавой разобрался. Наверное завтра буду.

47 max50  
0
Не работает.

48 max50  
0
Всем привет!
Коды кнопок с клавы oklick 380m. Коды в таком порядке: Интернет-клавиши
Home, E-Mail, Back, Forward, Search, Refresh, Favorites, Stop
Мультимедийные клавиши
Vol-, Vol+, Mute, Stop, Previous, Play/Pause, Next
Клавиши управления компьютером Wake Up, Power , Sleep.
Ссылка: http://ifolder.ru/22310170

49 bascom  
0
Посмотрев внимательно на дескрипторы, можно заметить, что клавиатура не имеет своего ID репорта. Устройство управления - ещё 2 дескриптора с соответствующими репортами ID - 2 и 3.
Если устройство без репорта (по умолчанию - 0), передаётся 8 байт без проблем. Если устройство имеет репорт, то первым байтом передаётся он. Тогда 3 байта управляющего устройства превращаются в 4. С клавиатурой такое не прокатит - получается 9 байт, а мы можем передать только 8. По отдельности всё работает, а вот в куче - нет. Не хочет устройство нормально определятся, если в клавиатуре репорт не прописан. Вот такие вот дела... Может быть косяк библы Баскомовской, может я пока чего-то не понимаю...

50 max50  
0
Quote
Не хочет устройство нормально определятся

У меня такая же ситуация. Определяется как USB Device, а "при установке возникли проблемы" и все. На фоне всего этого мне видится такой вариант: собрать два разных девайса в одном корпусе. biggrin Ну и хаб во внутрь затолкать. tongue

51 bascom  
0
Имеет право на жизнь, но слегка расточительно. sad
Решение есть, делают же китайцы пульты ДУ, реализующие и клаву, и мультимедиа, и мышь в одном устройстве. Просто не хватает внятной информации как работать с составными устройствами.

53 max50  
0
Quote (bascom)
Имеет право на жизнь, но слегка расточительно

Но это на самый крайний случай. wink

42 max50  
0
Взял клаву Logitech Cordless Desktop LX710. Её дискриптор http://ifolder.ru/22250294. Сейчас пытаюсь "содрать" коды. Но не все так просто. То ли клава "глючит" (беспроводная), то ли USBlyzer, то ли я. То видит м/м кнопки, то не видит, то передает по 2-4 раза команду, потом нули, то нормально. Вот что пока удалось http://ifolder.ru/22250421. Буду дальше разбирвться.

40 max50  
0
Можно попробовать при нажатии кнопок обрабатывать разные дескрипторы. Сделать в виде подпрограмм. Вечером попробую, отпишусь.

38 max50  
0
Quote (bascom)
Посмотрите документ - Universal Serial Bus (USB) HID Usage Tables со страницы 75.

Что-то не пойму как выбрать коды. И еще. "Музыкальные" кнопки у меня роботают только с Keyboard Maniac v4.28.

39 bascom  
0
Смотри в конце статьи код. У меня громкость регулируется без всяких проблем.

41 max50  
0
Громкость и у меня регулируется. Не могу разобраться как из вышеприведенного документа выбрать коды клавиш. Исходник попробую.

26 bascom  
0
Согласно этому документу http://bascom.at.ua/2011/Klava_USB/translatePS2-HID.pdf коды мультимедиа-клавиш находятся в другой HID Usage Page(странице) - 0C. Обычные клавиши - в 07. Нужно подключить любую HID - мультимедиа клавиатуру, содрать дескриптор и коды клавиш с помощью сниффера. Кто сможет это сделать, присылайте информацию мне, я попробую доработать клаву для мультимедийных клавиш.

27 max50  
0
Я пробовал кнопки громкости со страницы 07. Их коды - 80 и 81. Не работает.

28 bascom  
0
Я тоже пробовал... Выход такой - новый дескриптор для мультимедиа клавиш. Если без значительной переделки кода, то или обычные клавиши с одним дескриптором, или мультимедийные - с другим. Посложнее - делать составное устройство, но тогда можно будет сразу все клавиши эмулировать biggrin

29 bascom  
0
Посмотри окончание статьи, кое что добавил.

30 max50  
0
Quote (bascom)
не забывая указывать его размерность в 2 местах

А как посчитать эту размерность. И еще. Можно поподробней, как сделать обработку кнопок по прерыванию?
Заранее спасибо!

31 bascom  
0
В декскрипторе мультимедиа размерность - 50. Посчитай rawdata. Переделай по аналогии с предыдущим дескриптором:

Data _usb_desc_report
Data 50 , 0 ' первое число должно быть таким же, как количество данных дескриптора HID - _usb_hid_reportdescriptor
_usb_hid_reportdescriptor:
'Дескриптор HID-мультимедиа клавиатуры
Data 50 'Количество данных дескриптора HID, установить такое же в _usb_desc_report
Data &H05 , &H0С 'Usage Page (Consumer Devices)
Data &H09 , &H01 'Usage (Consumer Control)
ну и т.д.
Попробуй сначала запусти регулировку звука, а потом и с опросом кнопок что нибудь придумаем
biggrin biggrin


32 max50  
0
Получился такой дескриптор:
Code
Data 50  'Количество данных дескриптора HID, установить такое же в _usb_desc_report
Data &H05 , &H0C  '  Usage Page (Consumer Devices)
Data &H09 , &H01  '  Usage (Consumer Control)
Data &HA1 , &H01  '  Collection (Application)
Data &H85 , &H01  '  Report ID (1)
Data &H19 , &H00  '  Usage Minimum (Undefined)
Data &H2A , &HF0 , &H02  '  Usage Maximum
Data &H15 , &H00  '  Logical Minimum (0)
Data &H26 , &HF0 , &H02  '  Logical Maximum (752)
Data &H95 , &H01  '  Report Count (1)
Data &H75 , &H10  '  Report Size (16)
Data &H81 , &H00  '  Input (Data,Ary,Abs)
Data &HC0  '  End Collection
Data &H05 , &H01  '  Usage Page (Generic Desktop)
Data &H09 , &H80  '  Usage (System Control)
Data &HA1 , &H01  '  Collection (Application)
Data &H85 , &H02  '  Report ID (2)
Data &H19 , &H81  '  Usage Minimum (System Power Down)
Data &H29 , &H83  '  Usage Maximum (System Wake Up)
Data &H25 , &H01  '  Logical Maximum (1)
Data &H75 , &H01  '  Report Size (1)
Data &H95 , &H03  '  Report Count (3)
Data &H81 , &H02  '  Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
Data &H95 , &H05  '  Report Count (5)
Data &H81 , &H01  '  Input (Cnst,Ary,Abs)
Data &HC0  '  End Collection

Теперь встал вопрос о передачи трех байт кода клавиш.


33 bascom  
0
If _usb_tx_status2._usb_txc = 1 Then
_usb_tx_buffer2(2) = 1
_usb_tx_buffer2(3) = 146
_usb_tx_buffer2(4) = 1
Call Usb_send(_usb_tx_status2 , 3)
End If

34 max50  
0
Попробовал. Работает! biggrin Только калькулятор запускается 8 biggrin раз. Сейчас попробую остальные, отпишусь.

35 bascom  
0
Всё получится! Попробуй после передачи репорта вставить паузу waitms 300 ну или около того.

37 max50  
0
Quote (bascom)
вставить паузу waitms 300 ну или около того

Сделал 255. Стало лучше, но надо подобрать поменьше. Уже поздно...

36 max50  
0
Quote
Только калькулятор запускается 8 раз

Забыл отпрвить нули. Так всего 2 раза. biggrin Попробовал все "музыкальные" кнопки. Все работает. Особенно прикольно смотритца на буке. Теперь надо разобраться с опросом кнопок и слиянием двух дискрипторов. Вот тогда получится "реальный" девайс.

18 uncle_sem  
0
к вопросу о птичках. а кто знает название энкодера+джойстика? я уверен что такое бывает. или самому сделать? оно в принципе тоже несложно, но вдруг бывает фирменное? тогда было бы вообще пуля - крутелка - громкость, вправо-влево - треки, вверх - плей/пауза, вниз - стоп, нажание - мьют.

10 max50  
0
Всем привет!
Подключил энкодер как в статье. Светодиод статуса хаотично моргает и больше ничего. Попробывал добавить новые скан коды громкости и Mute, которые нашел в нете - результат: светодиод статуса светится и тишина. Может быть кто поскажет куда копать?
Заранее спасибо!

11 bascom  
0
Найди ЮСБ-сниффер и посмотри что принимается компом. Есть триальные, есть без ограничения. Без этого - что водить машину вслепую.

12 max50  
0
Спасибо! Буду разбираться.

13 max50  
0
Накачал кучу всяких разных. Ни одному не могу "дать ума". cry
Не подскажите каким сами пользуетесь или какой проще.
Заранее спасибо!

14 bascom  
0
http://www.usblyzer.com/download.htm
Слева в дереве выбираете ваше устройство, затем Start capture, справа в гриде наблюдаете посылки при нажатии клавиш и вращении энкодера.

15 max50  
0
Спасибо!

16 max50  
0
Выяснилось, что при нажатии на добавленные мной кнопки, вместо одной посылки их может быть две и больше. Тоже самое с энкодером. Пока не понял как от этого избавиться. Код прилагаю.http://ifolder.ru/22091521

17 bascom  
0
Timer1 = 60000 - пробуй уменшить. Также Const _usb_endp2interval = 10 и Const _usb_endp3interval = 10 пробуй увеличивать. Нет смысла передавать и принимать репорты 100 раз в секунду. Скорее всего происходит двойная передача из-за того, что клавиши успевают опроситься дважды - трижды за время их нажатия. Самому сейчас некогда sad

19 max50  
0
С энкодером вроде разобрался. Сделал Const _usb_endp2interval = 100 и Const _usb_endp3interval = 200, подтянул выходы энкодера внутренними резисторами. Но не могу передать отпускание кнопки. Если после передачи кода посылаю пустую посылку, то вместо кода одни нули. С кнопками все сложнее. Вместо сочетания CTRL+ALT+DEL передаю посто DEL, то тоже 2 и больше посылок. Даже и не знаю. cry Передавал коды громкости - ноль реакции.

20 bascom  
0
С кодами мультимедийных клавиш не всё так просто. Как бы там не пришлось ещё один репорт описывать, т.к. они находятся в другой кодовой таблице, отличной от обычных клавиш. По поводу кнопок можно посмотреть примеры на сайте http://www.obdev.at/products/vusb/prjall.html Они хоть и на Си написаны, но вполне понятны в качестве примеров. Накачал, пытаюсь разобраться. Правда, когда вплотную займусь, пока не ясно - есть более важные проекты.

21 max50  
0
Ясненько. Еще бы где найти коды клавы бука с сочетанием кнопки Fn. Вот тогда точно девайс был бы прикольный.

22 max50  
0
Сделал 16 различных сочетаний. alt+tab и win+d можно сказать не работали. Начал проверять остальные кнопки. Открывается по нескольку окон проводника. Посмотрел в usblyzer. Оказалось, что ВСЕ :o(за исключением нескольких символов) команды передаются по нескольку раз. И как теперь быть? sad

23 bascom  
0
Переписывать код. Ставить на прерывание обработку кнопок, а не в цикле. Тогда и код клавиш будет прередаваться нужное (контролируемое) количество раз. Сия конструкция не претендовала на законченность творения, это основа. Дескриптор и формат передаваемых данных выполняют свою функцию - создают HID клавиатуру и передают необходимый репорт. Обработку кнопок нужно обязательно переделать! Но я сейчас реально не могу, сдаю проект...

24 max50  
0
Понятно. Будем пробовать. biggrin

25 bascom  
0
Не забывай, что первой командой в обработчике прерываний должна быть SEI (разрешить прерывания).

7 uncle_sem  
0
особо интересно было бы добавить мультимедийные клавиши - и получить мелкую мультимедийную клаву. треки, громкость, плей-пауза. хм. а еще - энкодер для громкости :) кстати, получится очень здоровский гаджет, крутилка громкости с доп-кнопками мультимедия. при хорошем исполнении "в железе" будет не только удобно, но и стильно.

8 max50  
0
Есть же скан коды клавиатуры HID и их соответствие PS2. На их основе можно все нужные кнопки добавить.

9 bascom  
0
В предыдущей статье - миди клавиатуре используется энкодер. Берите оттуда код. Мультимедийные клавиши - сочетание обычных клавиш. На раз ищутся в интернете. Не забудьте потом с товарищами по сайту поделиться! smile

6 max50  
0
Странный форум! Хотел вставить фотки с Превью - увеличение по клику - не дал, HTML: превью - величение по клику - дал, но "коряво".

3 max50  
0
Всем привет! Задам наверное глупый вопрос, но у нас в городе нет кварца на 15МГц, как настроить Timer1 на 12,5 Гц при кварце 12МГц?
Заранее спасибо!

4 bascom  
0
Да там комментарий на 12,5 Гц от фонаря стоит. Ставь кварц на 12МГц, а Timer1 = 60000 - попробуй подобрать. Я думаю, что и так работать будет.

5 max50  
0
Понял! biggrin Буду пробовать.

1-10 11-20 21-22
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright Radan Studio © 2025