ウェアラブルデバイスMyoのデータを取得してみた

この記事は開発初心者向けに0から説明しています。
(授業で使用する記事です)

この記事ではcodepenというサービスを用いて開発を行います。
使用するデバイスMyoについては[こちら](https://jp.myo.com/)を参照してください。

# Myoとは
Myoとは腕に装着することで腕から指先にかける動きを取得することを可能とするウェアラブルデバイスです。

# CODEPENとは
[CODEPEN](https://codepen.io/)とはウェブ開発に必要なHTML, JS, CSSの三要素を実際の表示を見ながら開発できるウェブサービスです。

# まずはCODEPENでWEB開発入門
いろいろ説明しても難しいと思うのでとりあえず作業しながら理解していきたいと思います。

## CODEPENに登録する
まずCODEPENを利用するにあたり会員登録が必要になります。
下記URLにアクセスして会員登録を済ませましょう！
https://codepen.io/signup/free

GitHub, Twitter, Facebookのアカウントをお持ちの方は会員登録不要です。
直接ログインして次のステップに進みましょう。
https://codepen.io/login


こんなメールが届くはずです。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/7f2b8b25-950d-e022-37e5-3a15329fe42c.png)
メールに記載されているURLにアクセスしましょう。

## まずは一つ作ってみる
会員登録が完了したので次に最初のウェブアプリを作成してましょう。

+NewPenをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/65b6003f-3c68-262c-9dae-73b4d86d5b98.png)

こういう画面に切り替わったかと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/b0c34695-ce77-3f9e-2d86-f44d353649ce.png)

まずは名前をつけます。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/0b6a5972-36c6-e23d-fe31-ec326afff718.png)

文字を表示するようにします。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/c8ba75f1-d242-a7e7-9124-866a1cd8c7ec.png)

背景に色をつけます。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/5fe81145-eff7-a02c-0571-354858b6d8e2.png)

プログラムで毎秒時刻を表示します。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/9ffba07e-0b96-0eba-b6e1-dd2d7030eb16.png)

書いたプログラムはそれぞれこんな感じです。

```html:HTML
<h1>Hello world!</h1>
<h1 id="time"></h1>
```

``` css:CSS
body{
  background-color:#9E9E9E;
}
```

```js:JS
setInterval(function(){
  document.getElementById("time").textContent=new Date().toLocaleString();
}, 1000);
```

本当のWeb開発でやらなければならない読み込みなどをCODEPENが勝手にやってくれているので本当に必要な部分を書くだけで済みますね。
らくらくです。

ここで一度保存をしておきましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/ffe55f5f-117a-e4c8-602c-998afdee7b54.png)

# Web開発について
先程のHTML, CSS, JSがWeb開発の基本となります。

| 種類 | 役割 | 具体的な要素 |
|:-:|:-:|:-:|
| HTML | レイアウト | 文字や写真、ボタン、入力フォームなど |
| CSS | デザイン | 文字や背景の色、写真のサイズなど |
| JS | 動き | HTMLやCSSの操作、計算など |

ざっくりとこんな認識で問題ないかと思います。
この記事ではMyoのデータをどう扱うかが問題なのでJS(JavaScript)に関する勉強が中心になっていきます。
HTMLとCSSは表示部分なのでそこまで深く勉強する必要はありません。

# 早速Myoのデータを取る
さて、そうしましたらMyoのデータを取得するための新しいWebアプリを作成しましょう。

## 新しいPenの作成
[http://codepen.io](http://codepen.io)にアクセスします。

+NewPenをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/65b6003f-3c68-262c-9dae-73b4d86d5b98.png)

名前をつけます。

## サンプルのコピー

まずは下のコードを貼り付けてください。

```html:HTML
<div class='orientationGraph'>
</div>
```

