VRchatのワールド上に自分の脈拍数をグローバルで表示する


arduinoと脈拍センサを使って、VRchat上に自分の脈拍数を公開する
脈拍デバイス作成についてまとめました。

ワールド上で自分の脈拍をグローバルに表示されるので、
心理ゲームや嘘発見器(ジョークレベル)として遊びに使うと面白いかと思います。
またワールド内でmidiのチャンネルを変えることにより、
複数での動作も可能なので相手の動揺度を基準としたゲームも出来ると思います。

ハードウェアなので電子工作とプログラミングが必要になりますが、
未経験の人でもわかりやすいよう、噛み砕いて書いていきたいと思います。

デバイスを作成せず、ワールドに脈拍表示器を置きたいという人は、
[**自分のワールドに脈拍表示器を設置する**](#自分のワールドに脈拍表示器を設置する)を参照してください。


#注意
この方法はVRchatに実装されているVRC_MidiNoteInを使って実現しています。
ardiunoにプログラムを書き込んだ時点で、MIDI機器としてPCの環境に干渉します。
**また今後VRchatのアップデートによっては、この方法は使えなくなる可能性があります。**
前例↓
https://vrchat.canny.io/bug-reports/p/vrcoscbuttonin-is-not-working

#事前準備(ハードウェア)

**・Arduino Leonardo or Arduino Pro Micro 5V,16MHz**
お手軽マイコンボードのArduino Leonardo
ハンダ付けが可能な環境であれば、
安くて小型なArduino Pro Micro 5V,16MHzもお勧めします。

Arduino Leonardo
https://www.switch-science.com/catalog/968/
Arduino Pro Micro 5V,16MHz
www.amazon.co.jp/dp/B01M6WULAO

**・脈拍センサ**
ハートマークが印刷されているセンサモジュール
ハートマークの面を耳たぶや指先に着けると、脈拍の動きを波形でアナログ出力します。
耳たぶクリップやマジックテープのセット
https://www.switch-science.com/catalog/1135/

色々なメーカーが似たようなのを作っているので、
耳たぶクリップが要らなければamazonで安く買えます。
といっても耳たぶクリップがないと実際は不便です。
www.amazon.co.jp/dp/B07H2F2TYT


海外通販に抵抗がなければ、
aliexpressやebayなどを利用するのもアリです。

品質はそれなりで、届くのも2~3週間ほどかかりますが、
Arduino Pro Microと脈拍センサの耳たぶクリップ付きセットを
合わせて6,7ドル程度で購入できます。

Arduino Pro Micro
https://ja.aliexpress.com/item//32768308647.html
https://ebay.to/2wA2mfG

脈拍センサキット
https://ja.aliexpress.com/item//32603915428.html
https://ebay.to/2JRwkob



**・USBケーブル2.0 Micro-B**
よくある通信用USBケーブル
arduinoとPCを通信するために使います。


#配線作業
Arduino Leonardoと脈拍センサーを以下の画像のように接続します。



![pp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/111f1bb4-0044-0bfe-b561-8e844f917a8f.jpeg)




配線の色が違う！という場合は脈拍センサに書かれている記号を確認して
S = A0
+ = 5V
- = GND
とarduino側に配線します。

Arduino Pro Microの場合は以下のように半田付けしてください。
~~このデバイスはUSBの5Vから電源をもらうので、
基板上のJ1と書かれている箇所(赤丸)を半田で埋めてください。
(埋めたら今後、このPro Microの電源に5V以上の電圧をかけないで下さい。)~~

＊回路を見たら別に必要ありませんでした。

![ppa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/4e82a017-1b91-9484-ed07-847f5d0f1e2b.jpeg)






**＊注意＊**
配線ミスやショートに気をつけてください。
arduino側にはヒューズがついていますが、
ショートした際、運が悪いとICが焼損し、
更に運が悪いとUSBポートにダメージが及ぶこともあります。


ハードウェアはこれで完成です。
脈拍センサは基板としては剝き出しなので、
金属などでショートしないよう扱いに注意して下さい。
私はグルーガン(黒)で保護しました。


#事前準備(ソフトウェア)

**・Unity 2017.4.15f1**
**・VRChat SDK (最新)**

**・Arduino IDE**
Arduinoのプログラム(スケッチ)を書いて、ボードに書き込むソフトウェアです。
Arduino Software https://www.arduino.cc/en/main/software

**・VRC_MIDI_Pulse**
脈拍センサから受け取ったアナログ値をAD変換し、
デジタル値に変換した値をMIDIデバイスとしてVRchatへ送信するプログラムになります。
clone or downloadからダウンロードしてください。
https://github.com/Ryou328/VRchat_midi_pulse_sensor

**・脈拍表示器**
表示はブタジエンさん作のCalulater and numberを使用させて頂きました。
https://twitter.com/butadiene121/status/1001489400860037122

MITライセンスということなので私がMIDI用に設定済みのprefabを同梱した、
Calulater and numberのunitypackageをアップしましたので以下からダウンロードしてください。

https://drive.google.com/file/d/1kLlJzsBbhQEg4So-B7Ar9bgcLZxq11mc/view

*2019.6.9 prefabの構成にミスがあったので修正しました。
既にインポートされた方はお手数ですが、midi_numberの中身を差し替えて下さい。


#ソフトウェア導入
Arduino IDEのインストーラー版をダウンロードし、インストールします。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/bfe4284e-cf87-c2dc-3f9f-d6d7c4dd6665.jpeg)
インストールはNEXT連打でOKです。

