- PVSM.RU - https://www.pvsm.ru -
В данной статье рассмотрим как сделать руку-клавиатуру, а также самодельный датчик изгиба (сгибания). На одной руке, как правило, 5 пальцев — это дает сделать 32 (2^5) комбинации. Но на русский язык не потянет (33-32 символа), а вот на английский язык как раз, ещё и останется место для space/backspace/enter и т.д.
Немного идей: если подумать, то это интересный джойстик; если присоединить вторую руку, то это 1024 комбинации, а это возможно музыкальный инструмент; внедрить гироскоп/акселерометр и улучшить до мышки.
Нам понадобится:
Прежде чем открывать 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, то включим пк. А пока “заменим” датчики изгиба на кнопки:
Что нам надо? Получить данные с блютуз модуля, соотнести с нужным символом, задействовать клавишу в нужное окно. Код по ссылке [1].
Алгоритм:
Зачем массив если можно было пустить по порядку все символы? Да, можно было, так и было на какой-то стадии, но некоторые комбинации для пальцев легче чем другие, а так же есть определенная частота использование тех или иных букв в алфавите:
Может показаться что уже за нас всё сделано, но не тут то было, сколько я не гуглил “сложность комбинаций пальцами рук” и тд, ничего годного не нашел. Пришлось самостоятельно и субъективно оценивать сложность комбинаций, для каждого советую эту таблицу заполнить самостоятельно и переписать массив. Кратко: самая легкая комбинация — самая частая буква.
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
|
Для начала: разницы между кодом для кнопочной версии и версии с датчиками практически нету, за исключением пару строк для считывания данных. Способов считать данные много есть, но самый хороший алгоритм мне показался такой:
Как считается полученное число с датчиков? Обычным переводом с двоичной системы в десятичную, каждый последующий сигнал + 2n.
Зачем такой механизм? Мы не можем одновременно нажать на необходимые кнопки, либо, что еще сложнее, согнуть нужные пальцы в одно мгновение, поэтому нам нужно не отправлять сразу данные, а ждать “последняя ли это комбинация?”, поймём мы это с помощью изначальной комбинации( 00000 ), это будет как “стопбит”, после которого программа будет понимать, что следует направить число, если там конечно же лежит не сам “стопбит”.
Зачем нужно сравнивать sendValue и новый сигнал? После того как человек загнул, например, 01011 и начинает разгибать пальцы для исходной комбинации (00000 ), то он уже сделает другую комбинацию, так как пальцы мы разжимаем тоже не мгновенно, после того как пользователь разожмет любой из пальцев комбинация сразу станет по числовому значение меньше, чем была в “пик”, именно по-этому запоминает ”наибольшую” комбинацию.
Константы представленные на скрине (600, 350, 300, 300, 480) были подобраны практическим путем, каждый датчик в отдельности выводил, загибал палец до комфортного “изгиба” и записывал текущее значение.
Общая схема представлена на рисунке ниже. На самом деле самое сложно, как оказалось, это учитывать размеры, некоторые провода свободно висят и мешают, а другие натягиваются и иногда рвуться. Кроме того датчики вышли больше чем надо для пальцев, эдак взял с запасом ) И собственно сама перчатка, я взял строительную, что не совсем привлекательно. Также если клеить непосредственно сразу на перчатку, то при сгибание датчики будут уходить в бок, поэтому решено было посадить их на липучки и в случае чего их можно снять.
После того как собрал “устройство” было решено сделать “всё по новой”, несколько улучшений:
Схема не сильно изменилась:
Несколько фото новой версии:
Рука-клавиатура не новый проект, но сделать самому и редактировать как душе угодно намного приятнее готового, тем более мы получаем не только клавиатуру, а универсальное устройства, которое можно связать и с телефоном, и с другими устройствами (управлять, например, “механической рукой”). Также на заметку кому-нибудь такие датчики, вдруг пригодятся )
Резисторы 1кОм(5х) + Светодиоды(5х)
|
~ 0.5$
|
Arduino Nano
|
~ 2$
|
Shield Arduino Nano
|
~ 2.5$
|
Термоусадка, капельница, липучки, перчатка, клей
|
~ 2$
|
HC-06
|
~ 3$
|
Итого:
|
10$
|
Автор: Fridreman
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/270911
Ссылки в тексте:
[1] по ссылке: https://github.com/Fridreman/keyemulator
[2] Источник: https://geektimes.ru/post/296513/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.