Arduinoと筋電センサMyoWareで始める筋電計測

#はじめに
この記事は[限界開発鯖 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/approvers)の10日目の記事です。
昨日の記事は[円周率は本当に3.14・・・なのか？](https://qiita.com/potyamaaaa/items/f9ec7d6d59b9a27968d6)
明日の記事は[アスキーアートで作るLTスライド](https://qiita.com/Yuki-123/items/49a9b0b444f4e12c0f96)

#筋電位とは何ぞや？
皆さんの体は、骨や筋肉で構成されてると思います。
筋肉は、脳で生成された運動指令を、神経を介して受け取り動いています。
その時に、筋肉で微小な電位が発生します。この電位の時間変化を時系列信号としてとらえたものを**筋電位信号**といいます。
この筋電位信号を測定した図が筋電図というものです。心電図も原理は同じです。
特に皮膚に電極を張り付けて計測をする場合は、表面筋電図といいます。
詳しいメカニズムは自分で調べたり本で読んだりしてみてください。
[この本](https://www.amazon.co.jp/dp/4501325100/ref=cm_sw_r_tw_dp_x_.wAZFbN88D2PG )がわかりやすくておすすめです。

#つかったもの

* [Arduino Uno R3](https://www.switch-science.com/catalog/789/)

![Arduino Uno R3](https://d2air1d4eqhwg2.cloudfront.net/images/789/500x500/1ac46a04-b77c-4471-b579-7f55d1d4c203.jpg)
Arduinoなら大体大丈夫だと思います。自分はUno R3を使いました。

* [MyoWare 筋電センサ](https://www.switch-science.com/catalog/2682/)

![MyoWare 筋電センサ](https://d2air1d4eqhwg2.cloudfront.net/images/2682/500x500/4c8f93d9-dba8-46e2-85b1-e03f8297fc85.jpg)
表面筋電を計測するためのセンサです。優秀です。
5000円以上と少し高いですが、筋電を計測するセンサではとても安いです。
[ユーザーマニュアル](http://cdn.sparkfun.com/datasheets/Sensors/Biometric/MyowareUserManualAT-04-001.pdf)に計測の仕組みや電極の貼り方などが書いてあります。

* [MyoWare用スナップパッド付きセンサケーブル](https://www.switch-science.com/catalog/2692/)

![MyoWare用スナップパッド付きセンサケーブル](https://d2air1d4eqhwg2.cloudfront.net/images/2692/500x500/1edb43a5-2e45-4b95-83a9-0eabfc9386c5.jpg)
MyoWare本体にも電極は取り付けられますが、取り付ける場所が限られているので、このケーブルを使うことで自由な場所に電極を張ることができます。

* [MyoWare ケーブルシールド](https://www.switch-science.com/catalog/3430/)

![MyoWare ケーブルシールド](https://d2air1d4eqhwg2.cloudfront.net/images/3430/500x500/0857e05b-c0b1-4052-a525-895d0225914b.jpg)
さっきのセンサケーブルの端子をここに刺して、このケーブルシールドとMyoWare本体を接続します。

* なんかしらの心電図用電極

心電図用ですが、仕組みは同じなので大丈夫です。（筋電図用電極が見つからなかった）
[こういうの](https://www.monotaro.com/g/04170369/)でいいと思います。
自分が使っているのは[この電極](https://www.amazon.co.jp/dp/B01LP837QY/ref=cm_sw_r_tw_dp_x_W4AZFb10J6JXP)ですが、少々高いので上のやつでいいと思います。

#事前知識
Arduinoの基本的な使い方

#使えるように組む
使ったものリストに載せた方々を実際に使えるように組んでいきます。

* センサケーブルに電極を取り付けて、ケーブルの端子をセンサケーブルに刺します。

付箋が張ってあるのは、どのケーブルがR,E,Mなのかわからなくなるためです。
M:黒　E:赤　R:青という組み合わせになっています。
![センサケーブル接続.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481328/4dd46c22-da97-d5c5-2929-692a28315df1.jpeg)

* 次に、センサシールドとMyoWare本体を接続します。

どこを接続するかというと、センサシールドと本体のR,E,M同士です。
接続するためのコネクタを、間違えて裏面につけてしまったのでねじれていますが、RはR、EはE、MはMと接続してください。
![シールドー本体.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481328/687e5e97-cddc-1970-00d3-3c7ad38508ab.jpeg)

* 最後にMyoWare本体とArduinoを接続します。

MyoWare本体の＋をArduinoの5Vに、-をGNDに、SIGをアナログピンのどれかに接続してください。
![myoware-arduio.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481328/73ae0ed2-fcc4-6f64-b184-2dc9cfd5a6a5.jpeg)

あとはArduinoをPCに接続すれば使う準備はできました！

#実際に使ってみる
###電極の貼る場所
さっきからケーブルのところでEやらMやらRやらと言っていますが、それは電極の貼る位置を表しています。

* R: Ref, アース電極といいます。回路でいうアースと同じです。調べたい筋肉とは無関係の場所に貼ります。（手首や肘、骨の上）
* E: End, 筋肉の端に貼ってください。
* M: Mid, 筋肉の中央（盛り上がる場所）に貼ってください。

###計測するためのソースコード
自分はArduinoIDEを使っています。

```
void setup() {
  // お好きなビットレートを
  Serial.begin(115200);
}

void loop() {
  int value = analogRead(0);
  Serial.println(value);
}
```

これだけ！なんて簡単！
コイツのすごいところは波形や値の操作がいらないところです。
筋電の生波形というのは、プラスやマイナスを行き来するものなんですが、こいつは生波形を反転してくれているので簡単にデータを受け取ることができます。
シリアルモニタで値を見るときはシリアルモニタのビットレートとプログラムのビットレートを合わせるようにしましょう。

###実際に計測する
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">やっとやりたいことが出来た<br>反応もまちまちだし改善しないとな <a href="https://t.co/BqQotWvCSW">pic.twitter.com/BqQotWvCSW</a></p>&mdash; はせがわ/はい (@hasegawa2718) <a href="https://twitter.com/hasegawa2718/status/1297035962246078465?ref_src=twsrc%5Etfw">August 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

実際に計測した時の動画です。
肉まんボディで申し訳ありません。
一つ注意なのは、この動画は電極の位置が離れすぎています。5cmぐらい（あるいはもっと短く）がいいです。
それ以上離れてしまうと、別の筋肉を見てしまう可能性があり、正しく計測ができません。前腕は細かい筋肉が交錯しているので特に注意しましょう。
見たい筋肉はできる限り大きい筋を選んでください。（太ももだったり二頭筋だったり）

# 発展
これで筋電計測ができるようになったわけですが、この計測した結果からアクチュエータ（モータとか）を制御することも可能です。
ただ、Arduinoだけではファイル出力や解析はできないので、Pythonやらなんやらと連携させる必要があります。
ただ、Arduino - Python間の連携はとても面倒くさいんですよね。
なにが面倒くさいのかというと、筋電位を解析するためには1kHz以上の周期が必要になる上、FFT解析をしようものなら出来る限り正確に1周期の時間を管理しなくてはいけず、それをシリアル通信で値をやりとしながら保つ必要があるからです。
詳しく解析をしたい人はAD変換かませてラズパイに突っ込んだ方がやりやすいかもしれません。

# おわりに（宣伝）
今日は何の発売日かわかりますか？
**そう！サイバーパンク2077の発売日です！**
[![BSWmmvhHZGc](http://img.youtube.com/vi/BSWmmvhHZGc/0.jpg)](https://www.youtube.com/watch?v=BSWmmvhHZGc)
エロもグロもなんでもありのCEROぶっころゲーで、サイバーパンクSF成分が込められたオープンワールドゲームです。
体のほぼ全部を機械にできます。
機械やアンドロイドが好きなら多分めっちゃエロく感じるのでぜひおすすめです。