Перчатка для определения положения руки на коленке
От названия может возникнуть впечатление, будто бы это перчатка для определения положения руки, которая в свою очередь находится на коленке. Но на самом деле это не так. Я надеюсь, что у читателей основания рук находятся довольно далеко от коленки, так еще и имеют довольно большой радиус кривизны. Но сделать это, тем не менее, под силу даже школьнику.Те, кто читал статью про сканер, вероятно помнят, что я обещал продолжения. Но из-за конкурсов у меня все никак не находится времени для этого. Зато сейчас я сижу после конкурса и пишу статью о части нашего проекта. На выставке меня попросили рассказать про принцип работы этого девайса, потом попросили контакты, а потом я просто решил, что лучше напишу статью и решу проблему более чем двух человек. Изначально с помощью этой перчатки мы управляли электроникой (включали чайники по Интернету с помощью жестов), а теперь используем ее для трекинга положения руки. Вот собственно и все введение.
Принцип работыЖестовые перчатки можно разделить на несколько типов (что-то могу пропустить):1) На тензорезисторахНу это самое простое. Тензорезистор — это такая полосочка, от которой отходят два контакта. При растяжении/сжатии данной полосочки ее сопротивление меняется. Ставим на каждый подвижный сустав по такому датчику и получаем профит. Но эти тензорезисторы довольно дороги, нельзя определить направление сгиба и сама лента имеет приличную длину (около длинны пальца).
2) На «светодиодных трубках«Уже интереснее. Суть вот в чем: берется силиконовая или резиновая трубка, с одного конца трубки устанавливается светодиод, а с другого конца — фоторезистор/транзистор. Чем сильнее мы изгибаем такой датчик, тем меньше света попадает на фотодатчик, а соответственно увеличивается его сопротивление. Стоит такой датчик дешевле тензорезистора на порядок. Но имеет те же минусы: неудобно сгибать и нельзя определить направление сгиба.
3) Датчики ориентацииПод этим я подразумеваю различные акселерометры, гироскопы, магнитометры и различные их комбинации. Стоимость таких датчиков варьируется в огромных пределах, а основные проблемы возникают при их программировании. Именно такие датчики я и применил в перчатке.
Свой выбор я остановил на датчиках LIS331. Это восьмибитный трехосевой акселерометр. Просто потому, что они стоили тогда 30 рублей за штуку в розницу. Это вообще был мой первый опыт в использовании подобных датчиков, так что я решил: «если угроблю этот датчик, то не жалко будет».С акселерометра мы получаем разложение вектора ускорения датчика по трем его осям. Откуда ускорение? Ну как из космоса — на нас же ускорение свободного падения Земли действует. Тут нужно сказать о минусе этого датчика: этот самый вектор колеблется от любого дрожания рук, так что имеем мы на выходе высокочастотные помехи. Но для определения жеста, когда рука почти не двигается их применить можно.Собственно вот и вся задача: взять на каждую подвижную кость по датчику, подключить к микроконтроллеру, найти положение датчика, определить жест. Но не тут то было…
Плата под датчик Начнем с того, что этот датчик еще запаять надо. Вы думаете, что хорошо паяете? Знакомьтесь (шаг сетки на фотографии 0,5 мм):
LGA16. Он тоже рад знакомству. Именно из-за него мне и пришлось-таки купить паяльную станцию. Я очень люблю SMD. Детали маленькие и платки соответственно тоже маленькие выходят. Но это… В общем, теперь, после пайки MPU-9250, я говорю, что это халява, а тогда это был адище. Ну, хоть убить не жалко. Вооружившись программой для трассировки плат рисуем плату. Сначала площадку под микросхему. Наш лучший друг при пайке — поверхностное натяжение. Когда мы будем паять именно эта сила заставит микросхему встать на свое место. Поэтому площадки нужно делать довольно длинными, иначе микросхему это же поверхностное натяжение утянет в сторону. Все размеры берем из даташита. У меня не получилось в один слой сделать без перемычек, так что одна все-таки будет. На разводке она показана красной линией. Большие площадки для того, чтобы туда запаять шлейф. Так как шаг между этими площадками 2,54 мм и располагаются эти площадки и сверху и снизу от микросхемы, то шлейф с шагом между проводками 1,27 мм идеально нам подходит. Получится в итоге вот такая плата:
И вот такой датчик после пайки:
На фото хорошо видно беспорядок на столе за который я извиняюсь, что я имел в виду, когда говорил про шаг выводов. Ширина шлейфа почти равна ширине платы, а потому выглядит не совсем плохо. Но плату еще надо сделать и вытравить. Плата легко делается ЛУТом, а травлю я в перекиси водорода. Для достижения лучшего результата, я катаю плату в растворе при помощи электромотора. Можно разом сделать массив плат на одном куске стеклотекстолита. Это значительно ускорит процесс изготовления. После травления лудим плату и на этом этапе начинаются проблемы…
Пайка Этот процесс абсолютно бесполезно описывать. Лучше один раз увидеть видео. Я лишь скажу, что я закосячил 8 датчиков прежде, чем запаял 6 нужных мне. Ну первый раз такое паяю, можно и простить. Видео о пайке корпуса LGA прилагать не буду, так как их легко найти в поисковике, а засорять Интернет очередным не хочется.Еще полезный лайфхак: паяйте феном в каком-нибудь подносе/противне/тарелке/тазике в общем в чем угодно, у чего есть борта. Микросхемы сдуваются феном, и искать их практически бесполезно.
После запайки датчика запаиваем шлейф, вспоминаем, что забыли запаять перемычку, отпаиваем шлейф, запаиваем перемычку, возвращаем шлейф на место.
Плата микроконтроллера Это уже ваше дело, какой МК использовать. Здесь я расскажу про небольшую хитрость, про которую почему-то забывают. А позволяет она экономить ножки микроконтроллера, которых на некоторых платах и без того мало. А называется эта хитрость — логика. Не та, которая женская бывает, а та которая на 74HC начинается. Конкретно нас интересует 74HC164. Это сдвиговый регистр. Работает он довольно просто. У него есть ноги Data, Clock, Reset и выводы. Через Data и Clock мы последовательно передаем 8 бит, которые регистр параллельно выводит на выводы. А с помощью Reset можно установить все выводы в 0. Собственно подключаем ножки Enable акселерометров к этой микросхеме и с помощью одной микросхемы управляем восемью акселерометрами. Но нужно нам только пять, так что оставшиеся два можно занять светодиодами. Будет красивая подсветка. Вот только тут есть баг: когда мы будем ресетить микросхему, в «бит светодиодов» будет записываться 0. А так как мы данные пишем довольно быстро, то это моргание будет выглядеть как уменьшение яркости, что может заставить понервничать инженера. Собственно общая блок-схема перчатки будет выглядеть так:
При программировании нужно также помнить, что микросхема будет выбрана тогда, когда на ножке Enable (она же CS) будет логический ноль. Так что чтобы выбрать второй акселерометр, в регистр нужно будет записать не 01000000, а 10111111.
Программирование Обмен данными с акселерометром происходит так:0 bit — R/W bit. Если 1, то мы читаем данные, если 0, то пишем в датчик.1–7 bit — Адрес регистра, с которым мы собираемся работать.8–15 bit — Данные, которые мы пишем в регистр. Если мы читаем, то акселерометр просто их проигнорирует.Если с этим все понятно, то тогда читаем для начала регистр WHO_AM_I. Этот регистр можно только прочитать и его дефолтное значение можно найти в даташите. Для нашего акселерометра этот регистр располагается по адресу 0×0F, а дефолтное значение 0×3B. То есть в акселерометр мы посылаем сначала 0×8F, потом любые 8 бит, а считать должны 0×3B. Если прочитали что-то другое, то где-то косяк. Либо в пайке, либо отправляем не те данные, либо перегрели микросхему при пайке. Может скорость слишком большая. И еще не забываем ножку CS подтягивать к земле и возвращать обратно. Если вы приняли правильный данные, то вас можно поздравить — осталось запаять всего 4 датчика. Получится вот такая картина:
После запайки всех пяти датчиков (по одному на каждый палец), мы крепим их на перчатку. Я для этого использовал термоклей. Получилось вот что:
Для того, чтобы мы начали получать какие-нибудь данные с микросхемы, ее надо включить. Для этого нужно установить в единицу бит BOOT регистра CTRL_REG2 и записать в регистр CTRL_REG1 значение 0xC7. Первое — это перезагрузка акселерометра, а второе — это вывод датчика из режима энергосбережения, установка частоты дискретизации 400Hz, и включение всех трех осей.Все данные с осей x, y и z записываются в регистры с адресами 0×29, 0×2B и 0×2D соответственно. Для того, чтобы получить данные просто читаем их и все (не забываем, что если мы читаем, то 0bit первой посылки — 1). Тут очередное «если» с подвохом: если вы прочитали данные, а там сплошные нули, а код точно рабочий и правильный, то посмотрите внимательно на название своих акселерометров. Там может быть не LIS331DL, а LIS331DLH. Что дает эта буква? А датчик теперь 16-битный, так еще и с большим количеством настроек. Из-за этого адреса регистров меняются. Я на поиск этого косяка убил часа 4, не меньше. Обидно было. Но предположим, что вы все сделали правильно. Тогда вы получите вот такой трэш в терминале:
Я сомневаюсь, что на мирно лежащий на столе акселерометр действуют такие ускорения. Вероятно все дело в помехах. Не, ну, а чего мы хотели за 30 рублей? Придется нам как-то от них избавляться. Для этого нам нужен фильтр. Проще всего реализовать его софтварно (внутри датчика вроде как имеется фильтр, но у меня он почему-то не заработал). Выглядит он до безобразия просто: новое значение = старое значение + измеренное значение * коэффициент. Понятно дело, что частота среза зависит от коэффициента, который нужно подбирать самим под свои задачи.
Определение жеста В простейшем случае можно просто смотреть на знак числа, которое мы приняли. Завести массив на пять пальцев, и слать этот массив на компьютер. Мол, если палец загнули, то 1, а если выпрямлен, то 0. Например, 11011. Именно это и было реализовано в первой перчатке, ибо большего и не требовалось. Но вполне реально определить и угол наклона. Для этого мы просто берем арктангенс отношения ускорений по двум осям и получаем угол наклона вдоль плоскости, в которой лежат эти оси. Сделав это для трех пар осей, можем найти углы наклона по трем осям и восстановить положение датчика в трехмерном пространстве. Но, думаю, это никому не понадобится. Даже не из-за того, что задача не будет этого требовать, а из-за того, что для таких задач нужно использовать шестиосевой датчик (акселерометр+гироскоп) или еще лучше девятиосевой (акселерометр+гироскоп+магнитометр). Но они стоят гораздо дороже и работа с ними уже несколько сложнее.Заключение Надеюсь, что тем, кто хотел собрать что-то подобное статья поможет. Мне бы в то время помогла. Сейчас мы уже победили в одном конкурсе с этой перчаткой, и даже сделали на девятиосевых датчиках новую перчатку, с которой победили на другом. Правда по секрету скажу, что магнитометр у меня так и не заработал, но об этом никто не знает. Перчатка и без него неплохо работает, так что я бы лучше купил более дешевые шестиосевые датчики. Теперь конкурсов в ближайшем будущем не предвидится, так что я постараюсь написать про 3d сканер вторую статью, как и обещал.P.S. Забыл собственно разводку платы для датчика прикрепить: Плата в SprintLayout