```css:CSS
html,
body {
  width: 100%;
  margin: 0;
  padding: 0;
}

body {
  background: #10161d url('https://raw.githubusercontent.com/thalmiclabs/myo.js/master/examples/deviceGraphs/img/dot_grid.png');
  font-family: 'blender_prothin';
  font-size: 12px;
  color: #58bccc;
  line-height: 20px;
}

body {
  text-align: center;
}

.orientationGraph {
  height: 200px;
  width: 500px;
}
```

```js:JS
//This tells Myo.js to create the web sockets needed to communnicate with Myo Connect
Myo.connect('com.myojs.deviceGraphs');

Myo.on('gyroscope', function(quant) {
  updateGraph(quant);
});

var range = 500;
var resolution = 100;
var graph;

var arrayOfZeros = Array.apply(null, Array(resolution)).map(Number.prototype.valueOf, 0);

var graphData = {
  x: arrayOfZeros.slice(0),
  y: arrayOfZeros.slice(0),
  z: arrayOfZeros.slice(0),
  //	w : Array.apply(null, Array(resolution)).map(Number.prototype.valueOf,0)
};

$(document).ready(function() {
  graph = $('.orientationGraph').plot(formatFlotData(), {
    colors: ['#04fbec', '#ebf1be', '#c14b2a', '#8aceb5'],
    xaxis: {
      show: false,
      min: 0,
      max: resolution
    },
    yaxis: {
      min: -range,
      max: range,
    },
    grid: {
      borderColor: "#427F78",
      borderWidth: 1
    }
  }).data("plot");

});

var formatFlotData = function() {
  return Object.keys(graphData).map(function(axis) {
    return {
      label: axis + ' axis',
      data: graphData[axis].map(function(val, index) {
        return [index, val];
      })
    };
  });
};

var updateGraph = function(orientationData) {
  Object.keys(orientationData).map(function(axis) {
    graphData[axis] = graphData[axis].slice(1);
    graphData[axis].push(orientationData[axis]);
  });

  graph.setData(formatFlotData());
  graph.draw();
};
```

次に画面上部にあるSettingsをクリックしてください。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/2fa8b9c3-773c-79e1-e60c-935a10acb1d7.png)

JavaScriptを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/7a43c80f-6fd2-c8b9-aa3c-32ee0a0029a9.png)

Add External JavaScriptの欄に次の3つを追加します。

1. `http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js`
2. `https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.min.js`
3. `http://codepen.io/daikinissan/pen/gwjrdj/`

![image](https://qiita-image-store.s3.amazonaws.com/0/113969/cc2bcf4a-e596-18d9-54b6-53cd814bd44f.png)

## サンプルコードの実行
右上のChange ViewをクリックしてFullPageを選択しましょう。
実際の動きを確認することができます。

## Myoを接続する
USBのアンテナが付属しているのでそれを用いてPCとMyoを接続します。
[https://jp.myo.com/start](https://jp.myo.com/start)にアクセスしてMyoコネクトをインストールします。

Continueをクリック
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/113969/332ad325-9129-6c5b-2595-010a05af171a.jpeg)
USBのアンテナをPCに挿入しMyoとPCをUSBケーブルで接続します
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/113969/8fa6891e-e3d0-0cf5-0f9f-708f87d4df13.jpeg)
わかりやすい名前をMyoに付けます
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/113969/b63c5a3b-5033-5cc5-9e7d-da7607dc141f.jpeg)
会員登録は無視します
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/113969/fa28fa60-8e5e-0fd4-1b4e-2f394850dbe5.jpeg)
これが出たらUSBケーブルを抜きます。
USBのアンテナはそのままにしておきます。
![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/113969/1d892225-b3cf-6c2b-2de7-70f6c1e6d976.jpeg)
無線のペアリングが完了したらこのような表示になります。
![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/113969/44535f5e-41ca-d330-256b-677695e99333.jpeg)
ここまで来たらこの画面は閉じて問題ありません。

## Myoのデータを表示する
Myoのドライバーが正しくインストールされたらデータが画面上に表示され始めるはずです。