Рукавичка для визначення положення руки на коліні

Від назви може виникнути враження, ніби це рукавичка для визначення положення руки, яка в свою чергу знаходиться на коліні. Але насправді це не так. Я сподіваюся, що у читачів підстави рук знаходяться досить далеко від коліна, так ще й мають досить великий радіус кривизни. Але зробити це, тим не менш, під силу навіть школяреві.



Ті, хто читав статтю про сканер, ймовірно, пам'ятають, що я обіцяв продовження. Але з-за конкурсів у мене все ніяк не знаходиться часу для цього. Зате зараз я сиджу після конкурсу і пишу статтю про нашого проекту. На виставці мене попросили розповісти про принцип роботи цього девайса, потім попросили контакти, а потім я просто вирішив, що краще напишу статтю і вирішу проблему більш ніж двох осіб. Спочатку за допомогою цієї рукавички ми управляли електронікою (включали чайники по Інтернету за допомогою жестів), а тепер використовуємо її для трекінгу положення руки. Ось власне і все введення.

Принцип роботи

Жестові рукавички можна розділити на кілька типів (що можу пропустити):

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.