忘れ物はございませんか?
私は先日、バッグを置き忘れました。。
行ったところを手当たり次第探しに行き、自動券売機の横に置き去りにされたバッグを見つけました。
中身を確認したところ盗まれた形跡はなく、日本が優しい国で本当に本当によかった
けれどまたこんなことが起こったら精神が削られます。。
いくら優しい国でも、こんなことは二度あってたまるか!
そこで今回は、ATOM LiteとGPSを利用してバッグの場所を特定します。
システム概要
GPSモジュールで位置情報を取得し、IoTデーター可視化サービスAmbientに送信してバッグの位置を地図上にプロットしていきます
用意するものは以下です。
- ATOM Lite
- M5Stack用GPSユニット
- USB-Cケーブル
ATOM Liteの環境構築
Arduino IDE のインストール
Arduino IDE のインストールを行います
詳細は省きます。
基本設定
Arduino IDE のメニューバーから [ファイル] -> [基本設定] の順に選択をします。
「追加のボードマネージャのURL」には以下のURLをコピーして入力欄に貼り付け、「OK」ボタンを押します。
https://espressif.github.io/arduino-esp32/package_esp32_index.json
「ボードマネージャ」から以下を検索し、インストールを行います。
・Arduino AVR Boards
・esp32 by Espressif Systems
「ライブラリマネージャー」から以下を検索し、インストールを行います。
・Ambient ESP32 ESP8266 lib
・FastLED
・M5Atom
・TinyGPSPlus
すべてのインストールが完了したら、以下のように[ツール] -> [esp32] -> [M5Stack-ATOM] の順に選択し、設定します。
Arduino IDEがライブラリをインストールすると、Arduinoのスケッチが保存されているディレクトリに「libraries」というフォルダが作成されます。
「libraries」フォルダが作成がされている同ディレクトリに、「GPSLogger」というフォルダを作成し、ソースを書いていきます
Ambientの登録や設定の記載は省きます
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に送信
ATOM Lite
とPCをUSB-Cケーブルで繋ぎ、Arduino IDE
の書き込みボタンを押して、書き込みます
発見!
場所ばれするのでマスクをかけます
危ない
これでバッグの場所が特定できます
ちょっとGPSのお話
測位衛星は6種あります。
・GPS(米国)
・GLONASS(ロシア)
・BeiDou(中国)
・Galileo(欧州)
・NAVIC(インド)
・QZSS(日本)
みちびきのサイトから各衛星の打ち上げ履歴を見てみると衝撃の事実
日本が打ち上げ済みの衛星5機でインドが9機!日本よりインドの方が衛星飛ばしている!!!!
インド凄いですね
最後に
よく考えたら、知らない人が自分の家にGPS仕込みのバッグを持っていったとして、場所を特定できたとしても凄く怖いですね
自分で知らない人の家に尋ねることもできなそうですし、警察に言ったとして信じてもらえるか不明ですね