Предисловие


В данной статье рассмотрим как сделать руку-клавиатуру, а также самодельный датчик изгиба (сгибания). На одной руке, как правило, 5 пальцев — это дает сделать 32 (2^5) комбинации. Но на русский язык не потянет (33-32 символа), а вот на английский язык как раз, ещё и останется место для space/backspace/enter и т.д.


Немного идей: если подумать, то это интересный джойстик; если присоединить вторую руку, то это 1024 комбинации, а это возможно музыкальный инструмент; внедрить гироскоп/акселерометр и улучшить до мышки.


Подготовка


Нам понадобится:


  • Arduino — разницы особо нету какую использовать, потребуется 5 аналоговых входов, 3.3V, 5V
  • Блютуз модуль — связь в одну сторону, поэтому разницы нет, у меня был hc-06
  • 5 фоторезисторов (3 мм.), 5 светодиодов (3 мм.)
  • Термоусадка, трубка из под капельницы, провода
  • Резисторы: 1 кОм (х5)
  • Питание — крона

Датчик изгиба


Прежде чем открывать IDE нужно собрать хотя бы один датчик изгиба и удостовериться в его работоспособности. Почему бы его не купить? Так как его в своем городе не нашел, а в Китае стоит 20$/штука, кроме того максимум я находил длиной в 8 сантиметров, выигрывают они только формой (тонкие).


До этого с фоторезисторами не имел дела, поэтому для начала просто посмотрел на принцип работы, подобрал сопротивление, оценил диапазон, а также выявил что из 10 купленных 1 не работал, не зря проверял.


Фоторезистор


После собраться собственно сам датчик. На рисунке изображена схема датчика, я думаю понятно что необходимо сделать.


image


Советую постараться найти фоторезисторы именно 3 мм., так как иначе вставить их в трубку очень проблематично. Вот что получилось:


image


Проводов таких тонких у меня не было, а оптоволокно завезли уже… В общем телефонный провод как раз.


image
image


Теперь можно натянуть термоусадку и убедится в работе.


image


Проверить работоспособность можно таким кодом:


const int pinPhoto = A0;
void setup() {
pinMode( pinPhoto, INPUT );
}
void loop() {
  Serial.println(  analogRead( pinPhoto ) );
  delay(100);
}

Выводиться должно значение от 0 до 1024, у меня вышло так:


image

Сгибаем датчик:


image


Скетч и код на ПК


Будет две программы: скетч на плату и программа на ПК. Так как готов только один датчик, а уже очень хочется узнать реально ли эмулировать клавиатуру через Arduino, то включим пк. А пока “заменим” датчики изгиба на кнопки:


image


Программа на ПК


Что нам надо? Получить данные с блютуз модуля, соотнести с нужным символом, задействовать клавишу в нужное окно. Код по ссылке.


Алгоритм:


  • Присоединится по блютуз
  • С помощью ReadCOM() считываем байт посылаемый микроконтроллером, отправляем значение в метод SendKey, так же туда отправляется хэндл текущего окна, чтобы метод знал куда записать символ
  • Проверяем что к нам пришло, если это значение соответствует space, backspace, enter, то сработает нужное нажатие, если же ни один из вышеперечисленных, то возьмется из массива нужный символ

Зачем массив если можно было пустить по порядку все символы? Да, можно было, так и было на какой-то стадии, но некоторые комбинации для пальцев легче чем другие, а так же есть определенная частота использование тех или иных букв в алфавите:


image

Может показаться что уже за нас всё сделано, но не тут то было, сколько я не гуглил “сложность комбинаций пальцами рук” и тд, ничего годного не нашел. Пришлось самостоятельно и субъективно оценивать сложность комбинаций, для каждого советую эту таблицу заполнить самостоятельно и переписать массив. Кратко: самая легкая комбинация — самая частая буква.


1


00001


g


2


00010


t


3


00011


n


4


00100


space


5


00101


z


6


00110


s


7


00111


h


8


01000


e


9


01001


q


10


01010


r


11


01011


d


12


01100


l


13


01101


u


14


01110


