はじめての電子工作超入門

第61回 ArduinoでGPSデバイス実践編 〜Arduinoでパーツやセンサーを使ってみよう

DSC_0628

今回は、前回のGPSモジュールと第53回の3G通信ができる3GIMを使ってチャットサービスのslackに現在地情報を通知するGPSロガーデバイスを作成してみます。

目次

  1. GPS取得と3G通信のプログラムを組み合わせる
  2. 回路の作成
  3. Slackとは?
  4. Slack APIの設定
  5. まとめ

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)を用意する必要があります。

 

vol61_ブレッドボード_re

DSC_0626

接続できたら、実際にサーバーに送信するためにslackの設定を進めていきます。

 

3.slackとは?

slackとは、ビジネス用途のチャットサービスです。主に、エンジニア・プログラマーなどの開発者の方がその手軽さから多く利用しているサービスです。

e53874bdf8f36d86125437116fa63e80

slackのトップ画面

 

11b57037ffc3676e529fae1b6ca30e4b

実際の画面ではこのように、左に相手やチャンネル(チャットの部屋のようなもの)が表示されて、右側の画面で相手とチャットのやり取りができるようになっています。slackはチャット機能が充実しているほか、ボット機能も充実しているため、様々なサービスとの連携のほか、自分が作ったアプリとの連携も可能になります。

 

4.Slack APIの設定

slackのAPIの利用方法については、いろいろな方が紹介されているのでここでは詳しくは紹介しませんが、今回は「Incoming Webhooks」というAPIを使ってslackで発行されたURLにデータと一緒に接続すると、特定のチャンネルにチャットメッセージを送れる、というAPIを使いました。

 

0522eaf783d66c54c86e3b8377e27b35

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

 

cb46e7333d1023235e51b32277ae9a34

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

設定が完了したら実際にプログラムを起動してみてください。

serial

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

gpsslack

位置情報が表示されました。これだとちょっと味気ないので、送信側のテキストを少し変更してみます。

{“username”:”bots”,”text”:”https://www.google.com/maps?q=[位置情報]”}

この形式で、[位置情報]が取得したGPS情報に差し替わるようにすると、Google mapのリンクがslack側に通知がきます。

gpsslack2

クリックしてみると…

0f8c0071bb74551a76803cb1aa2308a7

Google mapで現在地が表示されました。これだと、GPSロガーとして活用できそうですね!

 

まとめ

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

NHK学生ロボコン2016 出場ロボット解剖計画
赤川シホロ

電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。