何処かに置き忘れたバッグを見つけ出したい女


# 忘れ物はございませんか？
私は先日、バッグを置き忘れました。。

<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/f7acb819-e709-f5a6-24bf-e17879b4a57d.png">


行ったところを手当たり次第探しに行き、自動券売機の横に置き去りにされたバッグを見つけました。
中身を確認したところ盗まれた形跡はなく、日本が優しい国で本当に本当によかった:smile:
けれどまたこんなことが起こったら精神が削られます。。
いくら優しい国でも、こんなことは二度あってたまるか！
そこで今回は、ATOM LiteとGPSを利用してバッグの場所を特定します。


## システム概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/e65de63b-fb4e-e845-50aa-4e51cd048560.png)

GPSモジュールで位置情報を取得し、IoTデーター可視化サービスAmbientに送信してバッグの位置を地図上にプロットしていきます:relaxed:

用意するものは以下です。
- ATOM Lite
- M5Stack用GPSユニット
- USB-Cケーブル

## ATOM Liteの環境構築

#### Arduino IDE のインストール
Arduino IDE のインストールを行います:relaxed:
詳細は省きます。
#### 基本設定

Arduino IDE のメニューバーから [ファイル] -> [基本設定] の順に選択をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/417bb79b-31d6-5ceb-44c4-ae6592d4989c.png)


「追加のボードマネージャのURL」には以下のURLをコピーして入力欄に貼り付け、「OK」ボタンを押します。
https://espressif.github.io/arduino-esp32/package_esp32_index.json

「ボードマネージャ」から以下を検索し、インストールを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/373c1935-d2ae-198a-53e2-875dc492cc44.png)

・Arduino AVR Boards
・esp32 by Espressif Systems


「ライブラリマネージャー」から以下を検索し、インストールを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/2838e357-769b-9eb7-2abf-f8e38ea77cdc.png)

・Ambient ESP32 ESP8266 lib
・FastLED
・M5Atom
・TinyGPSPlus


すべてのインストールが完了したら、以下のように[ツール] -> [esp32] -> [M5Stack-ATOM] の順に選択し、設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/ef95dc14-fcdd-54b0-911a-b90a371af515.png)


Arduino IDEがライブラリをインストールすると、Arduinoのスケッチが保存されているディレクトリに「libraries」というフォルダが作成されます。
「libraries」フォルダが作成がされている同ディレクトリに、「GPSLogger」というフォルダを作成し、ソースを書いていきます:santa_tone1:

Ambientの登録や設定の記載は省きます:cloud_rain:


## GPSLogger.ino
▼ **全体**
```
#include <M5Atom.h>
#include <WiFi.h>
#include <TinyGPS++.h>
#include <Ambient.h>

unsigned int channelId = xxxxx;
const char* writeKey = "xxxxxxxxxx";

const char* ssid = "xxxxxxxxxx";
const char* password = "xxxxxxxx";

static const int RXPin = 32, TXPin = 26;
TinyGPSPlus gps;
WiFiClient client;
Ambient ambient;

void setup() {
  M5.begin(true, false, false); // UART, I2C, LED
  Serial.println("Start");

  WiFi.begin(ssid, password); // Wi-Fi APに接続
  while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち
    delay(1000);
    Serial.print(".");
  }

  Serial.print("\nWiFi connected\nIP address: ");
  Serial.println(WiFi.localIP());

  Serial2.begin(9600, SERIAL_8N1, RXPin, TXPin);
  ambient.begin(channelId, writeKey, &client);
}

void loop() {
  if (M5.Btn.wasPressed()) {
    if (gps.location.isValid()) {
        sendInfo2Ambient();
    }
  }
  while (Serial2.available()) {
    if (gps.encode(Serial2.read())) {
      break;
    }
  }
  M5.update();
  delay(50);
}

void sendInfo2Ambient() {
  　char buf[16];
  
    dtostrf(gps.altitude.meters(), 4, 2, buf);
    Serial.println(buf);
    ambient.set(1, buf);
    dtostrf(gps.location.lat(), 12, 8, buf);
    Serial.println(buf);
    ambient.set(9, buf);
    dtostrf(gps.location.lng(), 12, 8, buf);
    Serial.println(buf);
    ambient.set(10, buf);

    ambient.send();
}
```

▼ **詳細**
* **ライブラリ**
 ```
#include <M5Atom.h>
#include <WiFi.h>
#include <TinyGPS++.h>
#include <Ambient.h>
```
・M5Atom.h：M5Atom用のライブラリ
・WiFi.h：Wi-Fiモジュールの制御を行うためのライブラリ
・TinyGPS++.h：GPSデータの処理を行うTinyGPS++ライブラリ
・Ambient.h：Ambientへのデータ送信を行うためのライブラリ

* **Ambientの設定**
```
unsigned int channelId = xxxxx;
const char* writeKey = "xxxxxxxxxx";
```
・channelId：Ambientで作成したチャンネル
・writeKey：Ambientで作成したライトキー

* **Wi-Fiの設定**
```
const char* ssid = "xxxxxxxxxx";
const char* password = "xxxxxxxx";
```
・ssid：Wi-FiネットワークのSSID
・password：Wi-Fiネットワークのパスワード

* **GPSデータ処理のための設定**
```
static const int RXPin = 32, TXPin = 26;
```
・RXPin = 32, TXPin = 26：GPSモジュールとの通信に使用されるシリアルピンの設定

* **setup**
```
M5.begin(true, false, false); // UART, I2C, LED
```
・UART（true）：UARTは、デバイス間で直列通信を可能にする通信機能。有効にする。
・I2C（false）：I2Cは、複数のデバイスが同じ通信バスを共有してデータをやり取りするための仕組み。I2C通信は利用していないため、無効にする。
・LED（false）：M5AtomやM5Stackには搭載されたLEDがあるが、利用していないため無効にする。

* **loop**
```
M5.Btn.wasPressed()
```
・ボタンが押されたかをチェックを行う。
```
Serial2.available()
```
・GPSモジュールからのデータを受信する。

* **sendInfo2Ambient**
・位置データが得られた場合に、高度、緯度、経度をAmbientに送信:sunny:

`ATOM Lite`とPCをUSB-Cケーブルで繋ぎ、`Arduino IDE`の書き込みボタンを押して、書き込みます:writing_hand_tone1:

## 発見！
場所ばれするのでマスクをかけます:sweat:
危ない:sweat:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/c28cb613-4130-d4a0-413e-46584e624389.png)


これでバッグの場所が特定できます:relaxed:

## ちょっとGPSのお話
測位衛星は6種あります。
・GPS（米国）
・GLONASS（ロシア）
・BeiDou（中国）
・Galileo（欧州）
・NAVIC（インド）
・QZSS（日本）

[みちびき](https://qzss.go.jp/technical/satellites/index.html)のサイトから各衛星の打ち上げ履歴を見てみると衝撃の事実:sunny:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/d5d778b4-739a-9ea9-150a-5de048549ab9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/6c5e5d9a-acd4-0ff8-c57b-1e3ec1e416c6.png)

日本が打ち上げ済みの衛星5機でインドが9機！日本よりインドの方が衛星飛ばしている！！！！
インド凄いですね:relaxed:

## 最後に
よく考えたら、知らない人が自分の家にGPS仕込みのバッグを持っていったとして、場所を特定できたとしても凄く怖いですね:disappointed_relieved:
自分で知らない人の家に尋ねることもできなそうですし、警察に言ったとして信じてもらえるか不明ですね:disappointed_relieved: