ウェアラブルキーボード作ったった

![タイトル_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251371/118898ba-2526-6fd4-f4a4-fb363441e59f.png)

# ウェアラブルキーボードとは
体に身につけて使用できる入力デバイスです．
今回は市販の手袋を使用しました．
まずは**[PV](https://youtu.be/wl-knkEEWxo)**をご覧ください．↓

[![https://youtu.be/wl-knkEEWxo](http://img.youtube.com/vi/wl-knkEEWxo/0.jpg)](http://www.youtube.com/watch?v=wl-knkEEWxo)


# ユースケース
以下の場合を想定しています．

- AR・VRデバイスの使用中
- スマートウォッチ使用中
- 運動中
- ベッドで横たわっているとき

片手で操作できるので，片手しか動かせない人も使えます．

# 技術的な話
ここからはデバイスの原理的な話と作製方法について書いていきます．
材料さえ手に入れば誰でも簡単に作製が可能です．

## 使用した材料
- Arduino [AE-ATMEGA328-MINI(Arduino Pro Mini上位互換)](http://akizukidenshi.com/catalog/g/gK-10347/)
- Arduinoの書き込み用モジュール [FTDI USBシリアル変換アダプター（5V/3.3V切り替え機能付き）](https://www.switch-science.com/catalog/1032/)
- Bluetoothモジュール [RN-42使用Bluetooth無線モジュール評価キット](http://akizukidenshi.com/catalog/g/gK-07378/)
- 導電糸 [Smart-X](https://www.fjx.co.jp/product/detail.php?id=125)
（株式会社フジックス様ご提供）
- 導電性インク [XE181G](https://www.namics.co.jp/products/stretch-pastes/)
（ナミックス株式会社様ご提供）
- DC-DCコンバータ [TPS61200 超低電圧DC-DCコンバータモジュール(3.3V/5V)](https://strawberry-linux.com/catalog/items?code=12010)<br>
→電池2本繋いで3V出せば必要はありません．
- 単4乾電池x1電池ボックス
- 市販の手袋（スポーツ用，合皮）
- 抵抗，乾電池

## ハードウェア側の作製
デバイスの原理の公開は検討中...

### 1. 手袋を裂く
市販の手袋の縫い合わせを解いていきます．
裂くのは4本指の部分だけです．
![S__10518549.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251371/869926a1-e3f4-fba6-2eba-e38de791809d.jpeg)
↑このように裂きます．

P.S.
布地から手袋を作製できる方は裂く必要はありません．
手形から布地を切り抜いてください．

### 2. 回路を縫う
導電糸で回路を縫います．家庭用ミシンで縫えます．

### 3. ボタンを作る
4本指のボタンと親指のリード線は導電性インクで塗って作ります．
導電性インクが手に入らない方は導電糸で縫っても大丈夫です．


### 4. 配線する
ArduinoとRN-42，手袋を配線します．

あらかじめ電池ボックスとDC-DCコンバータをハンダしておきます．
このDC-DCコンバータを使うことで，乾電池1本でも（電池がへたっても）3.3Vが常に出せることができます．
電池2本でいいよ，という方は読み飛ばしてください．

#### ピン配置の確認

- RN-42のピン配置
![RN42ピン配置.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251371/01009949-aa0e-748a-e471-1c7a26a6d732.png)
J3の列は使用しないのでピン配置は省きます．

- ArduinoProMiniのピン配置
<img width="500" alt="スクリーンショット 2019-11-08 11.59.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251371/5673ecec-f25a-750e-ed51-f212403dde9e.png">

#### 回路図（ブレッドボード）
下図のように配線します．
fritzingにAE-ATMEGA328-MINIがなかったためArduinoProMiniで代用しています．ピン配置に注意してください．
（ArduinoとRN-42の配線のみ公開）
![yubibo回路図_ブレッドボード_手袋なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251371/ba4842fa-1716-228f-ab66-e6b17e401cfc.png)


ポイントは

- RN-42のCTS（J2-4番）RTS（J2-5番）はショートさせます．
- ArduinoのD7をRN-42のTXD（J2-6番）に，ArduinoのD8をRN-42のRXD（J2-7番）に接続します．<br>ArduinoのD7をRX，D8をTXとして使い，RN-42とシリアル通信します．
- RN-42の3.3V（J1-11番）をArduinoのVCC（5V）に，RN-42のGND（J1-12番）をArduinoのGNDに直結させます．<br>RN-42の電源はArduino経由で供給します．


##### P.S.
Arduinoの5Vピンに3.3Vを入力していますが，きちんと3.3Vで駆動しますし5Vピンからはもちろん3.3Vが出力されます．
RN-42は5V入力すると壊れるので注意．

## ソフトウェア側の作製
全てArduinoで制御します．
環境は以下．

- Windows 10
- Arduino IDE 
- TeraTerm


### 1. RN42をHID化する
[RN-42評価キット](http://akizukidenshi.com/catalog/g/gK-07378/)はUSB-microB端子がついているので，USBケーブルでPCと繋げます．

RN-42の設定は全てターミナルソフトでコマンドを打つことで設定します．
コマンド一覧は[ここ](https://qiita.com/TakeoChan/items/a1148546d2e56b8173b8)が詳しく書いてあります．

#### 基本動作
TeraTermを起動し，`BaudRate=115200bps`で接続します．
TeraTerm上で

```
$$$
```

を入力してコマンドモードに入ります．このときだけ**Enterキーは押しません**．
`CMD`と返ってきます．コマンドモードに入ると緑色のLEDが非常に早く点滅します．

コマンドモードでは入力が表示されないので，`+`コマンドでエコーを有効にします．

```
+
```

`ECHO ON`が返ってきます．これで打った文字が見えるようになります．

デバイスの基本的な設定を表示するには

```
D
```

コマンドモードを終了するときは

```
---
```
と入力してEnterキーを押します．

#### 各種設定
以下，コマンドモードに入っていることを前提とします．

```
# デバイスに名前を付ける(SNコマンド)
SN,YUBIBO
# HIDモードにする(S~コマンド)
S~,6
# 再起動して設定を反映させる(Rコマンド)
R,1
```
`R,1`で再起動するとコマンドモードが終了し，緑色LEDがゆっくりと点滅するようになります．

#### テスト
TeratermでRN-42と接続したまま，スマホなどでRN-42とペアリングしてみましょう．

先ほど設定した名前で表示されているか確認し，接続してみます．

接続ができたら，Teraterm上で何かキーを打つと，接続先にキーが送信されます．


#### 参考にさせていただいたサイト
- http://workpiles.com/2014/04/rn42-bluetooth1/
- https://qiita.com/TakeoChan/items/a1148546d2e56b8173b8

### 2. Arduinoにプログラムを書き込む
Githubに公開予定．


#### キーをカスタマイズ
RN-42はHIDキーボードとして認識されるため，文字以外にも矢印キーやFnキーなども送信できます．

特定の文字を送りたい場合は，次のように単にその文字をシリアルでprintすれば良いです．

```c++
btSerial.print('s');
```
（`btSerial`は別で定義してあります）
次のようにすれば複数の文字列も送れます．

```c++
btSerial.print("hello,world!");
```


自分で送信するキーをカスタマイズしたい場合は，下の表のCodeの数字（16進数）の先頭に`0x`を付けてbyteで送信します．
ファンクションキーF1を送信したい場合は

```c++
sendKey((byte)0x3A);
```
とすれば良いです．（`sendKey`関数は別で定義してあります）

<img width="800" alt="スクリーンショット 2019-11-08 11.22.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251371/ceb44cdb-9f3e-3dd5-9a5a-a1349205cd6b.png">

上の表は[ここ](http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Wireless/Bluetooth/RN-HID-User-Guide-v1.0r.pdf)の11ページから拝借しました．

#### 参考にさせていただいたサイト
- https://qiita.com/ono4ji/items/84061d29fe015e39b860
- http://design-lab.tuqulore.com/arduion_with_bluetooth/

### 3. 閾値を設定する
各キーの領域を決定するため読み値の閾値を設定します．


## ペアリング
Bluetoothが使えるデバイスとペアリングします．
ペアリングを完了すると，ゆっくりと点滅していた緑色LEDが点灯したままとなります．

iPhoneSEで確認しました．
スマホでは，事前にキーボードを日本語にしておく必要があります．

# 最後に
###[GUGEN2019](https://gugen.jp/entry2019/2019-092)に応募しました！
ぜひ**ほしいね**をよろしくお願いします．


### [ヒーローズ・リーグ](https://protopedia.net/prototype/cf2226ddd41b1a2d0ae51dab54d32c36)に応募しました！
→ [XUIリーグ決勝](https://japanxrfest.com/2019/exhibition/)に進出しました．
→ 個人賞『XinSuzuki賞』を受賞しました！
→ MAリーグ決勝審査に進出しました．