- PVSM.RU - https://www.pvsm.ru -
В этой статье я расскажу о том, как мы собирали перчатку для определения положения руки на конкурс. Сложности в ее изготовлении конечно есть, но собрать ее под силу даже школьнику. Такую перчатку можно использовать как для управления электроникой, так и в качестве манипулятора для различных игр.
Те, кто читал статью про сканер [1], вероятно помнят, что я обещал продолжения. Но из-за конкурсов у меня все никак не находится времени для этого. Зато сейчас я сижу после конкурса и пишу статью о части нашего проекта. На выставке меня попросили рассказать про принцип работы этого девайса, потом попросили контакты, а потом я просто решил, что лучше напишу статью и решу проблему более чем двух человек. Изначально с помощью этой перчатки мы управляли электроникой (включали чайники по Интернету с помощью жестов), а теперь используем ее для трекинга положения руки. Вот собственно и все введение.
Жестовые перчатки можно разделить на несколько типов (что-то могу пропустить):
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. Этот регистр можно только прочитать и его дефолтное значение можно найти в даташите. Для нашего акселерометра этот регистр располагается по адресу 0x0F, а дефолтное значение 0x3B. То есть в акселерометр мы посылаем сначала 0x8F, потом любые 8 бит, а считать должны 0x3B. Если прочитали что-то другое, то где-то косяк. Либо в пайке, либо отправляем не те данные, либо перегрели микросхему при пайке. Может скорость слишком большая. И еще не забываем ножку CS подтягивать к земле и возвращать обратно. Если вы приняли правильный данные, то вас можно поздравить — осталось запаять всего 4 датчика. Получится вот такая картина:
После запайки всех пяти датчиков (по одному на каждый палец), мы крепим их на перчатку. Я для этого использовал термоклей. Получилось вот что:
Для того, чтобы мы начали получать какие-нибудь данные с микросхемы, ее надо включить. Для этого нужно установить в единицу бит BOOT регистра CTRL_REG2 и записать в регистр CTRL_REG1 значение 0xC7. Первое — это перезагрузка акселерометра, а второе — это вывод датчика из режима энергосбережения, установка частоты дискретизации 400Hz, и включение всех трех осей.
Все данные с осей x,y и z записываются в регистры с адресами 0x29, 0x2B и 0x2D соответственно. Для того, чтобы получить данные просто читаем их и все (не забываем, что если мы читаем, то 0bit первой посылки — 1). Тут очередное «если» с подвохом: если вы прочитали данные, а там сплошные нули, а код точно рабочий и правильный, то посмотрите внимательно на название своих акселерометров. Там может быть не LIS331DL, а LIS331DLH. Что дает эта буква? А датчик теперь 16-битный, так еще и с большим количеством настроек. Из-за этого адреса регистров меняются. Я на поиск этого косяка убил часа 4, не меньше. Обидно было. Но предположим, что вы все сделали правильно. Тогда вы получите вот такой трэш в терминале:
Я сомневаюсь, что на мирно лежащий на столе акселерометр действуют такие ускорения. Вероятно все дело в помехах. Не, ну а чего мы хотели за 30 рублей? Придется нам как-то от них избавляться. Для этого нам нужен фильтр. Проще всего реализовать его софтварно (внутри датчика вроде как имеется фильтр, но у меня он почему-то не заработал). Выглядит он до безобразия просто: новое значение = старое значение + измеренное значение * коэффициент. Понятно дело, что частота среза зависит от коэффициента, который нужно подбирать самим под свои задачи.
В простейшем случае можно просто смотреть на знак числа, которое мы приняли. Завести массив на пять пальцев, и слать этот массив на компьютер. Мол, если палец загнули, то 1, а если выпрямлен, то 0. Например, 11011. Именно это и было реализовано в первой перчатке, ибо большего и не требовалось. Но вполне реально определить и угол наклона. Для этого мы просто берем арктангенс отношения ускорений по двум осям и получаем угол наклона вдоль плоскости, в которой лежат эти оси. Сделав это для трех пар осей, можем найти углы наклона по трем осям и восстановить положение датчика в трехмерном пространстве. Но, думаю, это никому не понадобится. Даже не из-за того, что задача не будет этого требовать, а из-за того, что для таких задач нужно использовать шестиосевой датчик (акселерометр+гироскоп) или еще лучше девятиосевой (акселерометр+гироскоп+магнитометр). Но они стоят гораздо дороже и работа с ними уже несколько сложнее.
Надеюсь, что тем, кто хотел собрать что-то подобное статья поможет. Мне бы в то время помогла. Сейчас мы уже победили в одном конкурсе с этой перчаткой, и даже сделали на девятиосевых датчиках новую перчатку, с которой победили на другом. Правда по секрету скажу, что магнитометр у меня так и не заработал, но об этом никто не знает. Перчатка и без него неплохо работает, так что я бы лучше купил более дешевые шестиосевые датчики. Теперь конкурсов в ближайшем будущем не предвидится, так что я постараюсь написать про 3d сканер вторую статью, как и обещал.
P.S. Забыл собственно разводку платы для датчика прикрепить:
Плата в SprintLayout [2]
Автор: Hellitron
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/82920
Ссылки в тексте:
[1] статью про сканер: http://habrahabr.ru/post/247423/
[2] Плата в SprintLayout: https://www.dropbox.com/s/027c5ltaaghcz4r/AccelAdaptor.lay6?dl=0
[3] Источник: http://habrahabr.ru/post/250555/
Нажмите здесь для печати.