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

第67回 ArduinoとSakura.ioで気軽にIoTデバイスを作ってみる – GPSロガーデバイスの作成(前編)

dav

前回までsakura.ioの使い方について学んできました。今回はsakura.ioの通信モジュールを使ってGPSロガーを作成してみたいと思います。

目次

  1. GPSモジュールについて
  2. sakura.ioのOutgoing Webhookについて
  3. GPSロガープログラム
  4. まとめ

 

1.GPSモジュールについて

つい先日のニュースで測位衛星「みちびき」4号の打ち上げ成功がニュースになっていましたね。みちびきは日本向けのGPS用衛星で、これまですでに3機が地球上を周回しており今回の打ち上げ成功で、4機目となります。これで8時間交代(3号機は電波補助を主目的とする)で日本の上空を周回するようになるので、GPSの精度がさらに高精度になることが期待されています。

ということで、今回は第60回でも紹介したみちびき対応のGPSモジュールを利用して、sakura.ioと組み合わせてGPSロガーを作成してみましょう。

setting

第60回でも利用したみちびき対応AE-GPSモジュール

このGPSモジュールはArduinoとソフトウェアシリアルを通じて利用することができます。簡単に使い方を振り返りましょう。回路とプログラムは下記のようにソフトウェアシリアルの10,11を利用して位置情報を取得します。プログラムはTinyGPS++というライブラリを利用していますのでインストールしていない場合は、事前にインストールしてください。屋内で実験する場合は、GPS衛星をアンテナがつかみにくい場合があるので、窓際などで実験してみてください。

2017-05-11 11.22.18 (1)


#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モジュールを接続してください。

 

dav

 

2.sakura.ioのOutgoing Webhookについて

次に取得したGPS位置情報をsakura.ioに送るために、通信モジュールの準備をします。これまでwebsocketやincoming webhookの方法を利用してきましたが、今回は通信モジュールから定期的にデータを送信するのに適しているOutgoing Webhookという方法で通信をします。

2-1.Outgoing Webhookの設定について

outgoing webhookの設定は、websocketやincoming webhook同様、まずsakura.ioの管理画面で設定を行います。下記画面の「サービス追加」を選択して連携サービスの選択画面を開いてください。

138e2431e6bb98e455717983e5ea9747_2

追加サービスの選択画面が表示されたら、「Outgoing Webhook」を選択します。

bbd305adaf3523c02b72979a6c5bd38a

Outgoing Webhookの設定に必要な項目を入力してください。

名前:任意のわかりやすい名前など
Payload URL:通信モジュールからデータを送る先のURL
Secret:シークレットキーを設定した場合、通信にこのSecretキーがあっているかどうか認証されます

92715b3ca5f2ababda02f3c9cb745dd4

入力が完了したら、「保存」を押して、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);

9ba65310f6977c0792cc05baa33f34b5

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などのサービスと連携して実際に活用できる形にしてみたいと思います。

 

出場ロボット解剖計画
赤川シホロ

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