Wio LTEで遊んでみる（その５：3軸デジタル加速度センサーとGPS）

[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)
- [四回目：磁気スイッチと超音波距離センサー](https://qiita.com/ryo_naka/items/c433a9c362679cee3d18)


今回は3軸デジタル加速度センサーとGPSを使ってみる。

##〇センサー
[3軸デジタル加速度センサー](http://wiki.seeedstudio.com/Grove-3-Axis_Digital_Accelerometer-16g/)
[GPS](http://wiki.seeedstudio.com/Grove-GPS/)

3軸デジタル加速度センサーとGPSの組み合わせで何ができるのかわからないのでノープランで開始してみる。

####〇3軸デジタル加速度センサー

まずは、
Download the [Digital Accelerometer(±16g) Library](https://github.com/Seeed-Studio/Accelerometer_ADXL345) 
とあるので前回同様に専用ライブラリをDLしてインクルード。
前回と違うのはGit Hubへのリンクなので、ZIPにしてDL。
<img width="110" alt="3d_01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/983a8153-100d-473f-ab0a-a28f10a34eb2.png">
あとはそのままインクルードさせればOK。

`Step1: Plug it onto the I2C port of your Grove - Base Shield.`
って書いてるのでI2Cに刺してみる。

	#include <WioLTEforArduino.h>
	#include <ADXL345.h>          // https://github.com/Seeed-Studio/Accelerometer_ADXL345
	
	#define INTERVAL    (100)
	
	WioLTE Wio;
	ADXL345 Accel;
	
	void setup()
	{
	  delay(200);
	
	  SerialUSB.println("");
	  SerialUSB.println("____ START ____________________________________");
	  
	  SerialUSB.println("### I/O Initialize.");
	  Wio.Init();
	  
	  SerialUSB.println("### Power supply ON.");
	  Wio.PowerSupplyGrove(true);
	  delay(500);
	  Accel.powerOn();
	  
	  SerialUSB.println("### Setup completed.");
	}
	
	void loop()
	{
	  int x;
	  int y;
	  int z;
	  Accel.readXYZ(&x, &y, &z);
	  SerialUSB.print(x);
	  SerialUSB.print(' ');
	  SerialUSB.print(y);
	  SerialUSB.print(' ');
	  SerialUSB.println(z);
	  
	  delay(INTERVAL);
	}
上記はサンプルスケッチそのまま。
実行してみれば値そのものは簡単に表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106639/8da6f256-1f8c-00e4-4ebc-39478a3943d9.png)

が、意味がわからない。。
いや、スケッチをみればX,Y,Z軸を表しているのはわかるが、この値を見て「どう動いたか？」を導出するのはもう一段階めんどくさそう。
なので、とりあえず棚上げ。
揺れたかどうかのチェックぐらいに使えるものとでも思っておけばいいのか？
簡易震度計にでも使えそうかなと思う反面、これで「どれくらい揺れたか？」みたいなものを収集しようと思うと悩みそう。

※振動チェックに使いたかったらこの辺のサイトが参考にさせてもらえそうな気配
https://ambidata.io/samples/vibration/vibration/
https://zigsow.jp/review/286/264527


で、この時点で地震とかで揺れたらその地点のGPSを取得できるんじゃね？
というアイデアが。
ついでにその情報もSlackとかに流してみたいな。

ただ、震度チェックの部分がちょっとややこしそうなので、先にGPSへ。


####〇GPS

・・・
さっそくどこに刺すのかがわからない。
いくつかサイトをふらふらしていたら以下に[UART]とあるので刺してみる。
https://iot.firstfournotes.com/wiolte/grove-gps/

とりあえず情報は取得できた。窓際じゃないとやはり取得はできないのね。
<img width="449" alt="gps_01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/a9a108f2-edb3-426d-9caa-5d2f18a2f45a.png">

が、これだけだと読みにくい。
なので、上記のサイトをそのまま参考に[TinyGPS++」](http://arduiniana.org/libraries/tinygpsplus/)を使用して読みやすくする。

	#include <WioLTEforArduino.h>
	#include <TinyGPS++.h>
	
	//状態に対する色設定
	#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
	
	WioLTE Wio;
	TinyGPSPlus gps;
	
	void setup()
	{
	  delay(200);
	
	  SerialUSB.println("");
	  SerialUSB.println("____ START ____________________________________");
	  
	  SerialUSB.println("### I/O Initialize.");
	  GpsBegin(&Serial);
	  Wio.Init();
	  Wio.LedSetRGB(COLOR_SETUP);
	  
	  SerialUSB.println("### Power supply ON.");
	  Wio.PowerSupplyGrove(true);
	  delay(500);
	
	  SerialUSB.println("### Setup completed.");
	  Wio.LedSetRGB(COLOR_NONE);
	}
	
	void loop()
	{
	  Wio.LedSetRGB(COLOR_MAGNETIC);
	  const char* data = GpsRead();
	  if (data != NULL && strncmp(data, "$GPGGA,", 7) == 0) {
	    SerialUSB.println(data);
	  }
	  Wio.LedSetRGB(COLOR_NONE);
	}
	
	////////////////////////////////////////////////////////////////////////////////////////
	//
	
	#define GPS_OVERFLOW_STRING "OVERFLOW"
	
	HardwareSerial* GpsSerial;
	char GpsData[100];
	char GpsDataLength;
	
	void GpsBegin(HardwareSerial* serial)
	{
	  GpsSerial = serial;
	  GpsSerial->begin(9600);
	  GpsDataLength = 0;
	}
	void displayInfo()
	{
	    SerialUSB.print(F("Location: ")); 
	    if (gps.location.isValid()) {
	        SerialUSB.println(gps.location.lat(), 6);
	        SerialUSB.println(gps.location.lng(), 6);
	    } else {
	        SerialUSB.println(F("INVALID"));
	    }
	}
	
	const char* GpsRead()
	{
	  while (GpsSerial->available()) {
	    char data = GpsSerial->read();
	
	    if (gps.encode(data)) {
	      displayInfo();
	    }
	
	    
	    if (data == '\r') continue;
	    if (data == '\n') {
	      GpsData[GpsDataLength] = '\0';
	      GpsDataLength = 0;
	      return GpsData;
	    }
	    
	    if (GpsDataLength > sizeof (GpsData) - 1) { // Overflow
	      GpsDataLength = 0;
	      return GPS_OVERFLOW_STRING;
	    }
	    GpsData[GpsDataLength++] = data;
	  }
	
	  return NULL;
	}
	
	////////////////////////////////////////////////////////////////////////////////////////
※SETUP時にLEDをつけるのがわかりやすくてちょっと気に入ったので流用。

<img width="447" alt="gps_02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/0cd33902-45ce-c9a2-d63b-5c4b51ed2f55.png">

こんな感じ。わかりやすい。


簡易震度計まではあと一息な感じではあるが、とりあえず今回はここまで。
とりあえずスタートアップとしてついてきていたセンサー類はひとしきり触ってみたことになるのかな。
これらとSORACOMの通信も組み合わせて「簡易震度計」を目指してみようかと思う。