SORACOM Technology Camp 2018の会場で販売していた『PUSH for Wio』を組み立ててみました

# SORACOM Technology Camp 2018の会場で販売していた『PUSH for Wio』を組み立ててみました
2018年4月26日に開催されていた『SORACOM Technology Camp 2018』の会場で、限定１０個販売していて、展示物を見ることなく、一番最初にゲットさせていただきました。まだ、商品を並べる前に購入させてもらったので、特に説明書とか頂いてなく、これから組み立てる人向けに書いてみました。

![180503-0002.png](https://qiita-image-store.s3.amazonaws.com/0/33220/dbdfa211-96f2-e093-4003-cb8a6e9acb45.png)

## 動作動画
https://youtu.be/Q1sxkrE2JHo

## 開発環境
Arduino IDE 1.8.5
ボード：Wio LTE　1.1.3
ライブラリ：Wio LTE for Arduino 1.1.10
GPS受信用のライブラリ TinyGPSPlus 1.0.2(http://arduiniana.org/libraries/tinygpsplus/)

## 使ったデバイス
Wio LTE with SORACOM SIM
GROVE Button(P) v1.2 (https://www.seeedstudio.com/grove-buttonp-p-1243.html)
秋月電子通商　ＧＰＳ受信機キット　１ＰＰＳ出力付き　「みちびき」３機受信対応 (http://akizukidenshi.com/catalog/g/gK-09991/)
GROVE - 4ピン-ジャンパメスケーブル 20cm (https://www.switch-science.com/catalog/1048/)
PUSH for Wio １式 (3Dプリントデータは、 https://make.dmm.com/item/904124/ だと思われる)
写真のように、３Dプリントされた。箱（上下）とボタン、ネジ１０本、透明アクリルの棒、３Dプリントされた治具が含まれていました。

![IMG_9434.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/9793b0ec-c672-6c90-bf02-0a63d88697ec.jpeg)

## 組立のコツ
３Dプリントされたもので、あまり品質が良くないので、ネジ穴がとても微妙なので、まずは、付属のネジでネジを回して、ネジ穴を作りましょう！私の場合、Wio LTEのボードを固定するネジ穴はダメダメでした。

![IMG_9435.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/6b098d03-e6a0-90c0-a560-c306e88b2044.jpeg)

ボードを載せた写真、下の穴が見えない状況

![IMG_9437.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/232188fd-2981-7ebc-df89-c61eafb88aa4.jpeg)

## 最終成果物はこんな感じ

元々、GPSは、GROVE GPSを固定するためのネジ穴なので、秋月GPSは一カ所のみで固定しています。
アクリルの棒は、フルカラーLEDの上に来るようになっているので、ホットボンドでケースに固定しました。

![IMG_9446.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/733037a4-602a-ad52-98ea-fbd04de02a68.jpeg)

## ダメばかり言っても良くないので、ここはちゃんと考慮されている部分も紹介すると

Wio LTEはプログラムを書き込む際にDFUモードへ切り替えるために、DFUボタンを押さないといけないのですが、このケースでは、そこはちゃんと考えられていて、底面にボタン押下用の穴が空いていて、さらに、押しやすくするために、３Dプリントされた治具を使って、押しやすくしているのは感心しました。ケースを押し込むと、DFUボタンが押下されている状態になるので、その状態で、RSTボタンを押下して、ケースを離すと、DFUモードへ移行する

![IMG_9439.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/e2a169fe-79a0-cf51-6f9f-e302b141402c.jpeg)

## 書き込んだプログラム

電源を投入すると、LEDが緑色で光ります。
モバイル網に接続完了すると、LEDが青色に光ります。
ボタンを押下すると、LEDが赤く光り、IFTTTのWebhookをたたきに行きます。
処理が終了すると、また、青色に光るというプログラムとなっています。
IFTTTで通知する際に、value1には、日時(UTC) が入ります。この日時はGPSモジュールから取得した日時となっています。
位置情報が取得できていれば、value2に値が、緯度、緯度が記録されます。測位出来ていない場合は、空になっています。

```c:pushwio.ino
// Wio LTE用 PUSH-WIO用のコード
// Programed by Kazuyuki Eguchi

// Serial端子に、秋月GPSGROVE - 4ピン-ジャンパメスケーブル 20cm経由で接続
// D38端子に、Grove Button(P)を接続

// TinyGPSPlus 1.0.2 http://arduiniana.org/libraries/tinygpsplus/

#include <WioLTEforArduino.h>
#include <TinyGPS++.h>
#include <stdio.h>

#define APN               "soracom.io"
#define USERNAME          "sora"
#define PASSWORD          "sora"

#define BUTTON_PIN  (WIOLTE_D38)

#define WEBHOOK_EVENTNAME ""
#define WEBHOOK_KEY       ""
#define WEBHOOK_URL       "https://maker.ifttt.com/trigger/"WEBHOOK_EVENTNAME"/with/key/"WEBHOOK_KEY

WioLTE Wio;
TinyGPSPlus gps;

char datetime[50];
char gpsdata[50];
  
void setup() {
  pinMode(BUTTON_PIN, INPUT);
  
  delay(200);
  
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();
  Wio.LedSetRGB(0x00, 0xff, 0x00);
  
  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyGrove(true);
  Wio.PowerSupplyLTE(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  SerialUSB.println("### Connecting to \""APN"\".");
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  Serial.begin(9600);
  sprintf(gpsdata," ");
  sprintf(datetime," ");
  SerialUSB.println("### Setup completed.");
}

void loop() {
  char data[100];
  int status;
  int buttonState = digitalRead(BUTTON_PIN);

  Wio.LedSetRGB(0x00, 0x00, 0xff);
  
  // SerialUSB.print(buttonState);

  if(gps.date.isValid())
  {
    sprintf(datetime,"%04d/%02d/%02d %02d:%02d:%02d UTC"
    ,gps.date.year()
    ,gps.date.month()
    ,gps.date.day()
    ,gps.time.hour()
    ,gps.time.minute()
    ,gps.time.second());
    // SerialUSB.println(datetime);
  }

  if (gps.location.isUpdated()){
    sprintf(gpsdata,"%f,%f",gps.location.lat(),gps.location.lng());
    // SerialUSB.println(gpsdata);
  }  

  // ボタンを押されたら、IFTTT Webhookで通知する
  if(buttonState == 1)
  {
    Wio.LedSetRGB(0xff, 0x00, 0x00);
    SerialUSB.println("### Post.");
    sprintf(data, "{\"value1\":\"%s\",\"value2\":\"%s\"}",datetime,gpsdata);
    SerialUSB.print("Post:");
    SerialUSB.print(data);
    SerialUSB.println("");
    if (!Wio.HttpPost(WEBHOOK_URL, data, &status)) {
      SerialUSB.println("### ERROR! ###");
      goto err;
    }
    SerialUSB.print("Status:");
    SerialUSB.println(status);
  }
  
err:
  while (Serial.available()) {
    char data = Serial.read();
    gps.encode(data);
  }
}
```

以上、ご参考までに