nüno ver.2 キットを使って VR 用入力補助デバイスを作る

導電性布入門キット nüno ver.2 を使って膝上キーボードを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/43c600a8-cffc-3a7d-1e72-4738345b3934.png)


サンプルプログラムでは膝の上に載せた布デバイスをタッチすることでキーボードのタスク切り替え、ESC、Enter を入力できます。
膝の上に載せることで、視界が遮られるシーンでも良好なタッチ感、ホームポジションへの誘導感が得られます。VRでの補助入力デバイスに最適だと思うけど、どうかな?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a928d860-3657-f395-3897-be957acf5ee7.png)

# パーツリスト

- nuno ver.2 ケース 上下
- Arduino Nano 互換機
- 線材 数本
- 粘着ジェルテープ 約22cm
- 両面テープ 約1m
- 両面スポンジテープ 約3cm
- 絶縁シール 数個
- スポンジシート 約7x30cm 

# つくりかた
nüno ver.2 キットの基板を加工します。

ボタン電池電極x2を取り外し、Grove端子を取り外します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b6e30dcd-6514-11d0-16ce-61dc4e135842.png)

黄色い絶縁テープを貼り付け、両面スポンジテープを写真の位置に貼ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/84fb2723-e16b-a066-7cf6-a30cae4303a0.png)


Arduino Leonarudo 互換機を貼り付け、ケースしたにはめ込みます。ケースは一部削ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c4b78a9b-4a9c-1057-56c2-e8a825779687.png)


配線を以下のようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f24b9d89-650e-05bf-ef48-0fe47976b237.png)


|nuno ver.2基板側|Arduino側|信号名|ケーブル色|
|:---:|:---:|:---:|:---:|
|VCC|VCC|電源供給|赤|
|GND|GND|電源供給|黒|
|GROVE W|2(SDA)|I2C データ|白|
|GROVE Y|3(SCL)|I2C クロック|黄|

ケーブル色はGROVEケーブルの色に合わせています。

ケース上を適宜削ってはめ込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ff92ac87-1a6f-c496-538a-dae9e808a00d.png)

導電布を2つ折りにし、両面テープで貼り合わせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/13c624f1-0148-d763-22ae-92aa03dae570.png)

スポンジシートを両面テープで貼り付け、好きな形に切ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d2cd261b-e115-e14c-e0d5-9df90a27fa3b.png)

スポンジシートを膝の形に丸め、両面テープと粘着ジェルテープを貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/861ee3de-574b-82d1-4c76-b615232e0ed1.png)

microUSBケーブルでPCに接続します。膝に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a928d860-3657-f395-3897-be957acf5ee7.png)

サンプルスケッチは以下のとおりです。

ボード設定を LilyPad Arduino USB としてください。(使用しているボードは 3.3V で 8Mhz
 系です。16MHz 系で書き込むと復旧できなくなってしまうので注意！)


Arduino 1.8.10 で確認しています。なお、Linux+Arduino 1.8.19 の環境ではエラーになるようです。(Windows上のArduino 1.8.19 では問題ないらしい) 原因究明中です。スミマセン！！

ライブラリ設定などはこちらを参照してください。

https://qiita.com/nanbuwks/items/5b174546da5df383f155


```


#include "MTCH6102.h"
#include "Keyboard.h"
#define ADDR 0x25
# define HOLDHI 254
# define HOLDLO 200



MTCH6102 mtch = MTCH6102();

const int len = 8;//感知ポイント数
bool sound = false;
void setup() {
  Serial.begin(115200);

  mtch.begin(ADDR);
  
  
  delay(100);
  mtch.writeRegister(MTCH6102_NUMBEROFXCHANNELS, 0x07);
  mtch.writeRegister(MTCH6102_NUMBEROFYCHANNELS, 0x03);//最低3点必要なため
  mtch.writeRegister(MTCH6102_MODE, MTCH6102_MODE_FULL);
  delay(500);
  Serial.println("start");
  Keyboard.begin();

}


void loop() {



  byte data;
  int sensVals[len];
  int keephold[len];   // only use 0,3,6

  Serial.println();
  for (int i = 0; i < len; i++) {
    data = mtch.readRegister(MTCH6102_SENSORVALUE_RX0 + i + 1);
    Serial.print(data);
    Serial.print(",");    sensVals[i] = data;
    sensVals[i] = data;

  }                     
  if ( HOLDHI == sensVals[0] || HOLDHI == sensVals[1]  ){
     Serial.println("ESC");
     if ( 0 == keephold[0] ){
        Keyboard.press(KEY_ESC);
        delay(100);
        Keyboard.releaseAll(); 
     }
     keephold[0] = 1;
  }
  if ( HOLDHI == sensVals[6] || HOLDHI == sensVals[7]  ){
     Serial.println("RETURN");
     
     if ( 0 == keephold[6] ){
        Keyboard.press(KEY_RETURN);
        delay(100);
        Keyboard.releaseAll(); 
     }
     keephold[6] = 1;
  }
  if ( HOLDHI == sensVals[3] || HOLDHI == sensVals[4] || HOLDHI == sensVals[5]  ){
     if ( 0 == keephold[3] ){
       Serial.println("ALT+TAB");
       Keyboard.press(KEY_LEFT_ALT);
       delay(100);
       Keyboard.press(KEY_TAB);
       delay(100);
       Keyboard.release(KEY_TAB); 
       delay(100);
       
     }   

     keephold[3] = 1;
  }
  if ( HOLDLO > sensVals[0] || HOLDLO    > sensVals[1]  ){
     keephold[0] = 0;
  }
  if ( HOLDLO > sensVals[6] || HOLDLO > sensVals[7]  ){
     keephold[3] = 0;
  }
  if ( HOLDLO > sensVals[3] && HOLDLO > sensVals[4] &&  HOLDLO > sensVals[5]  ){
     if ( 1 == keephold[3] ){
        Serial.println("RELEASE ALT+TAB");
        Keyboard.release(KEY_LEFT_ALT);
      }
      keephold[3] = 0;
  }
  delay(100);
}
```

プログラムは、

No.0 または No.1 電極を長押しすると 「Esc」キー(キャンセル)、
No.3 または No.4 電極を長押しすると 「Alt+Tab」キー(タスクスイッチ) 、
No.6 または No.7 電極を長押しすると 「RETURN」キー(エンター) 、

となります。