M5StackGRAYのジャイロセンサの値を3G拡張ボードを使ってSORACOM Harvestに送ってみた


##動作確認環境
Windows 10

##前提条件
- Visual Studio CodeにPlatform IOをインストール済み
<BR>※本記事はArduino IDEではなく、Platform IOで開発する場合を想定しています。
- SORACOMのアカウント保有済み

##いるもの
- [M5Stack GRAY](https://www.switch-science.com/catalog/3648/)
- [M5Stack用3G拡張ボード](https://soracom.jp/products/kit/3g_module_m5stack/)
- ソラコムのSIMカード (ナノサイズ）　 　
<br>※プランは plan01s , plan-D


##手順

###M5Stack

M5StackGRAYを開いて、
その間に3G拡張ボードを挟みます。

![スクリーンショット 2020-10-20 23.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/06cef27f-0511-cb6f-d0b5-89b47a49b298.png)

完成形
![IMG_8328.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/fefdc91f-0d2f-de4e-ffa0-ffce9021b5c3.jpeg)




###ソラコム
- SORACOM ユーザーコンソール を開きます。
- SIM グループを作成します。
- SIM グループの SORACOM Harvest の設定を ON にします。
[![Image from Gyazo](https://i.gyazo.com/9f7011d57131b5799a16e3bcc71ba3d0.png)](https://gyazo.com/9f7011d57131b5799a16e3bcc71ba3d0)
- M5Stack に取り付けている SIM を先ほど作成した SIM グループ に所属させます。


###VSCode
PlatformIOにて、新しいprojectを作成
[![Image from Gyazo](https://i.gyazo.com/942eb547f78649675425a258ec80b3ad.png)](https://gyazo.com/942eb547f78649675425a258ec80b3ad)


ライブラリ（M5Stack）を追加
[![Image from Gyazo](https://i.gyazo.com/ed022de0be2eba3c8557a1e60302ba12.png)](https://gyazo.com/ed022de0be2eba3c8557a1e60302ba12)

ライブラリ（TinyGSM）を追加
[![Image from Gyazo](https://i.gyazo.com/3539766cf84522ce0ad6a2b32f00e082.png)](https://gyazo.com/3539766cf84522ce0ad6a2b32f00e082)





[ソラコムのサイト](https://dev.soracom.io/jp/start/m5stack/)にあるコードをもとに、ジャイロセンサー値を取得するように修正します。

M5Stackのジャイロセンサー値取得は、こちらのサイトを参考にしました。
・[【M5Stack】第4回 M5Stack Fire内蔵のIMU（MPU6886）を使って姿勢角算出](https://shizenkarasuzon.hatenablog.com/entry/2020/05/21/013307)



```main.cpp
// <M5Stack.h>をincludeする前に、IMUモジュールを#defineしておく
#define M5STACK_MPU6886 
#include <M5Stack.h>

//3G通信に必要
#define TINY_GSM_MODEM_UBLOX
#include <TinyGsmClient.h>

float gyroX, gyroY, gyroZ;

TinyGsm modem(Serial2); /* Serial2 is Modem of 3G Module */
TinyGsmClient ctx(modem);

void setup() {
  Serial.begin(115200);
 
  M5.begin();
  M5.Power.begin(); 

  M5.IMU.Init();
 
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.println(F("M5Stack + 3G Module"));

  M5.Lcd.print(F("modem.restart()"));
  Serial2.begin(115200, SERIAL_8N1, 16, 17);
  modem.restart();
  M5.Lcd.println(F("done"));

  M5.Lcd.print(F("getModemInfo:"));
  String modemInfo = modem.getModemInfo();
  M5.Lcd.println(modemInfo);

  M5.Lcd.print(F("waitForNetwork()"));
  while (!modem.waitForNetwork()) M5.Lcd.print(".");
  M5.Lcd.println(F("Ok"));

  M5.Lcd.print(F("gprsConnect(soracom.io)"));
  modem.gprsConnect("soracom.io", "sora", "sora");
  M5.Lcd.println(F("done"));

  M5.Lcd.print(F("isNetworkConnected()"));
  while (!modem.isNetworkConnected()) M5.Lcd.print(".");
  M5.Lcd.println(F("Ok"));

  M5.Lcd.print(F("My IP addr: "));
  IPAddress ipaddr = modem.localIP();
  M5.Lcd.print(ipaddr);
  delay(2000);
}


void loop() {
  M5.update();

  M5.Lcd.clear(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.println(F("Uptime post to SORACOM Harvest"));

  /* HTTP GET example */
  if (!ctx.connect("uni.soracom.io", 80)) {
    Serial.println(F("Connect failed."));
    return;
  }
  Serial.println(F("connected."));

  /* build payload */

  M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
  M5.Lcd.setCursor(0, 10);
  M5.Lcd.printf("gyro=(%5.1f, %5.1f, %5.1f)", gyroX, gyroY, gyroZ);
  
  char payload[1024];


  M5.Lcd.setCursor(0, 15);
  /* send request */
  ctx.println("POST / HTTP/1.1");
  ctx.println("Host: uni.soracom.io");
  ctx.println("Content-Type: application/json");
  char content_length_hdr[32];
  sprintf(content_length_hdr, "Content-Length: %lu", strlen(payload));
  ctx.println(content_length_hdr);
  ctx.println();
  ctx.println(payload);
  Serial.println("sent.");

  /* receive response */
  while (ctx.connected()) {
    String line = ctx.readStringUntil('\n');
    Serial.println(line);
    if (line == "\r") {
      Serial.println("headers received.");
      break;
    }
  }
  char buf[1 * 1024] = {0};
  ctx.readBytes(buf, sizeof(buf)); /* body */
  ctx.stop();
  M5.Lcd.println(buf);

  delay(1000 * 10);
}
```

##データ取得・可視化
SORACOMユーザコンソールの Menu > SIM管理
１、該当のSIMをチェック
２、操作　＞　３、データを取得
[![Image from Gyazo](https://i.gyazo.com/c5c428bd75b5cc45f1590bb80e68a228.png)](https://gyazo.com/c5c428bd75b5cc45f1590bb80e68a228)

ちゃんとデータが届いており、グラフで可視化されました。
（ジャイロセンサの値をグラフ化することに意味はないですが）
[![Image from Gyazo](https://i.gyazo.com/9f440ff1e71eb3d28f7d370d3133f511.png)](https://gyazo.com/9f440ff1e71eb3d28f7d370d3133f511)


<br>