
前回まで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ロガーを作成してみましょう。

第60回でも利用したみちびき対応AE-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の中身
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などのサービスと連携して実際に活用できる形にしてみたいと思います。