o


15


01111


backspace


16


10000


a


17


10001


c


18


10010


m


19


10011


w


20


10100


f


21


10101


y


22


10110


p


23


10111


b


24


11000


i


25


11001


v


26


11010


k


27


11011


x


28


11100


j


29


11101



30


11110



31


11111


enter



Скетч на Arduino


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


  1. Получить один из сигналов
  2. Записать его в переменную sendValue
  3. Дождаться комбинации 00000 (разжал пальцы), либо если пришел сигнал больше sendValue, то запишем новый сигнал в sendValue
  4. Если комбинация 00000 и sendValue не равен 0, то отправляем данные

Как считается полученное число с датчиков? Обычным переводом с двоичной системы в десятичную, каждый последующий сигнал + 2n.


Зачем такой механизм? Мы не можем одновременно нажать на необходимые кнопки, либо, что еще сложнее, согнуть нужные пальцы в одно мгновение, поэтому нам нужно не отправлять сразу данные, а ждать “последняя ли это комбинация?”, поймём мы это с помощью изначальной комбинации( 00000 ), это будет как “стопбит”, после которого программа будет понимать, что следует направить число, если там конечно же лежит не сам “стопбит”.


Зачем нужно сравнивать sendValue и новый сигнал? После того как человек загнул, например, 01011 и начинает разгибать пальцы для исходной комбинации (00000 ), то он уже сделает другую комбинацию, так как пальцы мы разжимаем тоже не мгновенно, после того как пользователь разожмет любой из пальцев комбинация сразу станет по числовому значение меньше, чем была в “пик”, именно по-этому запоминает ”наибольшую” комбинацию.
Константы представленные на скрине (600, 350, 300, 300, 480) были подобраны практическим путем, каждый датчик в отдельности выводил, загибал палец до комфортного “изгиба” и записывал текущее значение.


image



Сборка устройства


Общая схема представлена на рисунке ниже. На самом деле самое сложно, как оказалось, это учитывать размеры, некоторые провода свободно висят и мешают, а другие натягиваются и иногда рвуться. Кроме того датчики вышли больше чем надо для пальцев, эдак взял с запасом ) И собственно сама перчатка, я взял строительную, что не совсем привлекательно. Также если клеить непосредственно сразу на перчатку, то при сгибание датчики будут уходить в бок, поэтому решено было посадить их на липучки и в случае чего их можно снять.


image



image



Вторая версия


После того как собрал “устройство” было решено сделать “всё по новой”, несколько улучшений:


  • Убрать резисторы для светодиодов, так как 5 светодиодов Arduino с выхода 3.3 вольта отлично вывозит и без резисторов
  • Убрать резисторы и пайку с трубки капельницы, так как теряется удобство сгибание пальцами, а так же эта пайка ломается и поместить туда резисторы вовсе была очень плохая идея
  • Положить плату на шилд, так как и проводов много, и смотрится все не очень красиво

Схема не сильно изменилась:


image


Несколько фото новой версии:


image



image



image



Результат


Рука-клавиатура не новый проект, но сделать самому и редактировать как душе угодно намного приятнее готового, тем более мы получаем не только клавиатуру, а универсальное устройства, которое можно связать и с телефоном, и с другими устройствами (управлять, например, “механической рукой”). Также на заметку кому-нибудь такие датчики, вдруг пригодятся )


Стоимость


Резисторы 1кОм(5х) + Светодиоды(5х)


~ 0.5$


Arduino Nano


~ 2$


Shield Arduino Nano


~ 2.5$


Термоусадка, капельница, липучки, перчатка, клей


~ 2$


HC-06


~ 3$


Итого:


