Wio LTEで遊んでみる（その４：磁気スイッチと超音波距離センサー）

[Grove IoT スターターキット for SORACOM](https://soracom.jp/press/2017102501/)で遊んでみるの続き。

- [初回：環境構築＋Lチカ](https://qiita.com/ryo_naka/items/45fcb686f264f537a493)
- [二回目：温湿度センサー](https://qiita.com/ryo_naka/items/57e34c3fadb3414fc6c6)
- [三回目：ボタン＋ブザー](https://qiita.com/ryo_naka/items/6f1420574f13f84c8fa6)


今回は磁気スイッチと超音波距離センサーを使ってみる。


##〇センサー
[磁気スイッチ](http://wiki.seeedstudio.com/Grove-Magnetic_Switch/)
[超音波距離センサー](http://wiki.seeedstudio.com/Grove-Ultrasonic_Ranger/)


とりあえずの目標は
**磁気でスイッチが入ったら、その時の正面の対象物への距離をログにでも出力してみる。
※追加でやるとしたら、一定距離以内だったらLEDが光るようにしてみるとか**
かな。


今回も各スケッチ例を見てみると、どっちもWIOLTE_D38を使うように書いてる。
前回を参考にして、磁気スイッチをD20にしてやってみることにする。

####〇磁気スイッチ

	#include <WioLTEforArduino.h>
	
	//#define MAGNETIC_SWITCH_PIN (WIOLTE_D38)
	#define MAGNETIC_SWITCH_PIN (WIOLTE_D20)
	#define INTERVAL            (100)
	
	WioLTE Wio;
	
	void setup()
	{
	  Wio.PowerSupplyGrove(true);
	  pinMode(MAGNETIC_SWITCH_PIN, INPUT);
	}
	
	void loop()
	{
	  int switchState = digitalRead(MAGNETIC_SWITCH_PIN);
	  SerialUSB.print(switchState ? '*' : '.');
	  
	  delay(INTERVAL);
	}

電源ONする処理を追加したぐらい。

で試してみたところ、動いているっぽいのだが、肝心の「磁気検知」の部分が今一つな印象。

<img width="451" alt="mag_01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/0cdd2469-fa82-013b-10e2-581e104b25fe.png">

磁石をくっつけたり離したりしているのに、反応したり(*の部分)しなかったり。。
磁石の磁力が弱いのか？

ちょっと改造。
ログの出し方などを参考
https://www.seeed.co.jp/blog/20180118a/

	#include <WioLTEforArduino.h>
	
	//#define MAGNETIC_SWITCH_PIN (WIOLTE_D38)
	#define MAGNETIC_SWITCH_PIN (WIOLTE_D20)
	#define INTERVAL            (500)
	
	//状態に対する色設定
	#define COLOR_SETUP 0, 10, 0
	#define COLOR_MEASURE 0, 0, 10
	#define COLOR_MAGNETIC 10, 0, 0
	#define COLOR_NONE_MAGNETIC 0, 0, 10
	#define COLOR_NONE 0, 0, 0
	
	
	WioLTE Wio;
	
	void setup()
	{
	  SerialUSB.println("____START____________");
	  SerialUSB.println("### I/O Initialize.");
	  Wio.Init();
	  Wio.LedSetRGB(COLOR_SETUP);
	  SerialUSB.println("### Power supply ON.");
	  
	  Wio.PowerSupplyGrove(true);
	  delay(5000);
	
	  pinMode(MAGNETIC_SWITCH_PIN, INPUT);
	
	  Wio.LedSetRGB(COLOR_NONE);
	}
	
	void loop()
	{
	  int sensorValue = digitalRead(MAGNETIC_SWITCH_PIN);
	  if(sensorValue == HIGH)//if the sensor value is HIGH?
	  {
	    //磁石あり
	    Wio.LedSetRGB(COLOR_MAGNETIC);
	    SerialUSB.print('*');
	  }
	  else
	  {
	    //磁石無し
	    Wio.LedSetRGB(COLOR_NONE_MAGNETIC);
	    SerialUSB.print('.');
	  } 
	   
	  delay(INTERVAL);
	}

これだと上手くいった。
<img width="349" alt="mag_02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/6aa87c23-0d6e-71f0-7e4e-6fbab7dee213.png">

おそらくだが、PowerSupplyGroveとpinModeの間にdelayが入ったのがポイント？
ちょっと間が必要なのかもしれない。
※というか、ログ処理以外だとそれしか足していないし。


####〇超音波距離センサー

上記の磁気センサー処理に超音波距離センサー処理を足してみる。
単純にスケッチ通りに追記すればいいかというとそうでもない模様。
`Ultrasonic.hが無いよ`
とのエラー

http://wiki.seeedstudio.com/Grove-Ultrasonic_Ranger/
に Download the [UltrasonicRanger Library](https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger/archive/master.zip) from Github.
と記載されている通り、ダウンロードして、ライブラリをインストール。
※ZIPを解凍してどっかにコピーするのかと思ったら、[IDEでそのままインクルードできた](http://wiki.seeedstudio.com/How_to_install_Arduino_Library/)。

処理そのものはほぼ悩むことなく実装。

	#include <WioLTEforArduino.h>
	#include <Ultrasonic.h>      // https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger
	
	//#define MAGNETIC_SWITCH_PIN (WIOLTE_D38)
	#define ULTRASONIC_PIN  (WIOLTE_D38)
	#define MAGNETIC_SWITCH_PIN (WIOLTE_D20)
	#define INTERVAL            (500)
	
	//状態に対する色設定
	#define COLOR_SETUP 0, 10, 0
	#define COLOR_MEASURE 0, 0, 10
	#define COLOR_MAGNETIC 10, 0, 0
	#define COLOR_NONE_MAGNETIC 0, 0, 10
	#define COLOR_NEAR 10, 10, 10
	#define COLOR_NONE 0, 0, 0
	
	Ultrasonic UltrasonicRanger(ULTRASONIC_PIN);
	
	
	WioLTE Wio;
	
	void setup()
	{
	  SerialUSB.println("____START____________");
	  SerialUSB.println("### I/O Initialize.");
	  Wio.Init();
	  Wio.LedSetRGB(COLOR_SETUP);
	  SerialUSB.println("### Power supply ON.");
	  
	  Wio.PowerSupplyGrove(true);
	  delay(5000);
	
	  pinMode(MAGNETIC_SWITCH_PIN, INPUT);
	
	  Wio.LedSetRGB(COLOR_NONE);
	}
	
	void loop()
	{
	  int sensorValue = digitalRead(MAGNETIC_SWITCH_PIN);
	  if(sensorValue == HIGH)//if the sensor value is HIGH?
	  {
	    //磁石あり
	    Wio.LedSetRGB(COLOR_MAGNETIC);
	    SerialUSB.print('*');
	    measure_distance();
	  }
	  else
	  {
	    //磁石無し
	    Wio.LedSetRGB(COLOR_NONE_MAGNETIC);
	    SerialUSB.print('.');
	  } 
	  delay(INTERVAL);
	}
	
	void measure_distance()
	{
	  long distance;
	  distance = UltrasonicRanger.MeasureInCentimeters();
	  SerialUSB.println("");
	  SerialUSB.print(distance);
	  SerialUSB.println("[cm]");
	
	  if(distance<20)
	  {
	    Wio.LedSetRGB(COLOR_NEAR);
	  }
	}

処理結果はこんな感じ。
<img width="131" alt="mag_03.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/d6e60ff8-4517-cfb3-8ced-a575ba4c451b.png">

上限値とがどれくらいなのかわからんが、これぐらいの値までは返ってきた。
<img width="83" alt="mag_04.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/f88ddabb-82a1-a526-9571-af5a15233797.png">

0になっているものあったので超音波が戻ってこなかったら0になるのかな？

しれっと距離が20cm未満の場合はLEDの色が変わるようにもしている。
遊んでみると結構面白い。
動画で撮るとわかりやすい気もするが、めんどくさいので割愛。

##所感
よく考えるといまのところSORACOMのSIMの部分は最初にHarvestにアップロードした以外はまったく使ってない。
残っているGPSモジュールあたりを使うときに地図アプリに表示させるようなものにしてみればいいかもしれない。