Pull to refresh

Дешевая USB кнопка для PC

Reading time 4 min
Views 64K
Идея — запускать скриптик по нажатию физической кнопки, подключенной к компьютеру.

кнопка

Варианты:
  • Arduino nano — 1400 р (ориг), 300 р (не ориг). (плюсы: можно навесить много кнопок на 1 usb порт; минусы: надо паять + понять как она работает и на компьютере придется держать постоянно программу, которая будет ждать нажатия кнопки)
  • USBbutton — 780 р (плюсы: все красиво оформлено и сделано; минусы: высокая цена и она win-only)
  • U-HID Nano — 1150 р (плюсы: есть софт; минусы: высокаяя цена + необходимо паять)
  • Usb устройство (почти любое) — 0 — 100 р (плюсы: почти 0 себестоимость, не надо программировать; минусы: linux, возможная пайка, повреждение usb кабеля)



Все эксперименты я проводил на Raspberry PI с debian на борту (точнее прошивка raspbmc).
Для реализации подойдет любой дистрибутив, испльзующий udev для отслеживания системных устройств.

Устройство, на основе которого будет делаться кнопка может быть любым: старая полусломаная usb клавиатура, мышка, камера да и вообще все что цепляется по USB и может быть опознано системой.
На маркете нашел мышь за 70 руб, что может служить кнопкой и вполне конкурентоспособно с другими вариантами.

Делаем кнопку


Схема работы кнопки проста до безобразия
важное замечание по схеме подключения: см P.S.101 в конце статьи


Пока кнопка нажата — вся цепь замкнута, на устройство подается питание и система видит, что подключено новое устройство.
Когда кнопку отжимаем, то происходит разрыв цепи и устройство пропадает из системы.
Эта логика и есть ключевая во всем процессе создании кнопки.

Я разобрал старую клавиатуру и добыл из нее
микросхему

В одной из версий этой кнопки я использовал замыкание конкретных контактов на клавиатуре
чтобы эмулировать нажатие какой-либо клавиши и была в фоне запущена программа, которая ожидала нажатия этой клавиши.



Проверка работоспособности кнопки:


Кратчайшая теория udev


Процесс udevd отслеживает подключение/отключение девайса и создает файл устройства в директории /dev/ (совсем образное объяснение, для любителей подробностей смотри ссылки в конце статьи)
Во время подключения устройств udevd проверяет список правил в директории /etc/udev/rules.d/
Правила могут жить как и в одном файле так и в нескольких.
Создадим файл и добавим правило:
pi@raspbmc:~$ cat /etc/udev/rules.d/20-usb_button.rules
ATTRS{name}=="LITEON Technology USB Multimedia Keyboard", ATTRS{phys}=="usb-bcm2708_usb-1.2/input0", ACTION=="add", RUN+="/bin/sh /home/pi/usb.sh"

в debian нет необходимсто перезапускать udev после изменения правил, все происходит автоматически.

Это правило выполняется только когда соблюдаются все условия:

ATTRS{name}==«LITEON Technology USB Multimedia Keyboard» (имя подключенного устройства совпадает)
ATTRS{phys}==«usb-bcm2708_usb-1.2/input0» (устройство подключено в конкретный USB порт. Мне это необходимо, тк использую 2 кнопки, сделанные из одинаковых клавиатур)
ACTION==«add» (правило работает только когда устройство тольок что добавлено, есть еще параметр "remove". Если не указать Action, то скрипт будет постоянно запускаться, пока подключено устройство)
RUN+="/bin/sh /home/pi/usb.sh" (собственно наш скрипт, который запускается по нажатию кнопки, без /bin/sh так и не запустился, также см P.S.01 ниже)

Список атрибутов можно узнать следующим образом:
pi@raspbmc:~$ udevadm info -a -p $(udevadm info -q path -n /dev/input/by-path/platform-bcm2708_usb-usb-0\:1.2\:1.0-event-kbd)

  looking at device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input107/event0':
    KERNEL=="event0"
    SUBSYSTEM=="input"
    DRIVER==""

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input107':
    KERNELS=="input107"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{name}=="LITEON Technology USB Multimedia Keyboard"
    ATTRS{phys}=="usb-bcm2708_usb-1.2/input0"
    ATTRS{uniq}==""
    ATTRS{properties}=="0"
....

где /dev/input/by-path/platform-bcm2708_usb-usb-0\:1.2\:1.0-event-kbd — адрес устройства

адрес устройства в системе можно узнать в момент подключения устройства:
pi@raspbmc:~$ udevadm monitor --env |grep DEVLINKS
DEVLINKS=/dev/input/by-id/usb-LITEON_Technology_USB_Multimedia_Keyboard-event-kbd /dev/input/by-path/platform-bcm2708_usb-usb-0:1.2:1.0-event-kbd


для дебага я использовал правило:
SUBSYSTEM=="usb", ATTRS{ID_MODEL_ID}=="c312", SYMLINK+="ABC"

и проверял создался ли симлинк устройства /dev/ABC

Итог



Вот и все. Мы получили кнопку, по нажатию которой запускается скрипт в системе.

стоимость:
старая клавиатура — 0р
кнопка — 10р
корпус — 0 р

И самое главное что такая кнопка не требует знаний микроконтроллеров и особого умения паять, удобна и доступна каждому :)

P.S.00 про мой корпус для кнопки.

Обезьяна на пружине и если надавить на голову, то обезьяна давит хвостом кнопку, что и приводит к замыканию цепи

P.S.01 Наткнулся на интересный баг и не смог забороть: скрипт указанный в правиле запускается 2 раза. Может кто подскажет?
P.S.10 Кнопку необходимо держать около 2х секунд, так как необходимо дождаться инициализации устройства в системе
P.S.11 Если решите повторить проект с какими либо измененими, настоятельно рекомендую хотя бы пролистать список литературы
P.S.100 Скрипт на python для работы с udev github.com/bockro/misc usb_checker.py
P.S.101 Важное замечание от Blangel
Вы сделали замыкание-размыкание провода +5 В у USB, однако, Data лучше бы тоже замыкать/размыкать.
Давайте вспомним историю — зачем в USB-коннекторе сделаны удлиненными контакты +5 В и GND?
Во-первых, чтоб USB-устройство успело сделать программный сброс и быть готовым к получению и отправке данных.
Но есть и во-вторых — старые компьютеры (а особенно веселые материнки времени Pentium 4 на ICH5) грешат плохой реализацией USB-шины, в итоге есть, что комп зависнет или перезагрузится.
А еще бывают сильно дешевые глючные китайские устройства с похожим эффектом и расчетом на подключение только через USB-коннектор.
Так что оптимальнее было бы замыкать и размыкать 3 контакта — +5 В и Data ± (причем питание замыкать до данных). Сделать это можно, например, с помощью 2 советских выключателей, которые ставились в торшер, только у одного надо кнопку подпилить на 3-5 мм…
В вашем случае можно и не делать, но хотя бы упомянуть про это в статье надо, а то среди комментариев я ничего подобного не заметил.


Ссылки



Спасибо, что дочитали до конца.
Tags:
Hubs:
+41
Comments 64
Comments Comments 64

Articles