ArduinoとBluetoothでお手軽ウェアラブルデバイスを作ってみた

## できるもの

手袋型のウェアラブルデバイス(プロトタイプ感満載)
手の形の遷移に応じてbluetooth(HID, keyboard)経由でPCに出力
例えば、グーの状態から親指、人差し指、中指と立てて、またグーにすると好きな文字が出せる。

### 動かしたイメージ

![1418446347fIX8awahm8ot3KX1418446337.gif](https://raw.githubusercontent.com/ono4ji/handsignglove/master/handsignAnime.gif)
->パワポにHello,World!を出力して、その後プレゼン開始、次のページへと遷移。

### 出来上がりのイメージ

![置いた状態](https://qiita-image-store.s3.amazonaws.com/0/35430/fd163abb-929f-bd07-7179-3323742f99c8.jpeg)

![つけた状態](https://qiita-image-store.s3.amazonaws.com/0/35430/c5153976-ed0a-2d6e-dfd2-c1d6f47f57cd.jpeg)

## きっかけ

とにかく作って、社内でプレゼンしたので振り返りも兼ねてQiitaに投稿。
作成期間は3週間。主にbluetoothモジュールと格闘してたので、手順のとおりやれば1,2日でできると思う。

電子工作は2014年7月から、師匠に教えを受けながらZigBeeでプチ会議室監視システムを作ったのがきっかけで始めた。電子工作で何かを一人で作ったのは今回初めて。

## 必要なもの

* arduino uno
* 曲げセンサ 親指用2.2インチ1個, その他4.5インチ2個(5本指にしたいなら2個追加)
* 抵抗 10K*3, 1K*1, 510*1
* RN42-XV(適当に買ってしまったので。。。評価Kitの方が楽)
* [XBeeピッチ変換基板](http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=7D27-SDKA)(RN42-XVだとあると楽)
* [USBバッテリ](http://www.amazon.co.jp/dp/B00DQ6THEA)
* Windowsマシン(MacだとBluetoothのペアリングがうまくいかず。。。[こちら](http://woodcode.blogspot.jp/2014/05/hidrn-42osx.html)と同じ状況)
* [Bluetooth受信機](http://www.amazon.co.jp/dp/B0071TE1G2) 2.1対応が必要(PCになければ)
* 布製の手袋(100均)

曲げセンサは2.2インチが千石の秋葉店になく、泣く泣く4.5インチにした(値段が1.7倍)ので、2.2インチでもよいはず。

道具的なもの
* ブレッドボードもしくはユニバーサル基盤
* ジャンパワイヤもしくは錫メッキ線
* より線
* 半田ごて、半田
* 熱収縮チューブ
* 裁縫道具
* arduino開発環境
* より線カッター(なくてもできたが、あると楽)

指が曲がっている、曲がっていないというのを判定して、その組み合わせで好きな操作ができるようにするのが今回作るもの。LeapMotionならもっと高精度で色々できるが、LチカのNextStepにはいい題材かと思う。

## Bluetooth受信機のアドレスを確認する

受信機にもよるのでここでは割愛。

## RN42の設定

出荷時点だとBluetoothのプロファイルがSPP(Serial Port Profile)になっているので、HIDに切り替えて、キーボードとしてPCから認識されるように設定を変更する。
また、デフォルトのボーレートが115,200でコマンドの結果文字が文字化けしたので、最初に9,600に変更する。

RN42-XVにしてしまったので、Arduino経由でコマンドを入力する。
(評価キットならPCにUSBでつないで直接Serialからコマンド打てばOK)

arduinoとrn42を以下の回路で接続します。

![RN42書き込み配線](https://qiita-image-store.s3.amazonaws.com/0/35430/4a0449c8-8963-2101-4df9-a2c482c7bb04.png)
arduinoの3.3VをRN42のVccにつなぐことだけ注意。arduinoからのTXは減圧してRN42のRXにつなぐ。
fritzingにRN42-XVのパーツがなかったので、仮でRN41を使用。
Arduinoからの接続は以下
* 3.3V -> Vcc
* GND -> GND
* D10 -> RX(1KΩ,510Ωを使って減圧)
* D11 -> TX

### ボーレートの変更

arduinoに設定用のプログラムを書き込み。
https://github.com/ono4ji/handsignglove/blob/master/sketch_bluetoothBaudRateSetting/sketch_bluetoothBaudRateSetting.ino 

ArduinoをPCとつないで、シリアルモニタを115,200baudにして、以下のコマンドを実行。

s[enter]
b[enter]
r[enter]

![コマンド実行結果](https://qiita-image-store.s3.amazonaws.com/0/35430/c6947210-b7a6-a86a-1ed0-d7eee6f06a3e.png)

### HID化

以下のソースを利用。
https://github.com/ono4ji/handsignglove/blob/master/sketch_bluetoothHIDsetting/sketch_bluetoothHIDsetting.ino

> if(c == 'n'){
L:119あたりの分岐内の設定はbluetooth接続先のアドレスとなるため、各自の環境にあわせて修正。
例）アドレスが00:12:34:56:78:90なら、
btSerial.print("SR,001234567890");

修正後、arduinoに設定用のプログラムを書き込み。

ArduinoをPCとつないで、シリアルモニタを9,600baudにして、以下のコマンドを実行。

s[enter]
d[enter]
m[enter]
p[enter]
k[enter]
n[enter]
d[enter]
r[enter]

![HIDコマンド実行結果](https://qiita-image-store.s3.amazonaws.com/0/35430/4bfeedcf-308d-15b3-1110-e3b640cb6cd6.png)

これでRN42の準備は完了。


## 手袋の制作

100均で買った手袋で、使わない方を素材とする。
左手の生地を切り取り、右手に縫い付ける。

![手袋裁縫イメージ](https://qiita-image-store.s3.amazonaws.com/0/35430/43e6e5a1-29ae-2cf8-e953-7b0e1f38357c.png)


出来上がりの写真
![1418448552538.jpg](https://qiita-image-store.s3.amazonaws.com/0/35430/2f289db6-4f17-e061-f630-408754f00986.jpeg)


## 曲げセンサとの回路を組む。

今回は後々使い回しができるように、部品との直結はせず、ピンヘッダと接続した上で、ピンソケット経由でつなげた。また、曲げセンサとGNDの間に入れる抵抗部分は練習のためユニバーサル基盤上に組みましたが、ブレッドボードでも問題ない。

![完成版回路図](https://qiita-image-store.s3.amazonaws.com/0/35430/b906185c-d927-1f7b-5aa4-7210b579125b.png)

## 全部くっつける。

## Arduinoに最終プログラムを書き込み

判定はかなり雑なロジックになっている。
現状、そもそもセンサーを正確に取り付けるのは難しいので、さくっと動かすぐらいなら問題ないレベルと思う。

https://github.com/ono4ji/handsignglove/blob/master/sketch_handsignglove/sketch_testtotal2.ino

## PCとのペアリング

PC側でBluetoothを検知したら、接続してペアリング。

## 手を動かして遊ぶ。


## PCに送る情報の変更したい場合

キーコードは以下の資料のP.11を参考。
[Bluetooth HID profile user manual](http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Wireless/Bluetooth/RN-HID-User-Guide-v1.0r.pdf)
sendKeyメソッドの引数に入れるbyteの値を変更すればOK。

また、HIDはキーボード以外にマウスも設定できる。その場合は、RN42の設定をマウスの220に変えて、シリアル出力もそれに合わせて変更する。上記リンクの資料を見るとやり方が載っている。

サンプル実装
https://github.com/ono4ji/handsignglove/blob/master/sketch_hidmouse/sketch_hidmouse.ino

## あとがき

ホールICをつけて、指の開閉も取得しようと思っていたが、磁石を検知する位置関係がかなりシビアで断念。
最初は曲げセンサではなく、ピエゾフィルムで行けるのではと考えてたが、瞬発系の出力しか取れず(調査不足)、泣く泣く5倍以上の値段の曲げセンサを使うことに。ピエゾでできたら3,000円ぐらいでできるかも。