表面筋電をセンサーで取得する

# はじめに

研究室に転がってた[MyoWare](https://www.switch-science.com/catalog/2682/)という筋電センサを用いて表面筋電を計測してみました．

![全体像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/da25007d-c18e-a488-afdb-1e40614717ed.jpeg)

これを利用することで，把持や物体の持ち上げなどを定量的に評価できるようになるかもしれません．
僕は研究で使えるかと思って動かしてみました．
筋電とは何ぞや？って人は以下の論文でも読んでみてください．

- [いまさら聞けない生体計測1(筋電)](https://www.jstage.jst.go.jp/article/jsmbe/57/4-5/57_149/_pdf/-char/en)



# 動作環境

本記事で実装した環境を記しておきます．

- OS: `Windows 10 Home`
- VSCode: `version 1.44`
- PlatformIO: `Core 4.3.2a1`
- マイコン: `Mbed F303K8`


# やり方
大まかに2つの手順があるので，分けて書いていこうと思います．

## プログラムを作ってマイコンに書き込む

まずはPlatformIOで`Project`を作成します．
すると雛形ができるので，ここにプログラムを書いていきます．
今回使ったのはMbedというマイコンなので，cppで書きます．
ソースコードは以下のものを使いました．

```MyoWareTest.cpp
#include "mbed.h"

// 浮動小数点型の標準入出力を行うための記述
asm(".global _printf_float");

// シリアル通信のための記述
Serial pc(SERIAL_TX, SERIAL_RX); // tx, rx

// MyoWareの値を受け取るピンの定義
AnalogIn sig(A1);

int main() {

    // 筋電センサの値を受け取る変数
    float sig_val;
    while(1) {

        // 筋電センサの値を更新する
        sig_val = sig;

        pc.printf("Sig Value: %f\n\r", sig_val);
        wait_ms(10);
    }

}
```

これをVSCode上でビルドし，マイコンに書き込みます．

## 配線して電極を張り付ける

マイコンなどに関しては以下の資料でも読んでみてください．

- [mbedの利用方法](https://os.mbed.com/media/uploads/yueee_yt/mbed-----.pdf)

今回組んだ配線を以下に示します．

![MyoWare_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/cd825b4f-d80b-95ca-298e-6e2ee1a66ef0.png)

今回使ったマイコンは**F303K8**なので，AnalogInで得ることのできる値の幅は0V~3.3Vになります．
そのため，₊の配線は3.3Vに接続します．
更に，以下のようなケーブルを...

![ケーブル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/62b77b0f-9328-cf26-0123-c48faa6574b6.jpeg)

画像のように接続します．

![iOS の画像 (24).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/d9d18dbb-662e-418c-2cca-ff804ca4623b.jpeg)

電極はこのように貼り付けます．

![iOS の画像 (20).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/0d9ed006-48b8-1cec-e864-653cf00e4dad.jpeg)

貼る位置に関しては，以下のリンクに書いてあるので適当に決めてください．

- https://os.mbed.com/teams/MyoWare-Sensor/wiki/Sparkfun-MyoWare-Muscle-Sensor
- https://cdn.sparkfun.com/datasheets/Sensors/Biometric/MyowareUserManualAT-04-001.pdf

以上で手順は終了になります．

# 結果

以下のリンクは，僕がツイッターに投稿した手の動きとコンソール出力の動画です．
画面に収まってませんが，手をニギニギしてます．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">筋肉を取得できるようになった <a href="https://t.co/QwNvp9jCyj">pic.twitter.com/QwNvp9jCyj</a></p>&mdash; 𝕋𝕒𝕜𝕒𝕙𝕚𝕣𝕠🦀( &#39;-&#39; 🦀 )ｶﾆﾁｬﾝ (@_7cancer) <a href="https://twitter.com/_7cancer/status/1249841684470349824?ref_src=twsrc%5Etfw">April 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

以下の画像は，実行した際のターミナル出力の結果です．
左の図はグッと把持動作を行った際の結果を表しており，右は弛緩した際の結果を表しています．

<img width="116" alt="high (2).PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/a6842373-38f1-c4c6-c00b-acf50db1d7c4.png"> <img width="118" alt="low (2).PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/c9f9b63c-dba7-218e-2c54-b3a77d253cee.png">

左は0.92くらい，右は0.17くらいでセンシングできました．
電極を貼る位置によっては，出力される数値がおかしくなったりしやすいので，調整しながら貼りましょう．

これをなにかと組み合わせればいろいろ遊べそうですね．
何かあったらコメントをください．

# 詰まった時に書いた記事
どこかしらで詰まったら以下を参照してみてください．

- [PlatformIOでMbedに書き込み出来なかった時の対処](https://qiita.com/7Cancer/items/d12e06e83a1f8fe0bac0)
- [PlatformIOでコンソール出力が上手くいかなかった](https://qiita.com/7Cancer/items/b9e08033f980193cf3da)


# 参考にしたサイトと文献

以下を参考にして記事を書きました．

- [Sparkfun MyoWare Muscle Sensor - Mbed](https://os.mbed.com/teams/MyoWare-Sensor/wiki/Sparkfun-MyoWare-Muscle-Sensor)
- [MyoWareを使って筋肉をセンシングしてみた](https://qiita.com/minami1389227/items/e26a1e3433ebd246ca6c)
- [MyowareUserManualAT-04-001.pdf](https://cdn.sparkfun.com/datasheets/Sensors/Biometric/MyowareUserManualAT-04-001.pdf)