0,0
рейтинг
15 декабря 2013 в 21:50

Администрирование → Дешевая USB кнопка для PC

Идея — запускать скриптик по нажатию физической кнопки, подключенной к компьютеру.

кнопка

Варианты:
  • 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 мм…
В вашем случае можно и не делать, но хотя бы упомянуть про это в статье надо, а то среди комментариев я ничего подобного не заметил.


Ссылки



Спасибо, что дочитали до конца.
Геннадий Гордеев @bockra
карма
18,0
рейтинг 0,0
sysadm
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (64)

  • +26
    Мсье знает толк.
    Это же дикое извращение. Я лично предложил бы дешевую ATMega8 с V-USB на борту, просто и сердито.
    • +6
      интересно бы еще увидеть примеры использования — тогда бы было окончательно ясно, в чем мсье знает толк
    • +2
      ATMega8, кстати, не такая уж и дешёвая. Если нужно всего лишь одну кнопку даже и Tiny23 какого-нибудь хватит с USBtiny.
    • +3
      дешевле купить USB-клавиатуру.
  • +6
    Так вот зачем ты мою малинку используешь :)
    • +1
      еще сериалы она показывает :)
  • +4
    Так на RPi можно же просто тупо GPIO дергать?
    • +2
      Pi использовал как единственную linux машину под рукой.
      Вся конструкция бедет подключена к десктопу
      • +4
        Можно еще один вариант с переходником USB<->RS232 попробовать.
        • +1
          дорого :) псевдо мышь дешевле
          • +1
            Пара баксов на DX. Зато по фэн-шую :)
            • +1
              В таком случае еще что-то отслеживающее нажатия надо писать, а udev всегда бдит.
        • +1
          Хотел примерно это посоветовать, взять dx.com/p/152317, и просто замыкать RXD на землю. На компе слушать порт (/dev/ttyUSBx или COMx), и если там какой-то мусор появился — кнопка нажата.
          • +1
            мусор… зачем же мусор! На RХ передавать последовательность, через TX принимать, хоть и простого но демона надо в любом случае делать — это может быть очень простая программа, работа ведь ведется со стандартным коммуникационным портом а значит передача/прием довольно отработанные процедуры и проблем не представляют, особенно в свете того что цель — запуск скрипта, который явно не блондинка писать будет.
            • +1
              Передавать придётся довольно часто, чтобы успеть короткие клики обработать. Десять раз в секунду по байту, например. А земля она и есть земля, не будим процессор понапрасну, спасаем планету.
              • +1
                Подключаем кнопку по USB и экономим на байтах/тактах?
                Это может иметь смысл на МК (но там можно и нормальные GPIO заюзать), но не на ПК.
                • +1
                  Согласен, но я должен был поспорить за свой вариант! Кстати, разве есть порты кроме USB? Посмотрел на свой компьютер, ещё разве что микрофонный вход использовать можно.
                  • +1
                    Так об чем и речь — на современных ПК только USB почти везде есть, но там нет смысла экономить на посылке данных.
                  • 0
                    Микрофонный можно использовать как «сенсорный» датчик — прикладываем палец — на входе наводки от электросетей 50ГЦ,
                    Раз в секунду записываем «немного звука» — анализируем на предмет сигнала (да хотя бы среднее от массива байт (если запись идёт 8бит моно) — если есть — значит палец прижали.

                    Вот только у меня в ноуте и микрофонного то уж нет (хотя я знаю и «паял» COM порт)…
        • +1
          Я когда-то тоже такое сделать пытался. В конце концов купил геймпад. Правда, увы, потом так и не довел дело до конца.
          • +1
            Не надо было покупать геймпад.
  • +1
    udevd — из пушки по воробьям… но идея зачётная!
  • +1
    Хмммм. Есть вопрос по поводу кнопки: в стандарте специально сделана разная длина контактов, чтобы сначала замыкалось питание и уравнивались потенциалы, а потом уже соединялись данные. Нет ли никаких ложных сигналов при включении?
    • +1
      Единственное что меня немного нестраивает см P.S.01 в конце статьи.
      Может в этом и есть решение?
    • 0
      Есть расширенный коммент (см P.S.101 в конце статьи)
  • +1
    arduino leonardo 10 баксов, скетч, отправляющий сочетание клавиатуры — не вариант ли?
    • +1
      опять-таки 10 баксов, у меня сейчас планы на 3 кнопки к разным компам и самый дешевый вариант — udev
      • +1
        1PCS IC ATMEGA8A-AU TQFP-32
        US $1.48
        Плюс обвязка на пару баксов, максимум.
        • +1
          Вариант имеет место жить, но надо еще его прошить чем-то и вшить что-то :) я в микроконтроллерах не разбираюсь, но как более правильный, но более сложный вариант имеет право на жизнь.
          • +1
            Тут я вижу два экстримальных варианта:
            1) 5 проводков, который может сжечь порт(если его удастся найти)
            2) Программировать вручную habrahabr.ru/post/152052/
      • +1
        ну я считаю наличие клавы читерством) может у кого и ардуинка старая завалялась)
  • +2
    Можно еще в usb-rs232 замыкать rx на tx и следить за соотв. Com портом. Работает быстрее, но нужна отдельная прога.
    • +1
      Если просто замкнуть ничего не произойдёт. Нужно ещё и данные послать.
      • +2
        Прога должна будет постоянно отправлять какие-нибудь символы.
        В случае замыкания TX<=>RX эти символы начнут возвращаться обратно.

        Но тогда уж с USB-RS232 переходниками есть и другие варианты (в тех переходниках в которых есть дополнительные линии типа RING, DCD,..)/
      • +1
        Если на землю замкнуть, то какой-то мусор придёт
      • +1
        Ну да, дальше всё очевидно.
    • +2
      у com порта еще есть cts rts dsr ring — на них вполне можно вешать события. но в самописной проге. видел прогу -сервис, которая с порта символы делала клавиатурными сообщениями в винду
  • +7
    Когда искал дешёвую USB-кнопку, наткнулся вот на это:
    image
    Семь кнопок, которые опознаются, как USB HID, и, скорее всего, создают обычные нажатия клавиш, за $4 у китацев. В подарок к кнопкам — звуковая карта (смайлик). Самое то для маршрутизатора с OpenWRT. К сожалению, я это дело ещё не покупал и не проверял.
    • +1
      Ещё есть жутко дорогие Дилэкстримовские USB-педали: $12 за одну педаль и $32 за три.
      Can easily be reprogrammed on a Windows PC to perform any keyboard action or key combination, or for mouse button emulation

      Works with Windows 2000/XP/Vista/7/Linux/Mac/Dos
      • +1
        Программер смотрит на пианино приглядывается, охаживает вокруг, потом говорит:
        — Киборд неудобный — всего 84 клавиши, половина функциональных, ни одна не подписана, зато шифт ногой нажимать — прикольно.
  • +3
    Сори, но хотелось бы понять — а для чего вообще она нужна, эта usb кнопка?
    • +2
      Пример из жизни (для чего первоначально кнопка делалась): на компьютере настроен sip клиент и по нажатию кнопки делался звонок определенному человеку и проигрывалось сообщение ему.
      И это был не розыгрыш, а необходимость, так как человек вечно где-то пропадал, а нужен он был многим. Вот люди и подходили и жмакали по обезьяне :)
      • +2
        Это кнопка вызова Бэтмана? :)
        • +2
          Видимо что-то типа того :)
    • +2
      Вот вам еще пример: в нашей организации используется Asterisk для обслуживания входящей очереди звонков. Чтобы не заставлять клиентов ждать ответа в нерабочее время, если в очереди не зарегистрирован ни один оператор, клиенту проигрывается предложение поговорить с автоответчиком. Регистрация оператора в очереди (и выход из нее) происходит по набору двухзначного кода. Часто операторы, выбегая покурить или по другим делам, забывают выйти из очереди, а по возвращении — зарегистрироваться. После этого родилась мысль — приделать к каждому стулу датчик наличия на нём сидящего человека, чтобы автоматизировать регистрацию оператора.
      • +1
        А провод привязывающий стул к компу вас не смущает?
        • +1
          Провода — нехорошо. Зато можно организовать обратную связь — не берёт менеджер трубку — щёлк его током!
      • +1
        Поставте датчики присутствия (используются в сигнализациях) они не дорогие. Контакты от датчика, соедините параллельно какой нибудь кнопке, на дешевой мыши ( я тут в ашане купил кажется за 80р. для ремкомплекта).
        А вообще если работник забывает выполнять часть своих обязанностей, то его наказывают как правило материально.
      • 0
        Платите соответствующее вознаграждение менеджеру за каждый обработанный звонок и не надо ничего выдумывать.
  • +1
    Мышка разве не дешевле клавиатуры?
    • +1
      На работе лежат десятки старых, ненужных клавиатур, которые надо бы давно выкинуть. а вот мышей всего несколько штук
  • +1
    А еще эта обезянка умеет выдавать конфеты из под хвоста.
    • +1
      Больше не умеет :) все заклеено
  • +1
    А можно как то с подобной кнопки включать ПК (или вообще с USB-клавиатуры)? Желательно без разбора корпуса ибо ноутбук (про wake on lan знаю, там нужно второе устройство, которое будет инициировать включение).
    • +1
      Ноутбуки часто отключают USB порты в спячке, так что разбудить ноут проблема несколько больше простейшей.
  • +1
    В итоге Китайцы рулят. Замах на 1000$ удар 10 центов.
    • +1
      Вы о чем?
  • +1
    Интересно! С другой стороны, сколько времени вы на это потратили? Не было бы дешевле купить устройство дороже, но потратить полчаса, чем не потратить денег, но провозиться 6 часов?
    • +1
      С 0 разобрался в udev и заделал все суммарно за часов 6-7.
      Теперь каждая новая кнопка по времени будет выходить в 10-15 минут работы :)
      • 0
        Хех, молодец, что разобрались с udev — у меня так и не получилось заставить поднимать инет-соединение при вставке USB-3G-модема…

        Но статью критикую за то что на камазе возите бухгалтера с платёжкой в банк используете один бит информации подключив 101-клавишную клавиатуру.

        Может сделать так: с помощью udev «замаппить» клавиатуру куда-либо (чтоб X или что там сейчас в линуксах о ней не знал) — а потом программой (да хоть pithon-скриптом ) читать из этого устройства байты. Тогда можно будет 101 кнопку повесить!
  • 0
    А на десктопе RS-232 нет?
    • 0
      Совсем нет
      • 0
        На самом деле скорей всего есть, только не выведен наружу.
  • 0
    Как избежать двойного срабатывания правила udev:
    в скрипт добавить дамп параметров
    env >> log.txt
    echo "------------" >> log.txt
    после сравнить, выделить характерные особенности каждого срабатывания и добавить их описание к правилу udev, например ENV{DEVNAME}=="/dev/input/mouse0"

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.