10$


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


  1. ferreto
    17.12.2017 23:12

    Можно ли практический пример работы? Скажем, мне нужно написать:
    var i = 0;
    и нажать ввод


    1. DrSavinkov
      18.12.2017 02:07

      Поддерживаю. Было бы хорошо увидеть видео, на котором уважаемый автор продемонстрирует работу перчатки. «hello world», например (с учётом того, что кроме алфавита не сильно много символов на одной руке закодировать можно, я не прошу знаки препинания и т.п.).


  1. Nikobraz
    18.12.2017 07:11

    Хм, а это идея. Спасибо за мое новое хобби.


  1. ZurgInq
    18.12.2017 07:28

    А что делать с мизинцем, который не хочет как правило сгибаться отдельно от остальных пальцев?


    1. MasMaX
      18.12.2017 10:11

      Тренировать его


    1. Zenitchik
      18.12.2017 14:34

      Вы не поверите, я даже не догадывался о подобной проблеме с мизинцем. Вот безымянный…


    1. igormich88
      18.12.2017 16:54

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


    1. leshabirukov
      18.12.2017 22:53
      +1

      Зато указательный и большой гнутся в двух суставах.


    1. Oberon812
      19.12.2017 11:08

      Тренировать книжкой «Фортепьяно для начинающих». Потом — «Фортепьяно для продолжающих». И так до книжки «Фортепьяно для законченных».


  1. mikkab
    18.12.2017 08:46

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


  1. Erenzil
    18.12.2017 09:17

    Выглядит круто, хотелось бы опробовать с HTC Vive.
    Мучает один вопрос. Зачем фотодатчики, когда можно сделать что-то вроде триггеров на контроллерах от хуана? Они будут еще и степень изгиба замерять.
    ИМО такую перчатку надо делать для игр типа Surgeon Simulator, там вроде какие-то контроллеры от razer поддерживались, которые выглядели неплохо, но расположение кнопок казалось нелогичным (все кнопки под большими пальцами? почему нельзя сделать по кнопке под каждым пальцем а сам контроллер закрепить ремешком?).


    1. igormich88
      19.12.2017 12:21

      Так и тут я так понимаю уровень сигнала меняется от степени изгиба, другое дело что необходима и возможно точность будет низкая, при переводе сигналов с датчиков в углы.
      Кстати безотносительно перчатки было бы интересно посмотреть график зависимости силы сигнала от величины/плавности сгиба.


  1. pulsatrix
    18.12.2017 10:44

    Видео не видел я.
    Почему в таких статьях нет видео(частенько). Что за садизм? Просто поясните причины, пожалуйста.


  1. 3aicheg
    18.12.2017 11:28

    Как-то оргвыводов не хватает: чего реально в итоге добился автор, чувствительность девайса, практическая юзабельность (не в мечтах, а по факту), вот это вот всё.

    Из идей, можно ещё сделать управление жестами: допустим, большой палец вверх, или большой + указательный колечком — нажать ОК, кулак с отогнутым средним пальцем — Cancel. Или на одной руке колечком и пальцем второй подвигать туда-сюда — команда «открой мой любимый порносайт… и перестань распознавать жесты минут на пять, а то хз как ты интерпретируешь, когда я перчатки буду снимать-надевать».



  1. shtushkutush
    18.12.2017 13:29

    Первый шаг сделал! Осталось «прикрутить» гироскоп, написать драйвер и влиться в число разработчиков ПО для VR


  1. allseek
    18.12.2017 16:19

    Посмотрите Microwriter Alphabet. Там такой же принцип. И все ж, стандарт как никак.
    image


    1. Zenitchik
      18.12.2017 18:40

      А это для каких устройств ввода?


      1. Andy_Big
        18.12.2017 19:01

        Беглое гугление подало мысль, что для устройств Microwriter :)


  1. romualdinio
    19.12.2017 00:29

    Для среднестатистического человека сложно согнуть мизинец, не сгибая безымянный палец. Так что безымянный и мизинец вместе дают три, а не четыре комбинации. Умножает на 8 комбинаций от первых трех пальцев, получаем 24 комбинации, а не 32.
    Для 32 комбинаций надо полгода тренироваться гнуть мизинец )))


  1. dimon753
    19.12.2017 00:30

    Выглядит не эстетично, + куча тонких проводов, которые можно порвать…


  1. pspetrov
    19.12.2017 00:30

    А почему бы не использовать в качестве датчика изгиба бумагу с графитом?
    geektimes.ru/post/247708