Предисловие
В данной статье рассмотрим как сделать руку-клавиатуру, а также самодельный датчик изгиба (сгибания). На одной руке, как правило, 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 не работал, не зря проверял.
После собраться собственно сам датчик. На рисунке изображена схема датчика, я думаю понятно что необходимо сделать.
Советую постараться найти фоторезисторы именно 3 мм., так как иначе вставить их в трубку очень проблематично. Вот что получилось:
Проводов таких тонких у меня не было, а оптоволокно завезли уже… В общем телефонный провод как раз.
Теперь можно натянуть термоусадку и убедится в работе.
Проверить работоспособность можно таким кодом:
const int pinPhoto = A0; void setup() { pinMode( pinPhoto, INPUT ); } void loop() { Serial.println( analogRead( pinPhoto ) ); delay(100); }
Выводиться должно значение от 0 до 1024, у меня вышло так:
Сгибаем датчик:
Скетч и код на ПК
Будет две программы: скетч на плату и программа на ПК. Так как готов только один датчик, а уже очень хочется узнать реально ли эмулировать клавиатуру через Arduino, то включим пк. А пока “заменим” датчики изгиба на кнопки:
Программа на ПК
Что нам надо? Получить данные с блютуз модуля, соотнести с нужным символом, задействовать клавишу в нужное окно. Код по ссылке.
Алгоритм:
- Присоединится по блютуз
- С помощью ReadCOM() считываем байт посылаемый микроконтроллером, отправляем значение в метод SendKey, так же туда отправляется хэндл текущего окна, чтобы метод знал куда записать символ
- Проверяем что к нам пришло, если это значение соответствует space, backspace, enter, то сработает нужное нажатие, если же ни один из вышеперечисленных, то возьмется из массива нужный символ
Зачем массив если можно было пустить по порядку все символы? Да, можно было, так и было на какой-то стадии, но некоторые комбинации для пальцев легче чем другие, а так же есть определенная частота использование тех или иных букв в алфавите:
Может показаться что уже за нас всё сделано, но не тут то было, сколько я не гуглил “сложность комбинаций пальцами рук” и тд, ничего годного не нашел. Пришлось самостоятельно и субъективно оценивать сложность комбинаций, для каждого советую эту таблицу заполнить самостоятельно и переписать массив. Кратко: самая легкая комбинация — самая частая буква.
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
Для начала: разницы между кодом для кнопочной версии и версии с датчиками практически нету, за исключением пару строк для считывания данных. Способов считать данные много есть, но самый хороший алгоритм мне показался такой:
- Получить один из сигналов
- Записать его в переменную sendValue
- Дождаться комбинации 00000 (разжал пальцы), либо если пришел сигнал больше sendValue, то запишем новый сигнал в sendValue
- Если комбинация 00000 и sendValue не равен 0, то отправляем данные
Как считается полученное число с датчиков? Обычным переводом с двоичной системы в десятичную, каждый последующий сигнал + 2n.
Зачем такой механизм? Мы не можем одновременно нажать на необходимые кнопки, либо, что еще сложнее, согнуть нужные пальцы в одно мгновение, поэтому нам нужно не отправлять сразу данные, а ждать “последняя ли это комбинация?”, поймём мы это с помощью изначальной комбинации( 00000 ), это будет как “стопбит”, после которого программа будет понимать, что следует направить число, если там конечно же лежит не сам “стопбит”.
Зачем нужно сравнивать sendValue и новый сигнал? После того как человек загнул, например, 01011 и начинает разгибать пальцы для исходной комбинации (00000 ), то он уже сделает другую комбинацию, так как пальцы мы разжимаем тоже не мгновенно, после того как пользователь разожмет любой из пальцев комбинация сразу станет по числовому значение меньше, чем была в “пик”, именно по-этому запоминает ”наибольшую” комбинацию.
Константы представленные на скрине (600, 350, 300, 300, 480) были подобраны практическим путем, каждый датчик в отдельности выводил, загибал палец до комфортного “изгиба” и записывал текущее значение.
Сборка устройства
Общая схема представлена на рисунке ниже. На самом деле самое сложно, как оказалось, это учитывать размеры, некоторые провода свободно висят и мешают, а другие натягиваются и иногда рвуться. Кроме того датчики вышли больше чем надо для пальцев, эдак взял с запасом ) И собственно сама перчатка, я взял строительную, что не совсем привлекательно. Также если клеить непосредственно сразу на перчатку, то при сгибание датчики будут уходить в бок, поэтому решено было посадить их на липучки и в случае чего их можно снять.
Вторая версия
После того как собрал “устройство” было решено сделать “всё по новой”, несколько улучшений:
- Убрать резисторы для светодиодов, так как 5 светодиодов Arduino с выхода 3.3 вольта отлично вывозит и без резисторов
- Убрать резисторы и пайку с трубки капельницы, так как теряется удобство сгибание пальцами, а так же эта пайка ломается и поместить туда резисторы вовсе была очень плохая идея
- Положить плату на шилд, так как и проводов много, и смотрится все не очень красиво
Схема не сильно изменилась:
Несколько фото новой версии:
Результат
Рука-клавиатура не новый проект, но сделать самому и редактировать как душе угодно намного приятнее готового, тем более мы получаем не только клавиатуру, а универсальное устройства, которое можно связать и с телефоном, и с другими устройствами (управлять, например, “механической рукой”). Также на заметку кому-нибудь такие датчики, вдруг пригодятся )
Стоимость
Резисторы 1кОм(5х) + Светодиоды(5х)
|
~ 0.5$
|
Arduino Nano
|
~ 2$
|
Shield Arduino Nano
|
~ 2.5$
|
Термоусадка, капельница, липучки, перчатка, клей
|
~ 2$
|
HC-06
|
~ 3$
|
Итого:
|
10$
|
Источник