心拍センサー(Grove - Ear-clip Heart Rate Sensor)を使ってArduinoからTouchDesignerにシリアル通信する



#Qiitaの初投稿がアドベントカレンダー
**Qiitaで書く動機**になったのは、僕の所属する大学の教授から、とある授業の中で、[***"アドベントカレンダー"***](https://qiita.com/advent-calendar)という企画がQiitaにあることを知ったからです。**アドベント**とはもともとクリスマスにキリストの生誕を祝うとかなんとかで行われていることらしいですが、それにちなんで、このQiitaでも、年末は毎日誰かが記事を書いているようです。
アドベントカレンダーもいくつかあって、本当は[**TouchDesignerの方**](https://qiita.com/advent-calendar/2020/touchdesigner)に参加したかったのですが(個人的に書く予定です笑)、もうすでに埋まっていたので、定員がまだ空いていた[**Arduinoの方**](https://qiita.com/advent-calendar/2020/arduino)に参加してみました。2020年の12/21です。

[note](https://note.com/yutaka_yutaka)や[ALIS](https://alis.to/users/kusshi)ではいろいろ書いたことはあるんですが、**Qiita**に記事を書くのは今回が初めてで、書き進める上で、いくつか参考にしました。まず、[**「マークダウン記法」**](https://qiita.com/tbpgr/items/989c6badefff69377da7
)という記法をQiitaは採用していて、これをざっくり説明すると、`**Bold** `が、**`Bold`**のように記載される書き方で、Qiitaで記事を書く上で重要な要素でした。
また、どのような書き方がいいのかをまとめてある[「Qiita公式のガイドライン」](https://help.qiita.com/ja/articles/qiita-article-guideline
)を参考にしました。
同じく（といってもTouchDesignerの方だが笑）、アドベントカレンダーに記事を書かれていた[「TouchDesignerでOpenCVを使った簡単な顔認識について」](https://qiita.com/komakinex/items/5b84b88d537d393afc98)は、記事の構成で参考にしました。


ここからが本題になります〜


#デモ
**↓TouchDesignerに表示されるビジュアル↓**
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315671/456c06a7-1e63-a37b-44e0-bc5517346efb.gif)

**↓Arduino接続のデモの様子↓** *（サイズのせいか、こっちはgifアニメーションにできひんかった...）*

![data_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315671/8ea9b5cc-85c0-656d-ed25-a0c24b43b55b.png)



###サンプルファイル
**GitHubにアップロードした"HeatBeat.zip"というzipファイル**です。
中身は、ArduinoIDEのプログラムファイルと、TouchDesignerのプログラムファイルです。
↓ここからダウンロードできます↓
https://github.com/kusibikiyutaka/HeatBeat


#動作環境
>
MacOS：Big Sur ver.11.1
ArduinoIDE：1.8.13
Arduino：Arduino UNO R3 BOARD
TouchDesigner：099 2020 27390


#概要
####ArduinoIDE
- 心拍センサーの値を取得する
- 取得した値をシリアル通信で送る


####TouchDesigner
- `SerialDAT`でシリアル通信を受け取る
- `logicCHOP`で論理演算をする
- 映像や音を出力する


#具体的な内容

__＊注意
ArduinoIDEの`シリアルモニター`をつけていると、シリアル通信のときに`エラーが出ます`。
また、シリアル通信を`送信する側を先に起動`させて、`受信する側はその後に起動`させてください。今回だと、`Arduinoが先`で、`TouchDesignerが後`です。自分の動作環境では、この順序を逆にしたとき、エラーが出ていたので。もし勘違いだったらすみません。。。__

###■Arduino
####①接続ピン
ArduinoUNOと心拍センサーの接続するピンは、
**「3.3V(赤)、GND（黒）、D2（黄）」**
でいけました。
>Connect this module to the digital port D2 on Grove-Base shield. And connect 
>このモジュールをGrove-BaseシールドのデジタルポートD2に接続します。

と公式サイトにあったので！
・心拍センサー公式サイト（Grove - Ear-clip Heart Rate Sensor）
https://wiki.seeedstudio.com/Grove-Ear-clip_Heart_Rate_Sensor/


>connect Grove-LED to Digital port 4.
>Grove-LEDをデジタルポート4に接続します。

（LEDライトも、D4ピンにつなげば光るみたいなので、動作確認に使えそうです。）

####②プログラム
プログラムも、公式サイトのコピペでいけました。

```c#

    // Function: This program can be used to measure heart rate, the lowest pulse in the program be set to 30.
    //         Use an external interrupt to measure it.
    // Hardware: Grove - Ear-clip Heart Rate Sensor, Grove - Base Shield, Grove - LED
    // Arduino IDE: Arduino-1.0
    // Author: FrankieChu       
    // Date: Jan 22, 2013
    // Version: v1.0
    // by www.seeedstudio.com
    #define LED 4//indicator, Grove - LED is connected with D4 of Arduino
    boolean led_state = LOW;//state of LED, each time an external interrupt 
                                    //will change the state of LED
    unsigned char counter;
    unsigned long temp[21];
    unsigned long sub;
    bool data_effect=true;
    unsigned int heart_rate;//the measurement result of heart rate
 
    const int max_heartpluse_duty = 2000;//you can change it follow your system's request.
                            //2000 meams 2 seconds. System return error 
                            //if the duty overtrip 2 second.
    void setup()
    {
        pinMode(LED, OUTPUT);
        Serial.begin(9600);
        Serial.println("Please ready your chest belt.");
        delay(5000);
        arrayInit();
        Serial.println("Heart rate test begin.");
        attachInterrupt(0, interrupt, RISING);//set interrupt 0,digital port 2
    }
    void loop()
    {
        digitalWrite(LED, led_state);//Update the state of the indicator
    }
    /*Function: calculate the heart rate*/
    void sum()
    {
     if(data_effect)
        {
          heart_rate=1200000/(temp[20]-temp[0]);//60*20*1000/20_total_time 
          Serial.print("Heart_rate_is:\t");
          Serial.println(heart_rate);
        }
       data_effect=1;//sign bit
    }
    /*Function: Interrupt service routine.Get the sigal from the external interrupt*/
    void interrupt()
    {
        temp[counter]=millis();
        Serial.println(counter,DEC);
        Serial.println(temp[counter]);
        switch(counter)
        {
            case 0:
                sub=temp[counter]-temp[20];
                Serial.println(sub);
                break;
            default:
                sub=temp[counter]-temp[counter-1];
                Serial.println(sub);
                break;
        }
        if(sub>max_heartpluse_duty)//set 2 seconds as max heart pluse duty
        {
            data_effect=0;//sign bit
            counter=0;
            Serial.println("Heart rate measure error,test will restart!" );
            arrayInit();
        }
        if (counter==20&&data_effect)
        {
            counter=0;
            sum();
        }
        else if(counter!=20&&data_effect)
        counter++;
        else 
        {
            counter=0;
            data_effect=1;
        }
 
    }
    /*Function: Initialization for the array(temp)*/
    void arrayInit()
    {
        for(unsigned char i=0;i < 20;i ++)
        {
            temp[i]=0;
        }
        temp[20]=millis();
    }

```

####③回路図
[**「fritzing」**](https://fritzing.org/download/
)で回路図も書いてみたかったんですが、
>The source code of Fritzing is available on our Github repository. Everyone is welcome to participate in the development.
>We are asking you to pay 8€ (less than US$9) for downloading the application. 
>Fritzingのソースコードは、Githubリポジトリで入手できます。 どなたでもご参加いただけます。
>アプリケーションのダウンロードには8ユーロ（9米ドル未満）の支払いをお願いしています。

2020年12月現在は**無料ではなく、**8ユーロの支払いからになっていて、今回は断念しました。。。
↓fritzing 公式サイト↓
https://fritzing.org/download/


###■TouchDesigner
####ノードを組む
といっても、基本的に**YouTubeにあったチュートリアル**をいじっていく感じです。
・YouTubeにあったチュートリアル(Aurora Audio Spectrum – TouchDesigner Tutorial 2)
https://www.youtube.com/watch?v=NJE48IVzNVc&t=6s

（以下の①〜⑤は、チュートリアル動画を見てから読むことを推奨します。）

####①LookUpTOP・RampTOP
![スクリーンショット 2020-12-16 19.58.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315671/d29f5ed4-3487-a3be-b327-fc110fef278d.png)
LookUpTOPと繋がっているRampTOPの色を調整します。これによってビジュアルの色が画像のようになると思います。
私は`HeatBeat`という作品を制作したので、熱と心臓をイメージした赤色を主体にしていますが、他にもいろいろ試してみてください。

####②TransformTOP・FeedbackTOP
![スクリーンショット 2020-12-16 19.59.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315671/52745609-1d3c-8eab-1818-fb6dd601dc68.png)
いじくるところは、`TransformTOPのScale`の部分です。おおむねチュートリアルの通りできていれば、手前に進んでくるような動きに変化があると思います。これは主に`FeedbackTOP`・`LevelTOPのOpacity`・`CompositionTOPのAdd`のセットによるものです。このセットは他のチュートリアルでもよく見かけたので、覚えておくといいかもです。

####③Audio File In CHOP
![スクリーンショット 2020-12-16 19.56.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315671/cd58a58f-4b84-ec7c-d2e5-b5d745277d18.png)
今回使用した音源は、もとからTouchDesignerに入っている音源です。`Audio File In CHOPのFile`から`Audio/SonarBlackie666.wav`を選んでいます。ソナー音がいい感じです。
（ちなみに、Audio Device Out CHOPを繋がないと音がならないので注意です）

####④SerialDAT
![スクリーンショット 2020-12-16 19.54.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315671/b067a2aa-abd8-30e8-c1af-d4c1caa0b10e.png)
ここでArduinoから送られてきたシリアル通信を受け取っています。ポートは、`SerialDATのPort`から選んでください。`BaudRate`はArduinoIDEのプログラムに合わせていればOKです。9600で大丈夫でした。`MaximumLinesは1`にしましょう。
（前述しましたが、このとき、ArduinoIDEでシリアルモニタを開いていると、うまくシリアル通信ができないので、確認ができれば閉じておきましょう。）


####⑤LogicCHOP
![スクリーンショット 2020-12-16 19.55.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315671/1d1dbba1-5e06-4d5e-9ad7-65c36a7f1120.png)
このオペレーターが、今回の鍵になると思います。ざっくりいうと、**送られてきた値によって、0か1を返す**オペレーターです。
**↓LogicCHOPの日本語ドキュメント↓**
http://ted-kanakubo.com/touchdesigner-jp/?p=26
`ConvertInputをOn When Value Changed`にすることで、心拍センサーからのデータを取得してシリアル通信で送られてきた値は常に変化していくので、`値が変化した時に1`、つまりOnにすることができます。
この`LogicCHOP`によって、心拍センサーのデータがシリアル通信で送られ、映像の変化や音を出力するトリガーになっています。




#あとがき
**初投稿がアドベントカレンダー**ということで、緊張しました笑　至らないところもあったと思いますが、精一杯書いたので許してください。笑　記事にするときって、**自分の中であいまいだったことが結構浮き彫りに**なってきますね。プレゼンの時でもそうですが、**書いていくうちにハッとさせられる**というか。「なんでここはこの設定なんだっけ？」「これってどういう機能だっけ？」みたいな。でもこうやって外に出してみるとわかることあったり、書きながら勉強にもなったり。
心拍センサーは、大学の機材を扱うときに知り合った大学院の人にもらったもので、もらうきっかけは、TwitterでTouchDesignerで作ったHeatBeatを投稿したときに、**「それって心拍センサー使ってできる？」**と聞かれ、実際にいただいたものです。そんな心やさしき方のTwitterアカウントも載せておきますね。笑
Arduinoを普段利用されている方も、**別のソフトウェアと連携させることで表現の幅が広がる**こともあると思うので、これをきっかけにTouchDesignerとかしてくれたら嬉しいです。はしゃぎすぎて天井に突き刺さりますうそです。
こういうインタラクティブなものを制作するときは、`「input」「output」「その間をつなぐアルゴリズムやプログラム」`といった三つに分けると良きです。これも大学で、インタラクティブアート関連のスペシャリスト教授に教えてもらいました。こちらも載せておきます。笑
ここまで読んでくださり、ありがとうございます。
今日も一日、お疲れ様です。


心拍センサーくれた心やさしき人
https://twitter.com/amanozyakulab

インタラクティブアート関連のスペシャリスト
https://makotohirahara.com/



---
###TODAY IS A GOOD DAY FOR YOU
---