❤️

心拍をUnityで取得する

に公開

心拍計は、CooSpoのHW706を使用します。

PCのOSはWindowsが対象です。

今回は、
HW706をPCにBluetooth接続

BluetoothHeartRateOSCで心拍を取得

BluetoothHeartRateOSCの値をUnity+OSCJackVSで受信

という流れになります。

HW706をPCと接続する

Bluetoothで接続します。
私の方では、「HW706-~」という名前で表示されました。

BluetoothHeartRateOSCでHW706の値を受信する

BluetoothHeartRateOSCは、心拍計の値を受信できるアプリになります。
https://github.com/AkaiMage/BluetoothHeartRateOSC
BluetoothHeartRateOSCをダウンロードします。


解凍し、BluetoothHeartRateOSC/Release/HeartRate.exeを起動します。


このような画面が表示されます。
(表示される文字は異なる場合があります)

HW706を装着し、しばらくすると、心拍が表示されます。

心拍数が反映されるまで、しばらく時間がかかります。

ウィンドウは閉じてもタスクトレイに格納されます。
(画面の文字がタスクトレイのアイコンになっています)

アプリの終了や再起動する場合は、タスクトレイから閉じる必要があります。

Unityのプロジェクトを作成する

Unityでプロジェクトを作成します。
(バージョンやテンプレートは問いません)

OscJackVSをインストールする

OscJackVSとは、UnityでOSCの送受信ができるアセットになります。

アセットの導入にあたり、PackageManagerのScopedRegistryに以下を登録します。

Name URL Scope(s)
Keijiro https://registry.npmjs.com jp.keijiro


すると、PackageManagerのMyRegistryからインストール可能になるので、
OscJackVSをインストールします。

OSCJackVSの設定ファイルを作成する

Create/ScriptableObjects/OSC Jack/Connectionより、OSCConnectionファイルを作成します。


Portを9000にしておきます。
(BluetoothHeartRateOSCがポート9000を使用するため)

受信処理を作成する

適当なGameObjectにEventReceiverをアタッチします。

Connectionに先ほど作成したOscConnectionを、
OSCAddressに/avatar/parameters/HeartRateBPMを指定します。
(BluetoothHeartRateOSCがこのアドレスに値を送信するため)
DataTypeはIntにします。

今回は心拍数をテキストで表示するので、TextMeshProUGUIを配置しておきます。

このテキストに心拍数を反映させるため、スクリプトを作成します。

using UnityEngine;

using TMPro;

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
/// <summary>
/// メインクラス.
/// </summary>
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

public sealed class Main : MonoBehaviour
{
    //================================================================================
    // Fields.
    //================================================================================

    /// <summary>
    /// ラベル.
    /// </summary>
    [SerializeField] private TextMeshProUGUI Label = default;
    
    //================================================================================
    // Methods.
    //================================================================================

    //--------------------------------------------------------------------------------
    // Event methods.
    //--------------------------------------------------------------------------------

    /// <summary>
    /// Intの値が返るイベント.
    /// </summary>
    /// <param name="value">値.</param>
    public void OnIntEvent(int value) => Label.SetText($"{value}");
}

EventReceiverのOnIntEventに、先ほどのスクリプトのOnIntEventを指定します。

これでUnityを実行すると、心拍数がラベルに反映されます。

参考文献

https://qiita.com/aa_debdeb/items/34174f07909fa324e09c
https://learning.unity3d.jp/8322/
https://note.com/bekosan/n/nf6a976867771
https://ja.wikipedia.org/wiki/OpenSound_Control

Discussion