
今回は、前回のGPSモジュールと第53回の3G通信ができる3GIMを使ってチャットサービスのslackに現在地情報を通知するGPSロガーデバイスを作成してみます。
今回の電子工作レシピ
完成までの時間目安:60分
必要なパーツ
目次
- GPS取得と3G通信のプログラムを組み合わせる
- 回路の作成
- Slackとは?
- Slack APIの設定
- まとめ
1.GPS取得と3G通信のプログラムを組み合わせる
前回GPS取得のプログラムができましたので、そのプログラムと第53回で利用した3G通信のプログラムを組み合わせて、一定間隔でGPS情報を取得したのち3GIMを通じてインターネット側にデータを送るプログラムを作成します。
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <a3gim.h>
#define baudrate 9600UL
const int powerPin = 7; // 3gim power pin(If not using power control, 0 is set.)
const char *server = "hooks.slack.com";
const char *path = "/services/[slackのwebhooksURL]";
int port = 443;
char res[a3gsMAX_RESULT_LENGTH+1];
int len;
float _lat;
float _lng;
int _alt;
TinyGPSPlus gps;
SoftwareSerial mySerial(10, 11); // RX, TX
//TinyGPSCustom magneticVariation(gps, "GPRMC", 10);
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
/* GPSからデータを取得 */
void loop() {
while (mySerial.available() > 0){
char c = mySerial.read();
gps.encode(c);
if (gps.location.isUpdated()){
_lat = gps.location.lat();
_lng = gps.location.lat();
_alt = gps.altitude.meters();
Serial.print("LAT="); Serial.println(_lat,6);
Serial.print("LNG="); Serial.println(_lng,6);
Serial.print("ALT="); Serial.println(_alt);
sendData();
}
}
}
/* 3GIMでデータをサーバーに送信 */
void sendData(){
Serial.println("START---3GIM");
if (a3gs.start(powerPin) == 0 && a3gs.begin(0, baudrate) == 0) {
Serial.println(" SUCCESS---START 3GIM");
delay(25000); // ウェイトを持たせる
len = sizeof(res);
//rssi - 電波強度を取得
int rssi = 0;
if (a3gs.getRSSI(rssi) == 0) {
Serial.print(" SUCCESS---GET RSSI:");
Serial.println(String(rssi));
}
//time - 時刻を取得
char date[a3gsDATE_SIZE], time[a3gsTIME_SIZE];
if (a3gs.getTime(date, time) == 0) {
}
//データを送信
String s = String(_lat,6).concat(",");
s = s.concat(String(_lng,6));
char *header = "Content-Type: application/json";
char body[44];
sprintf(body, '{"username":"bots","text":"%s"}' , s);
int rst = a3gs.httpPOST(server, port, path), header, body, res, len);
if(rst == 0){
Serial.println(res);
Serial.println(len);
Serial.println("success sended. Shutdown..");
}
else{
Serial.println("faild sended. Shutdown..");
}
a3gs.end();
a3gs.shutdown();
return;
}
else{
Serial.println("Failed.");
}
return;
}
今回、Slackというチャットサービスに位置情報を送るのですが、そのために、これまで3GIMで利用していたhttpGETという関数ではなくhttpPOSTというPOST形式でデータを送信することができる関数を利用しています。また、それに伴い、portも80番から443番に変更となっています。
プログラム自体は、送信先のサーバー側でどのような形式でデータを受けるかでプログラムの内容は若干変わりますが、基本的には組み合わせるだけなので、シンプルですね。
2.回路の作成
次に回路を作成していきます。回路に関しても、前回のGPS取得の回路と、3GIMの回路を組み合わせるだけになりますが、一点だけ注意としては、3GIMは起動時や通信時にある程度の電流を必要とするため、Arduinoから供給されている電源のみのの場合、うまく動作しないことがあるため、その場合は3GIMのみ外部から電源(3.3~4.2V)を用意する必要があります。


接続できたら、実際にサーバーに送信するためにslackの設定を進めていきます。
3.slackとは?
slackとは、ビジネス用途のチャットサービスです。主に、エンジニア・プログラマーなどの開発者の方がその手軽さから多く利用しているサービスです。


実際の画面ではこのように、左に相手やチャンネル(チャットの部屋のようなもの)が表示されて、右側の画面で相手とチャットのやり取りができるようになっています。slackはチャット機能が充実しているほか、ボット機能も充実しているため、様々なサービスとの連携のほか、自分が作ったアプリとの連携も可能になります。
4.Slack APIの設定
slackのAPIの利用方法については、いろいろな方が紹介されているのでここでは詳しくは紹介しませんが、今回は「Incoming Webhooks」というAPIを使ってslackで発行されたURLにデータと一緒に接続すると、特定のチャンネルにチャットメッセージを送れる、というAPIを使いました。

APIのコンソール画面でWebhookを有効にして、URLなどを発行します。

実際にWebhookが有効になると、Webhook URLとして利用できるキーとチャンネルなどが表示されます。この設定情報をプログラムのpath部分の[slackのwebhooksURL]に反映してください。
設定が完了したら実際にプログラムを起動してみてください。

シリアルモニターに表示されたあと、実際にslack側にメッセージが表示されれば完成です。

位置情報が表示されました。これだとちょっと味気ないので、送信側のテキストを少し変更してみます。
{“username”:”bots”,”text”:”https://www.google.com/maps?q=[位置情報]”}
この形式で、[位置情報]が取得したGPS情報に差し替わるようにすると、Google mapのリンクがslack側に通知がきます。

クリックしてみると…

Google mapで現在地が表示されました。これだと、GPSロガーとして活用できそうですね!
まとめ
今回は3GIMの通信とGPSモジュールを組み合わせたデバイスを作成しました。このように1つの部品だけだとなかなか実際に活用、ところまで作るのは難しいかもしれませんが、複数の技術を組み合わせることで私たちの生活の中でちょっと使えるデバイス、なんてものが気軽に作ることができますので、ぜひほかのアイデアもチャレンジしてみてください!