インストール後、arduinoとPCをUSBで接続してください。
この時、脈拍センサとarudinoのLEDが点灯していることを確認して下さい。
点灯していない場合、配線ミスかショートしている可能性があるので、
素早くUSBを抜いて配線を確認します。

問題無い場合、arduinoドライバのインストールが始まるので完了するまで待ちます。

完了したらArduino IDEを起動し
メニューの[ツール]→[ボード]→[Arduino Leonardo]を選択し、
[シリアルポート]→[COM XX(Arduino Leonardo)]を選択してください。
画像のCOM番号は40ですが、番号は個々のPC環境によって変わります。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/df82f530-e363-6a31-f13f-4701988fa0d9.jpeg)



正しく認識されていれば、[ボード情報を取得]をクリックすると
接続されているArduino Leonardoの情報が表示されます。

Arduino Pro Microで接続した場合でも、Leonardoとして認識されます。
(自分をLeonardoだと思いこんでいるPro Micro)


#必要なライブラリを揃える
メニューの[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]をクリックし、
ライブラリマネージャを起動します。
検索欄で「MIDIUSB」と検索して、出てきたMIDIUSBの最新verを選択し、
インストールします。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/ae91bc9b-aa1a-f1fd-0de0-29c755a0df98.jpeg)

同じように「pulsesensor」で検索し、最新verをインストールします。
*筆記時、MIDIUSBver_1.0.4、pulsesensor_ver1.5.0

#ファームウェア書き込み
arduinoにファームウェアを書き込みます。
githubからをダウンロードしたVRC_MIDI_Pulseを解凍し、
VRC_MIDI_Pulse.inoをarduinoで開きます。

[スケッチ]→[マイコンボードに書き込む]をクリックし、しばらく待ちます。
エラーが出た場合は必要なライブラリを見直してください。
[ボードへの書き込みが完了しました。]と出れば成功です。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/90f3823e-e8af-4789-69b8-ec823477c5c5.jpeg)


この書き込み後、シリアルポート番号が変化する場合があるので、
[ツール]→[シリアルポート→COM ??(Arduino Leonardo)]を選択し直してください。

脈拍センサの緑色に光っているハート面を指先か耳たぶに装着し、
[ツール]→[シリアルモニタ]をクリックすると、
現在の脈拍数であるBPMとMIDI用に変換された三行の数字が表示されるはずです。

![32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/a16df9b4-cb81-0a8c-a369-10f7bddf1dcc.jpeg)


しばらくしてもBPMが0だったり、安定しない場合は装着を見直して下さい。
それでもおかしい場合は、基板が壊れている場合があります。
(aliexpressで買った脈拍センサがハズレだった経験談)

この状態でVRchatを起動し、テストとして私のワールドにインしてみましょう。
https://vrchat.net/home/launch?worldId=wrld_12a18d9e-c431-4d57-84e0-894753d16d52

脈拍数が表示されて変動していれば成功です。
![20190608124648_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/d2e5bb72-a596-8dfc-5012-bce47faa141c.jpeg)

