前回までsakura.ioの使い方について学んできました。今回はsakura.ioの通信モジュールを使ってGPSロガーを作成してみたいと思います。
今回の電子工作レシピ
完成までの時間目安:60分
必要なパーツ
目次
- GPSモジュールについて
- sakura.ioのOutgoing Webhookについて
- GPSロガープログラム
- まとめ
1.GPSモジュールについて
つい先日のニュースで測位衛星「みちびき」4号の打ち上げ成功がニュースになっていましたね。みちびきは日本向けのGPS用衛星で、これまですでに3機が地球上を周回しており今回の打ち上げ成功で、4機目となります。これで8時間交代(3号機は電波補助を主目的とする)で日本の上空を周回するようになるので、GPSの精度がさらに高精度になることが期待されています。
ということで、今回は第60回でも紹介したみちびき対応のGPSモジュールを利用して、sakura.ioと組み合わせてGPSロガーを作成してみましょう。
このGPSモジュールはArduinoとソフトウェアシリアルを通じて利用することができます。簡単に使い方を振り返りましょう。回路とプログラムは下記のようにソフトウェアシリアルの10,11を利用して位置情報を取得します。プログラムはTinyGPS++というライブラリを利用していますのでインストールしていない場合は、事前にインストールしてください。屋内で実験する場合は、GPS衛星をアンテナがつかみにくい場合があるので、窓際などで実験してみてください。
#include <TinyGPS++.h> #include <SoftwareSerial.h> TinyGPSPlus gps; SoftwareSerial mySerial(10, 11); // RX, TX //TinyGPSCustom magneticVariation(gps, "GPRMC", 10); void setup() { 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?"); } void loop() { // run over and over while (mySerial.available() > 0){ char c = mySerial.read(); //Serial.print(c); gps.encode(c); if (gps.location.isUpdated()){ Serial.print("LAT="); Serial.println(gps.location.lat(), 6); Serial.print("LONG="); Serial.println(gps.location.lng(), 6); Serial.print("ALT="); Serial.println(gps.altitude.meters()); } } }
シリアルモニターに緯度経度が整形された形で表示されていればGPS側の準備はOKです。
次にsakura.ioの通信モジュールを使いますので、Arduinoの上にsakura.ioシールドを重ねて、その上にGPSモジュールを接続してください。
2.sakura.ioのOutgoing Webhookについて
次に取得したGPS位置情報をsakura.ioに送るために、通信モジュールの準備をします。これまでwebsocketやincoming webhookの方法を利用してきましたが、今回は通信モジュールから定期的にデータを送信するのに適しているOutgoing Webhookという方法で通信をします。
2-1.Outgoing Webhookの設定について
outgoing webhookの設定は、websocketやincoming webhook同様、まずsakura.ioの管理画面で設定を行います。下記画面の「サービス追加」を選択して連携サービスの選択画面を開いてください。
追加サービスの選択画面が表示されたら、「Outgoing Webhook」を選択します。
Outgoing Webhookの設定に必要な項目を入力してください。
名前:任意のわかりやすい名前など
Payload URL:通信モジュールからデータを送る先のURL
Secret:シークレットキーを設定した場合、通信にこのSecretキーがあっているかどうか認証されます
入力が完了したら、「保存」を押して、sakura.ioの管理画面側の設定は完了です。
2-2.Outgoing WebhookのArduino側の送信プログラム
sakura.ioの設定ができたら、実際にArduinoプログラムで送信部分を作成します。Outgoing Webhookも基本的な送信方法はwebsocketの時と変わりません。その手軽さもsakura.ioの魅力の一つですね。
Outgoing Webhookのデータ送信プログラム
#include <SoftwareSerial.h> #include <SakuraIO.h> SakuraIO_I2C sakuraio; uint32_t cnt; 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 } } //sakura.ioのoutgoingでデータを送信 void sendSakuraIo(float latitude,float longitude){ //キューにデータを設定 sakuraio.enqueueTx((uint8_t)0,(float)latitude); sakuraio.enqueueTx((uint8_t)1,(float)longitude); //データを送信 sakuraio.send(); } void loop() { // run over and over sendSakuraIo(43.1245533,141.23355455); delay(5000); }
このプログラムでは、sendSakuraIo関数に直接位置情報の数字(43~)などを指定して、sakura.ioに送信するサンプルになっています。このプログラムをArduinoに書き込みをして動作をさせつつ、受信側の準備を続けます。
2-3.Outgoing Webhookの受信プログラムについて
Outgoing Webhookでsakura.ioの通信モジュールから送信されたデータはどのような形で取得できるのでしょうか、2-2で動作させたプログラムでは5秒おきにPayloadURLに指定した場所にデータが届いているはずですので、そのURLに届いている受信したデータをすべて表示するプログラムを用意して中身を見てみます。下記はPHPで通信モジュールから受信したデータをそのままdata.txtに書き込むサンプルプログラムです。PayloadURLの場所に設置してみてください。
<?php $secret = ""; $json = file_get_contents('php://input'); $object = json_decode($json, true); if (!empty($secret)) { $hash = hash_hmac('sha1', $json, $secret); if ($hash != $_SERVER["HTTP_X_SAKURA_SIGNATURE"]) exit; } ob_start(); var_dump($object); $str = ob_get_contents(); ob_end_clean(); file_put_contents("data.txt",$str);
data.txtを見てみると、module名や、受信した日時、channelsの中に送信したデータが確認できればOKです。実際にロガーとして活用するには、この位置情報のデータをデータベースにためたりするなどして活用を試みてください。
3.GPSロガープログラム
GPSモジュール、sakura.ioの通信モジュールのそれぞれの準備ができましたので、プログラムを組み合わせてGPSロガーとして利用できるようにします。GPSの位置情報が取得できたとき(if (gps.location.isUpdated()){)に通信モジュールからデータを送信する流れとなっています。
#include <TinyGPS++.h> #include <SoftwareSerial.h> #include <SakuraIO.h> TinyGPSPlus gps; SoftwareSerial mySerial(10, 11); // RX, TX //TinyGPSCustom magneticVariation(gps, "GPRMC", 10); SakuraIO_I2C sakuraio; uint32_t cnt; 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 } } //sakura.ioのoutgoingでデータを送信 void sendSakuraIo(float latitude,float longitude){ //キューにデータを設定 sakuraio.enqueueTx((uint8_t)0,(float)latitude); sakuraio.enqueueTx((uint8_t)1,(float)longitude); //データを送信 sakuraio.send(); } void loop() { while (mySerial.available() > 0){ char c = mySerial.read(); //Serial.print(c); gps.encode(c); if (gps.location.isUpdated()){ Serial.print("LAT="); Serial.println(gps.location.lat(), 6); Serial.print("LONG="); Serial.println(gps.location.lng(), 6); Serial.print("ALT="); Serial.println(gps.altitude.meters()); sendSakuraIo(gps.location.lat(),gps.location.lng()); } } delay(5000); }
無事、データが受信できれば完成です。
まとめ
GPSモジュールとsakura.io通信モジュールを組み合わせてGPSロガーデバイスを作成しました。次回は、さらにこのGPSロガーで取得したデータをGooglemapやslackなどのサービスと連携して実際に活用できる形にしてみたいと思います。