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


    Ссылки



    Спасибо, что дочитали до конца.
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 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
                                            Вот вам еще пример: в нашей организации используется Asterisk для обслуживания входящей очереди звонков. Чтобы не заставлять клиентов ждать ответа в нерабочее время, если в очереди не зарегистрирован ни один оператор, клиенту проигрывается предложение поговорить с автоответчиком. Регистрация оператора в очереди (и выход из нее) происходит по набору двухзначного кода. Часто операторы, выбегая покурить или по другим делам, забывают выйти из очереди, а по возвращении — зарегистрироваться. После этого родилась мысль — приделать к каждому стулу датчик наличия на нём сидящего человека, чтобы автоматизировать регистрацию оператора.
                                            • +1
                                              А провод привязывающий стул к компу вас не смущает?
                                              • +1
                                                Провода — нехорошо. Зато можно организовать обратную связь — не берёт менеджер трубку — щёлк его током!
                                              • +1
                                                Поставте датчики присутствия (используются в сигнализациях) они не дорогие. Контакты от датчика, соедините параллельно какой нибудь кнопке, на дешевой мыши ( я тут в ашане купил кажется за 80р. для ремкомплекта).
                                                А вообще если работник забывает выполнять часть своих обязанностей, то его наказывают как правило материально.
                                                • 0
                                                  Платите соответствующее вознаграждение менеджеру за каждый обработанный звонок и не надо ничего выдумывать.
                                              • +1
                                                Мышка разве не дешевле клавиатуры?
                                                • +1
                                                  На работе лежат десятки старых, ненужных клавиатур, которые надо бы давно выкинуть. а вот мышей всего несколько штук
                                                • +1
                                                  А еще эта обезянка умеет выдавать конфеты из под хвоста.
                                                  • +1
                                                    Больше не умеет :) все заклеено
                                                  • +1
                                                    А можно как то с подобной кнопки включать ПК (или вообще с USB-клавиатуры)? Желательно без разбора корпуса ибо ноутбук (про wake on lan знаю, там нужно второе устройство, которое будет инициировать включение).
                                                    • +1
                                                      Ноутбуки часто отключают USB порты в спячке, так что разбудить ноут проблема несколько больше простейшей.
                                                    • +1
                                                      В итоге Китайцы рулят. Замах на 1000$ удар 10 центов.
                                                    • +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"

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

                                                          Интересные публикации