Arduino + Max8 (4) ToF距離センサを使ってみる

## ここまでのおさらい

前回は、jitterによる様々な映像加工について学習しました
(4)と(5)ではさらに2つの新しいセンサを使っていきます

- ToF距離センサ

  推奨測定距離は30mm - 1000mm（最大2mまで）、1mm単位で測定できる対象物の反射率に関わらず正確な測距が可能

- 3軸加速度センサ(±1.5g)

  X, Y, Z軸にかかる加速度を検出する
  "g"は重力を基準とした加速度の大きさを表す単位で、重力と同じ大きさの力が加わる状況のことを"1g"ということがある。

この記事ではToF距離センサの使用法について説明します

## ToF距離センサを使う

####ハードウェアの準備

![img](https://tva1.sinaimg.cn/large/006y8mN6gy1g8o8etb4mpj30u00u0q5p.jpg)

1. センサ（上の写真のもの）にコードを繋いで、Seeeduinoの「I2C」のポートに接続
2. SeeeduinoをPCに接続

#### ソフトウェアの準備

1. センサを使用するためのライブラリを下記URLからダウンロード

   緑色のアイコン`Clone or Download`を選択→`Download ZIP`を選択

https://github.com/Seeed-Studio/Grove-Ranging-sensor-VL53L0X

2. Arduino IDEを起動して`スケッチ`→`ライブラリをインクルード`→`.ZIP形式のライブラリをインストール`を順に選択し、先ほどダウンロードしたzipフォルダを選択
3. 下部ウインドウに「ライブラリが追加されました」と表示されたらライブラリのインストールは完了

#### サンプルプログラムを試す

1. `ファイル`→`スケッチ例`→`Grove _Ranging_sensor_vl5310x`→`continuous_ranging`を選択してスケッチを開く

2. `➡`をクリックしてスケッチを書き込む

3. `シリアルモニタ`をクリックして値を確認する

   ※このとき、通信レートを「115200bps」に変更する

4. スケッチ上の`delay(100)`の値を「10」に変更し、より早く値を取得できるように変更する

5. 再び`➡`をクリックしてスケッチを書き込み、`シリアルモニタ`をクリックして値を確認

#### 値をMax8で読めるようにスケッチを改変

```java
//continuous_ranging_2max
//シリアル通信でToFセンサの値を送信するスケッチforMax8

#include "Seeed_vl53l0x.h"
Seeed_vl53l0x VL53L0X;

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
  #define SERIAL SerialUSB
#else
  #define SERIAL Serial
#endif



void setup()
{ 
	VL53L0X_Error Status = VL53L0X_ERROR_NONE;
	SERIAL.begin(9600);
	Status=VL53L0X.VL53L0X_common_init();
	if(VL53L0X_ERROR_NONE!=Status)
	{
		SERIAL.println("start vl53l0x mesurement failed!");
		VL53L0X.print_pal_error(Status);
		while(1);
	}
	VL53L0X.VL53L0X_continuous_ranging_init();
	if(VL53L0X_ERROR_NONE!=Status)
	{
		SERIAL.println("start vl53l0x mesurement failed!");
		VL53L0X.print_pal_error(Status);
		while(1);
	}
}


void loop()
{
    VL53L0X_RangingMeasurementData_t RangingMeasurementData;
    VL53L0X.PerformContinuousRangingMeasurement(&RangingMeasurementData);
	if(RangingMeasurementData.RangeMilliMeter>=2000) //2000ミリ以上距離がある時
	{
    Serial.print(200);
    Serial.println();
		//SERIAL.println("out of ranger"); //何も出力しない
	}
	else
	{
		//SERIAL.print("distance::");
		//SERIAL.println(RangingMeasurementData.RangeMilliMeter);
    Serial.print(RangingMeasurementData.RangeMilliMeter/10); //単位をcmに変換
    Serial.println(); //改行データを送る
	}
    delay(10); //10ミリ秒待つ
}
```

#### Max8で値をみてみる

下記の文字列をコピーして、Max8で`File` → `New From Clipboard`を選択

<details><summary>ここを押して展開される内容をコピー</summary><pre><code>
----------begin_max5_patcher----------
1586.3oc2Zk0iahDD94IR4+.hmcr56i8sceI+FVkMJBay3PBl1BZmLSh1+6a
e.XOLbz1FOYy3QZ.2PSU0WcW3e912bW7J0CoUwQ+QzGht6teZV4N2Z1UtqYg
6h2k7v57jJ2MFuVsaWZgNdQ8E0oOncWXSVkNoXcZ6Ux13VWs5KuCJaWcehd8
myJ19oxz0ZOoILzRNcQDjRVRoTDlC7evjEQL3RvhHDXIH5iMOihC6xJxS0NN
BdxppC5lkAtU+229F6QygEAKgEoe2vyOW.2mr9qQY9+5SHI3wDRjvJGXB2IN
b+AzfREoeopUX8qoebep+wGGG8wKVhqxy1jV1mLgjiKSTmhCKgKkR.P.k9Ob
rWkYzojmn49ZgZ0ZUtpz+..KIXIBxVXNiSj.j8DD0eFbZU99jxjco5zxOkVj
rJ2gEfIPtpre3tODksDbSfSCgW0Obhgg.mTBZojwI.VMbJLqAlvf4RvDzvh+
hn3UIEauQVUhQgAfSVuBiJLjyHbqsDi1XUIsKA+M1pZD3jNFbBg3qDNkVORK
FhMPHv4rhIPCF+5DMAADF+J.SFfKHVLTf3DJzdFjxDL7uwn4fEE7OqV+YkpJ
MpJsLKIeupT2KlOpALvUB.08eHk+RWOfVscaduk0f4ix2jZNFsjhPLBotpFn
Q6iHNofbkJ7J8i9UpYx2qx2DetUNjYTbWS1tgJWpz7fitWUtKQqS2zK9IB.+
PPiFGarcQM3mwSQvCMc3stpvsI59sMjgXaXkCFEhH0wQj1povSHanWxZCGz0
NxTteoNZuJO2HaQ5O23jGMjWNTLcjUD9WjW9k0WCcZIhxwOuZNwKdSMCVSJD
GPwXuRJIcDT.EPMTu9QAX.1yuR.gAhmenXp97gATfHRvBqO+AbzIilsdQeGt
AXw8kpcUOtakJuObPF.LXKZqataNJTL4X4MdN78kooEuCF+Rl+aHrISqR5CU
BIGGzcfvl.GvCgC+U9gzK.FtQVI+HOZao5vdSg5f9PD9zHBTXPAImCaioX52
jSur5fFOtw0f.C2I.aZYjPaJ4uag+q19zNDk.puuPJvz5svdlwIRZ6ZDN2ML
X8n9+hgjgqKUlbI8AvATnE2milM2UOeqxzTklGAwQvdkWR.NMlDwPL.CAMej
sUVFPPkmJ93wE+EGOdafBWiCIQRV+wPBntDHPrjXmISStFfwG5Ry+hlJ+60f
Bl9gKOz+qPfEvfP714HROgGuWUnal1CDcbXOOOBCwOzcJ.fXx5HLBVXSzyx+
Mpsmzq2.dTVtpvDSxsm+zpoiGKU8oa69j0oWWiO6Njqy5LsuukT1xO8c8SM7
N5HtNoXyil+41G+zUyrqxN2WoQOZXJg3eKQtDFX5R6aC.wNcWszibtzqcmny
cvtcLe.RJQ3GbI.fkr5yPxvFgYKevO640WYdVMYvPWSKEMNIjSdxMVgfmwn3
ylQa2JsYqBlcbut49xATgvelffelL5rEurYFOTEOmHkFMhw+nUUZqQmZeDcb
v76INOq3YufXmcq8Bcb6pTGJW2P35FDhNg41jVoyJRzYphStIa5uHvXQSCld
hPnWGlRUZc7slmuTLfcvfQvi20trM6UlrJ0vLlac5QPrMYFD113j0LgQF3Z8
HOfYPd3gHOhYS+wBgbzYib12We.1mj4ifgPO9rRNTfja.iQNyZvAMcryfDSy
6MSo1DBzam1yklEdGGTrC77Y6g4A66NODDElDBmOBFTzIHd9HHMHBhlOBBBh
fyGjBChfciyLqobbr.LHV3VkkvwBnfXAzsjEvAwB3eor.RdqsElTQzMNvu.y
wtQFleVXRmxtwJlWagfBKLeI5Cpvo4KrG8xIWcaEI62+szxp5c3ojos8u3a4
Qrv+8rB+28MjEWl9srlsTeKIklNn0l1mOT56l+AVc+5w6TFEZwgrFyJqrZIs
q+wtszzNMfdlutQ9tO4PttCpjrdcZg979Ym0.FKZ.7Ryi33HYaHnajDs1hOU
I0gSe5aDIbVE3F9C19w0LIy1d5MiK+6z7b02mhMOc3UevM9JpcbdGMz5QNDH
Jzg3bAzORByln19rmeQw8VSs+Bat.7l2NfEpDAob+HSfR10ZZT6P4l2kkUq1
WOwL2bwd6aL2x+09pFjF
-----------end_max5_patcher-----------
</code></pre>

前回と同じ手順（`COMポートの選択`, `toggleを押す`）で値を確認



## 復習も兼ねた応用

> 1. 距離センサを使って音を再生するパッチを作る
> 2. 同様に、映像を再生するパッチを作る
> 3. エフェクトの掛かり具合を変化させるパッチを作る



＜参考＞

sensorPlayerパッチ（音の再生）
https://www.dropbox.com/s/1o8e3gjbsg2z46n/sensorPlayer.maxpat?dl=1

someFuncMoviePlayerパッチ（映像の再生）
https://www.dropbox.com/s/xmhsuilvjchctja/someFuncMoviePlayer.zip?dl=1

someFunkパッチ（センサデータ活用用オブジェクト）
https://www.dropbox.com/s/ixa35sulwtkua4a/someFunk.maxpat?dl=1

jitterエフェクトパッチ（画像データの加工）
https://www.dropbox.com/s/8jv1ssoehabzsbe/jitterEffect.maxpat?dl=1