sakura.io さくらのIoTモジュールでGPSリアルタイムトラッキング
以前β版で試した さくらのIoTモジュールでのGPSリアルタイムトラッキングですが、正規版運用開始にともない諸々修正いたしましたのでまとめます。
目次
概要
さくらのIoTモジュールでGPS情報をOutgoing Webhookで送り、Web上のマップでリアルタイムに位置情報を表示します。
家に近づいたらIFTTTでスマホに通知を送ります。
以前の記事から正式版開始によるスリープモードの追加とIFTTTの使用が変更されましたので記載いたします。
さくらのIoT Platformとは
LTEキャリア網(ソフトバンク)でデータ送受信可能。さくらの通信モジュールのハードウェアI/FとしてArduinoを使用します。
各種通信サービスとデータの保存や処理システムがsakura.ioプラットフォームとして提供される。
利用料金
- 1通信(最大で8バイト×16チャンネル=128バイト)あたり1ポイント消費
- 毎月10,000ポイント付与
- 20,000ポイント/100円(税別)
⇒通常 月10000回以内の通信であればタダ !
さくらの通信モジュール
私の持っているのはβ版ですが現状 正式版と同じ用に使用できています。
β版と正式版ではLTE通信モジュール が異なります。
β版 :太陽誘電株式会社製 TE8668
正式版 :太陽誘電株式会社製 CL11DAH11-A1
正確な違いはよくわかりませんが正式版のほうが低消費電力かもしれません
さくらのIoTモジュール+GPSの設定
構成
GPSを接続したマイコンとさくらの通信モジュール間はI2Cによりデータのやりとりをします。
さくらの通信モジュールのロジックI/Oピンは1.8V系のためマイコンとモジュールのI2C通信線の間にはレベルシフタモジュールを挿入しています。ハイレベル(マイコン)側の電源は5V、ローレベル(さくらの通信モジュール)の側の電源はLDO_OUT(1.8V)としました。
部品
- マイコン ArduinoNano互換機
- GPS受信機キット
- レベルシフタモジュール
- モバイルバッテリー
ON/OFFボタンがついていて負荷がなくてもスリープしないので便利です。
- さくらの通信モジュール(LTE)β版 & ブレイクアウトボード
Arduino IDE環境の設定
さくらの通信モジュールに接続したマイコンをArduino IDEでプログラミングします。専用ライブラリはArduino IDEのライブラリマネージャからインストールできます。
IDEメニュー [スケッチ] -> [ライブラリをインクルード] -> [ライブラリを管理…] -> “sakuraio”検索 -> [インストール]
sakura.ioの設定
モジュール登録や通信サービスの登録方法は以下の通りです。
https://sakura.io/docs/pages/manual/gui.html
Webサーバーの設定
web周りやマップ(OpenStreetMap)との連携は以下参照ください。
Arduino IDE用コード
マイコンで5秒毎にGPSモジュールの情報(緯度、軽度、受信衛星数)を受けて、緯度経度から自宅からの距離を計算します。
GPSの受信衛星数が4以下の場合は通信モジュールのWAKE_INピンをLowにしてモジュールをスリープモードにいれます。受信衛星数が4以上でWAKE_INピンをHigh(5V)にしてスリープモード解除し、モジュールから各種情報を送信します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
#include <SakuraIO.h> #include <TinyGPS++.h> #include <SoftwareSerial.h> #define BUF_LEN 16 static const int RXPin = A2, TXPin = A3; static const uint32_t GPSBaud = 9600; float lat; float lng; //自宅の緯度経度 float latHome = 4x.xxxxxxx; float lngHome = 14x.xxxxxxx; float earthR = 6378137; //地球の長半径[m] float distance; uint32_t sateNo = 0; uint32_t state = 0; // The TinyGPS++ object TinyGPSPlus gps; // The serial connection to the GPS device SoftwareSerial ss(RXPin, TXPin); SakuraIO_I2C sakuraio; void setup() { Serial.begin(9600); ss.begin(GPSBaud); pinMode(5, OUTPUT); //スリープモードピン digitalWrite(5, LOW); //スリープモード ON } void loop(){ unsigned long start = millis(); do { while (ss.available() > 0){ gps.encode(ss.read()); } } while (millis() - start < 5000); lat = gps.location.lat(); lng = gps.location.lng(); sateNo = gps.satellites.value(); //2点の緯度経度から距離概算 //http://qiita.com/fantm21/items/9f587d2526cf7231a0ba distance = sqrt(pow(earthR * (lat - latHome)/180.0*M_PI, 2) + pow(cos(lngHome/180.0*M_PI) * earthR * (lng - lngHome)/180.0*M_PI, 2)); Serial.print(lat); Serial.print(", "); Serial.print(lng); Serial.print(", "); Serial.print(sateNo); Serial.print(", "); Serial.println(distance); if(sateNo >= 4){ //通信確立まで待ち while((sakuraio.getConnectionStatus() & 0x80) != 0x80){ digitalWrite(5, HIGH); //スリープモード OFF Serial.print("."); } Serial.println("online!"); //距離ステータス if(state == 0 && distance > 300.0){ state = 1; } if(state == 1 && distance < 200.0){ state = 2; //1st notification (200m以内) } if(state == 2 && distance < 100.0){ state = 3; //2nd notification (100m以内) } if(state == 3 && distance < 50.0){ state = 4; //3rd notification (50m以内) } //モジュール転送 sakuraio.enqueueTx(0, lat); //ch0 緯度 sakuraio.enqueueTx(1, lng); //ch1 経度 sakuraio.enqueueTx(2, sateNo); //ch2 受信衛星数 sakuraio.enqueueTx(3, distance); //ch3 自宅からの距離[m] sakuraio.enqueueTx(4, state); //ch4 距離ステータス sakuraio.send(); Serial.println("send!"); }else{ digitalWrite(5, LOW); //スリープモード ON } } |
IFTTTの設定
IFTTTとはif this then thatの略で各種Webサービス同士を連携して自分好みのWebサービス(アプレット)を生成することができます。ここではthis(トリガ)にwebにリクエストを受信できるWebhooksを使用しthat(アクション)にスマホに通知を送るNotificationsを使用しました。
Webhooksのイベント名は”sakuraGPS”としました。以下をリクエストすると”長女ちゃん家まであと xxx m”とスマホに通知が来ます。
https://maker.ifttt.com/trigger/Post/with/key/"Webhook-key"
“Webhook-key”にはWebhookサービス登録時に得られる認証キーを入力します。
動作
無事、正式版でもトラッキング動作確認できました。スリープモードの追加によって屋内でGPS信号受信できない際の電力消費も抑えられ電池のもち良いです。
最近、長女ちゃんが週末ひとりで友達のところに行くようになったので、お守り代わりに持たせようと思います♪
都会の熊さんです。
すばらしいですね。
IFTTTを使っていますが、やり方が稚拙なためか5分前後のおくれが出て使い方によっては致命的だな、って考えて何か方法はないか探しています。
この長女ちゃんの軌跡を追ってみますと遅れはすこし、1-2分程度でしょうか?
応答を早くする方法に何かコツはありますか?
私はトリガをかかるとgoogle gmailで知らせを受け取るようにしております。
何かヒントがありましたら宜しくお願いします。
都会の熊さんコメントありがとうございます。
ここではIFTTTのアクションをスマホの通知にしているので大きな遅延は感じませんでした。
Gmailの遅延の可能性ありますでしょうか?
Gmailって普段でも遅い印象ですので。
手動でトリガをポストしてGmailとスマホ通知で遅延に差があるか
比較してみてはいかがでしょうか?