触覚VRデバイスの実装２：人差し指への力覚提示

#はじめに
前回の投稿"[触覚VRデバイスGravity Grabberを作ってみた](https://qiita.com/YI_D/items/7003d5c502c5c53e54d9)"では指先へのフィードバックデバイスとして、Gravity Grabberを実装しました。今回は新たに設計した"指の腹"への力覚提示デバイスの説明です。
指への力覚提示というと外骨格型のデバイスがすでに製品化されていますが結構ごっついです。ここでは人差し指に特化し、こじんまりとした実装で触覚提示を検討します。



#実現したい触覚
・手で硬いモノを握ったときのグリップ感（握ったときの物体からの反力）
Gravity Grabberが指でつまむ・触るを再現するデバイスだとすると、今回は”握る”を目指します。

#デバイス外観

単体
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/d2a8c51f-980c-63e4-8aca-8b402618d265.jpeg" width="800px">

装着時
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/065e4bca-d3ad-78c7-d5f3-3b85b1f08230.jpeg" width="800px">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/70e76ade-44a5-0fd8-efba-e9a17faec08e.jpeg" width="800px">

使わないときは折りたたみ可能
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/26741afe-b8fa-0389-65a6-e011e4da752e.jpeg" width="800px">

手への固定方法は、イケてるこちらの作品を参考にしました→[The Third Thumb](https://www.redbull.com/jp-ja/third-thumb-interview)

#動作
生成される触覚・力覚の確認のための簡単な動作テストです。[感圧センサ](https://www.switch-science.com/catalog/2614/)を右手の人差し指の腹に固定。右手の人差し指の腹で感じる力覚を左手にコピーしています。具体的には右手の感圧センサの値をPWM値に変換して左手のデバイスのモータにドライバを介して出力しています。また、力が発生していない場合は折りたたみ指の動作を邪魔しないようにしています。

◼️テスト動作　感圧センサ → モータ駆動
クリックで動画再生
http://www.youtube.com/watch?v=0Tv-0s_4Hgs
[![No Link](http://img.youtube.com/vi/0Tv-0s_4Hgs/0.jpg)](http://www.youtube.com/watch?v=0Tv-0s_4Hgs)

◼️装着時の動き
クリックで動画再生
http://www.youtube.com/watch?v=oyqwXdVthdA
[![No Link](http://img.youtube.com/vi/oyqwXdVthdA/0.jpg)](http://www.youtube.com/watch?v=oyqwXdVthdA)

※デバイスの感触を確かめるための簡易的なテストのため、デバイスの動作速度に合うように手を閉じる速さをユーザ側で調整しています。



#機構
・アクチュエータ：DCモータ, [EEHD-53AF  SparkFun 小型ギヤードモーター【6V~12V 140RPM~270 RPM】  ROB-12125](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-53AG), ¥1560, 1個
シンプルに１軸のモータでトルク出します。モータはPWM制御で電流（＝トルク）を制御します。素材は[dmm.makeのMJFナチュラル](https://make.dmm.com/print/material/85/)です。3Dプリント後は灰色のため黒で塗装しました。
また、モータとの取り付け軸は、以下の正面からの図にある橙色の部品（イモネジ）で接合を試みましたが何度も力覚提示していると緩むので、諦めてセメダインで固定しています。予算があればモータとの接合部分は金属で制作することをお勧めします。

・灰色＝モータ
・青色＝手の平への固定パーツ
・赤色＝力覚提示パーツ（モータ軸に固定）
・橙色＝イモネジ

-斜め前
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/88e4b1be-fe09-dfd3-66d2-bcf3103e0898.png" width="500px">

-斜め後ろ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/68808238-de28-eed1-4c25-531e1e7048d8.png" width="500px">

-正面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/c40dc931-f004-23d4-69ee-cdcb195888bb.png" width="500px">

-後ろ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/ddb362a9-75d9-184b-cdd8-ecdcbefb9ec4.png" width="500px">

-横
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/7e33eafd-76f0-df01-8ed8-3bce6b17d12a.png" width="500px">


#電気回路
以下のモータドライバにDCモータを接続します。モータ駆動用電源の電圧は9Vにしていますが、人差し指に対してかなり強い力を出せます。

DCモータは流れる電流とトルクが比例関係にあり電流はPWM制御します。データシートにも記載がありますが、上記のモータドライバの制御入力にPWM信号を入れることで電流＝トルクを制御可能です。


モータドライバ：[デュアルモータードライバDRV8833](https://www.switch-science.com/catalog/1636/), ¥583, 1個

このモータドライバのPWM信号の周波数はtypが50kHzですが、Arduinoのanalog write（PWM出力）のデフォルト周波数は490Hzです。
これでもトルクはある程度制御できるのですが、可聴域のためモータ駆動時に"キー"という音が聞こえてしまいます。
そのため、以下を参考に可能な限り50kHzに近い周波数に変更しました。
http://sobisource.com/arduino-mega-pwm-pin-and-frequency-timer-control/

Arduino MegaのPin2,3を使用したので以下の設定で31.374 KHz駆動に変更

TCCR3B = (TCCR3B & 0xF8) | 0x01 ;

#制御コード
Arduino Megaでの制御コードです。

・右手の感圧センサ(wight sensor）の値を読み取る
  ↓
・感圧センサの値が閾値(ここでは8）以下なら、力は生じてないものとし指から離れる方向に回転。
・閾値以上なら感圧センサの値に比例したPWM値を出力
　計算式（係数は使った感じのチューニングで決定）
　motorPWM = 1.8*0.334*weightSensorValue + 149.66;


```

//感圧センサのAD変換ピン
int weightSensorPin = A13;

int weightSensorValue = 0;

//モータドライバへの制御ピン
int BIN1 = 2;
int BIN2 = 3;

void setup() {
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);

  //PWM周期を31.374 KHzに変更
  TCCR3B = (TCCR3B & 0xF8) | 0x01 ;

  analogWrite(BIN1, 0);
  analogWrite(BIN2, 0);

  Serial.begin(9600);
  while (!Serial);
  
}


void loop() {
  int motorPWM;

  //感圧センサの値を読み取る
  weightSensorValue = analogRead(weightSensorPin);
  Serial.println(weightSensorValue);

  
  if(weightSensorValue <=8){
    //閾値以下なら力は生じてないものとして指から離れる方に回転
    motorPWM = 0;
    analogWrite(BIN1, 150);
    analogWrite(BIN2, 0);

  }else{
    //出力するPWM信号のDuty比を計算
    motorPWM = 1.8*0.334*weightSensorValue + 149.66;

    //220を超えると力が出すぎるため上限220に制約
    motorPWM = min(220, motorPWM);

    analogWrite(BIN1, 0);
    analogWrite(BIN2, motorPWM);
  }
}

```

#使用感と今後
使用感
・人差し指に対しては力覚提示は十分に可能
・握るという感覚をより明確に表現するためには、人差し指だけでなく少なくとも親指にも力を提示した方が良さそう。
　人差し指だけだと不十分な感じ。実装の簡素を残しつつ多指への力覚提示がポイントか。
・折りたたんだ時には指の動作は全く邪魔されない。

今後
・数Hz程度で力覚を提示して動くものを手で握ったときのブルブル感・モゾモゾ感（例えば、釣った魚を握ったときのブルブル）を表現
・多指への力覚提示とシンプルな実装の両立
・指の角度のセンシングと角度に応じた力制御
・今回は手のひらに近い方の節（下の矢印）に力覚を提示したが、真ん中の節（上の矢印）に力覚提示した方が良いかもしれない。
![616NNOVmo+L._SY445_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/a0b8d1d5-1295-8ebb-560d-a0c34a08adeb.jpeg)

あと、モータがかなり熱くなるので安全設計も必要です・・・・。

#追記
上記の一部を改善したバージョンを設計中です。
[触覚VRデバイスの実装３：指への力覚提示（多指＋２軸）](https://qiita.com/YI_D/items/fa212344905f0f3445f2)





以上