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

Атомная клавиатура виндуксоида (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)
Просмотров: 40748 | Комментарии: 70
Всего комментариев: 691 2 3 »
69 Alexander  
0
Вот здесь: http://vusb.wikidot.com/project:wishabi довольно внятный пример работы с составным устройством. Правда ин инглиш и на Си....

66 max50  
0
Quote (bascom)
Осталось слить 2 дескриптора и их обработку. Кто смелый?!

Mrshilov здесь:http://mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&t=7537&postdays=0&postorder=asc&highlight=usb+port&start=225&sid=ff776f7b7704a4f37f4daeaeb4307385
Quote (Mrshilov)
It is really possible to make 2 interfaces with this library!
I simpy add second Interface, HID, Endpoints and Report descriptors and make a choice to choose one of two Report descriptor in Sub Usb_processsetup:
Code
......................  
  Case &B10000001:  
  Select Case _usb_rx_buffer(3)  
  '  CASE _usb_REQ_GET_STATUS:  
  '  CASE _usb_REQ_GET_IFACE:  
  Case _usb_req_get_descriptor  
  '_usb_rx_buffer(4) is the descriptor index and (5) is the type  
  Select Case _usb_rx_buffer(5)  
  Case _usb_desc_report:  
  Case _usb_desc_report:  
  If _usb_rx_buffer(6) = 0 Then Restore _usb_hid_reportdescriptor  'first interface  !!!!!!!!!  
  If _usb_rx_buffer(6) = 1 Then Restore _usb_hid_reportdescriptor1  'second interface  !!!!!!!!!  
  End Select  
  Senddescriptor = 1  
  '  CASE _usb_DESC_PHYSICAL  
  '  CASE _USB_DESC_HID  
  End Select  
  End Select  
  ..........................

And it works!!!

68 bascom  
0
Без описания и кода перезагрузки дескрипторов простому пользователю мало что понятно будет. wacko

65 совет  
-1
а вам не кажется что проще использовать другую комбинацию клавиш? при этом использовать всего два пальца вместо трех... ctrl+shift+esc. первые две большим пальцем а эск указательным или средним)))

67 max50  
0
Дело не в "распальцовке", а в том, чтобы на одном МК сделать и обычную клаву, и мультимедиа и в ней сделать любые сочетания клавиш.

62 max50  
0
При таком раскладе 31 символ занимает 58% памати ATMEGA168. Как бы не проблема, но все же.

63 bascom  
0
Логично оформить повторяющийся участок кода в виде процедуры с параметром - кодом нажатой клавиши.
Code

Declare Sub Usb_write_key(keycode As Byte)

If Key(1) = 0 Then  ' LEFT CTRL  
  Call Usb_write_key(1)
End If

Sub Usb_write_key(keycode As Byte)
Portd.7 = 1
If _usb_tx_status._usb_txc = 1 Then  
  _usb_tx_buffer2(2) = keycode  ' Нажатие клавиш  
  _usb_tx_buffer2(4) = 0  
  Call Usb_send(_usb_tx_status2 , 8)  'Сообщение в компьютер  
  Waitms Paus  
End If  
If _usb_tx_status._usb_txc = 1 Then  
  _usb_tx_buffer2(2) = 0  ' Отжатие клавиш  
  _usb_tx_buffer2(4) = 0  
  Call Usb_send(_usb_tx_status2 , 8)  'Сообщение в компьютер  
  Waitms Paus  
End If  
  Portd.7 = 0  
End If  
End sub

64 max50  
0
Quote (Alex)
Логично оформить повторяющийся участок кода в виде процедуры с параметром - кодом нажатой клавиши.

Логично! biggrin Спасибо!

61 max50  
0
Всем привет!
Делаю передачу конкретного символа так:
Code
If Key(1) = 0 Then  ' LEFT CTRL
  Portd.7 = 1
  If _usb_tx_status._usb_txc = 1 Then
  _usb_tx_buffer2(2) = 1  ' Нажатие клавиш
  _usb_tx_buffer2(4) = 0
  Call Usb_send(_usb_tx_status2 , 8)  ' Сообщение в компьютер
  Waitms Paus
  End If
  If _usb_tx_status._usb_txc = 1 Then
  _usb_tx_buffer2(2) = 0  ' Отжатие клавиш
  _usb_tx_buffer2(4) = 0
  Call Usb_send(_usb_tx_status2 , 8)  ' Сообщение в компьютер
  Waitms Paus
  End If
  Portd.7 = 0
  End If

Собственно вопрос: можно ли как-то по другому, а то такой способ занимает много памяти?
Заранее спасибо!

59 AlekS  
0
по 2 вопросу
можешь кусок кода набросать? ни как сооброжалка ,,,,, как паразитный зарядник и таймер соединить. Х-(
вроде порт на выход, потом на вход, пускаем таймер, замер ,,,,, и все,,,, на деле туплю.

60 bascom  
0
В ближайшее время не могу.

57 AlekS  
0
Bascom
Есть 2 вопросаЖ
1, это- WWW.gethip.net (056-USB-программатор – легко! (USBTiny))
В баскоме пойдет?
2, там-же статья о кейпаде, реалезуема в баскоме?

можно в личку.

58 bascom  
0
Я таким программатором прошивал, но только дудкой. В Баском напрямую не цепляется. Лучше на 8 меге USBASP сделать, сложность изготовления и набор деталей практически один и тот же, зато поддерживается и Баскомом, и многими другими оболочками.
По 2 вопросу тоже не вижу особых проблем, но нужно пробовать в коде.

56 max50  
0
Quote (max50)
Ну и хаб во внутрь затолкать.

По случаю был приобретен хаб на четыре порта. Так, на всякий случай. biggrin

55 max50  
0
Quote (bascom)
Всё передаётся через дескриптор мыши...

Клавиатура Defender Multimedia Maverick (KM-5460/9510) виндой определяется как HID-клавиатура и HID-мышь. http://ifolder.ru/22380311 Попробовал новый дескриптор, пишет что устройство не возможно запустить. У меня сложилось впечатление, что надо подправлять конечные точки, классы и т.д. Сам пока что мало чего понял.

45 max50  
0
Code
Кнопка - код
Pictures - 10030305100000
Rotate - 10030328100000
Zoom+ - 10030320100000
Zoom- - 1003031F100000
100% - 10030321100000
FN - 1003032C100000
Word - 1003032C104110
Excel - 1003032C104210
Календарь - 1003032C104310
Калькулятор - 1003032C9201
Мои документы - 1003032C104510
Новая папка - 1003032C104610
Печать - 1003032C104710
Сохранить - 1003032C104810
Presets  a - 1003032C104910
Presets  b - 1003032C104A10
Presets  c - 1003032C104B10
Presets  d - 1003032C104C10
Vol- - 100303EA000000
Mute - 100303E2000000  
Vol+ - 100303E9000000
Search - 10030321020000
E-mail - 1003038A010000
VoIP - 10030301100000
Выпадающее меню - 1003032C100000
  0000650000000000
Scroll Lock - 1003032C100000
  0000470000000000
Проигрователь - 10030383100000
Случайный порядок(Shuffle) - 10030329100000
Skip backward - 100303B6000000
Skip forward - 100303B5000000
Play/Pause - 100303CD000000
Sleep - 10030401000000

52 bascom  
0
Всё передаётся через дескриптор мыши...
Может быть здесь помогут прояснить ситуацию - http://www.msevm.com/forums/index.php?showtopic=3112

54 max50  
0
Был я на этом форуме. Сейчас опять посмотрю.

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

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