うまく動作しましたらTwitterなどで報告して頂けると私が大変喜びます。

#自分のワールドに脈拍表示器を設置する
[**googleドライブ**](https://drive.google.com/file/d/1kLlJzsBbhQEg4So-B7Ar9bgcLZxq11mc/view)からダウンロードした脈拍表示器のunitypackageをunityにインポートしてください。

prefab→midi_numberフォルダにあるch12のプレハブを好きな場所に設置して完了です。
![wereseg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/e2ddda3e-4785-1748-6f6c-b472ccfdc58b.jpeg)

複数設置したい場合はMIDIのch(チャンネル)が被らないようプレハブを設置して下さい。
またそのチャンネルに合わせたデバイスの書き換えも必要なので、
[**MIDIチャンネルの書き換え**](#MIDIチャンネルの書き換え)を参照して下さい。


#MIDIチャンネルの書き換え
デフォルトのVRC_MIDI_PulseのMIDIチャンネルは12を指定しています。
チャンネルが被ると正しく動かないので、VRC_MIDI_Pulseの12行目の
const uint8_t MIDI_CH = 12;
の12の値を1~15のいずれかに被らないよう設置したprefabのチャンネルに合わせて、
値を変更して[**arduinoに書き込んでください**](#ファームウェア書き込み)
0は指定しないで下さい。すべての表示器に適応されてしまいます。



#脈拍センサデバイスの装着について

VIVEのHMDにはUSBハブの空きポートがあるので、今回作成したデバイスを接続しても認識します。
この空きUSBに接続して耳たぶに脈拍センサーを装着すれば、
moveやダンスをする際、配線を気にせず動くことができます。

Oculusについては持っていないので検証出来ないのですが、
聞いた話だとHMDに空きUSBポートが存在しないらしいので、
上記の耳たぶ装着はviveより難しくなると思われます…


私の環境はVIVEにTPcastを使っていましたが、これだとTPcast以外のUSBは認識されないので、
OpenTPCastを導入した上で、VirtualHereを使ってをarduinoを認識させています。
![D8CIFOKUEAAvdW6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/dc1bcf87-6cac-f5e8-17b0-408db98cc35a.jpeg)

コンパクトにしたやつ
もし売るとしたらこんな感じになると思います。
![CIMG0801.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385973/48072efd-49a5-4f34-6f3b-1a21a455154d.jpeg)


#仕組み
arduino側
脈拍センサで取得したBPM値を各桁ごとに分けます。
例として死にますがBPMが12だった場合三桁表示なので、
0,1,2
という感じで分けます。
分けた値をMIDIのnote番号に変換します。

VRchatSDKのVRC_MidiNoteInはピアノで使う前提として、
作られているらしくMIDIのnoteは21~108でとなっています。

今回は独自にnoteと数値を割り当てましたが、
割り当て方は単純にunityのVRC_MidiNoteInコンポーネントにある、
noteの一番上から順番にA0=0,Bb0=1,B0=2と割り当てました。

A0のnote番号は21なので、0=21,1=22,2=23として変換してます。
変換した三桁分のnote番号をPCに接続されたmidiデバイスとして送信します。

VRchat側
各桁のCalulater and numberの入力用オブジェクトを
受信したnote番号に合わせてVRC_MidiNoteInがトリガーを引くことにより、
その番号が表示されます。

実際のウェアラブル的な脈絡計としては結構いい感じです。
個人的には指より耳たぶの方が安定しています。
更新速度は1秒くらいでVRchat側にも負荷はほとんどないと思われます。
ダンス中でも値は取れますが時々値が飛んだりするので、
やっぱり安静時が一番精度が出る感じです。

#最後に

今回は電子工作をしたことない人向けに書いてみたのでちょっと冗長気味になりました。
VRC_MidiNoteInを使ったこの方法は色々と応用が効きそうなので、
脈拍に限らず色々なセンサーを接続して、
現実とVRchatとで色々なやり取りをしてみると面白いと思います。

もし、作るの面倒！でも欲しい！という方がおられれば、
完成品をboothとかで出品してみようかな…

次は書く書くといってずっと放置しているDTMF音源を使った、
VRchat→外部機器の通信をまとめる…はず…かも