sakura.io + Arduino + GROVE でGPSロガー (3)
さくらインターネットのsakura.io を使って電子工作初心者がIoTなGPSロガーを作るメモ。その3
[その1] [その2] [その3] [その4] [その5] [その6]
sakura.ioの接続状態でLチカ
GPSのテスト時にGPSが受信出来ていないのか?sakura.ioが接続出来ていないのか?簡単に判別するためにまず「sakura.ioがオフラインの時」にLEDを点滅させ、オンラインになれば消灯します。

GROVE – LED 赤 (280円)
赤LEDはGROVEの「D4」に接続します。
simple_gps_1.ino
の内容
#include <SakuraIO.h>
SakuraIO_I2C sakuraio;
int led_sakuraio = 4;
///=======================================================================
// + setup()
///=======================================================================
void setup() {
//---出力に設定
pinMode(led_sakuraio, OUTPUT);
}
///=======================================================================
// + loop()
///=======================================================================
void loop() {
//---------------------------------------------
// + sakura.ioがオンラインの時
//---------------------------------------------
if ((sakuraio.getConnectionStatus() & 0x80) == 0x80) {
digitalWrite(led_sakuraio, LOW);
//---------------------------------------------
// + sakura.ioがオフラインの時
//---------------------------------------------
} else{
//---0.5秒間隔の点滅
if(millis() % 1000 > 500) {
digitalWrite(led_sakuraio, HIGH);
} else{
digitalWrite(led_sakuraio, LOW);
}
}
}
※delay()
関数を使ってLEDを点滅させると、その間のすべての処理が止まってしまうのでLEDの点滅では使わない方が無難です。
GPSモジュールの動作確認
先程の赤LEDは一度忘れて「D2」に接続しているGPSモジュールの動作テストを行います。
simple_gps_2.ino
の内容
#include <SoftwareSerial.h>
SoftwareSerial ss(2, 3);
///=======================================================================
// + setup()
///=======================================================================
void setup() {
//---Serialポートを開く
Serial.begin(9600);
//---SoftwareSerialポートを開く
ss.begin(9600);
}
///=======================================================================
// + loop()
///=======================================================================
void loop() {
//---GPS受信データの展開
while (ss.available() > 0) {
//---GPSモジュールからの読み込み
char c = ss.read();
//---GPSからの生データ
Serial.print(c);
}
}
シリアルモニタにこのような意味不明な文字列が出力されたら成功です。

これはGPSの[NMEA]というフォーマットです。このままだと使い難いので「TinyGPS++」というライブラリを使ってわかりやすい形に変換します。
simple_gps_3.ino
の内容
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
TinyGPSPlus gps;
SoftwareSerial ss(2, 3);
///=======================================================================
// + setup()
///=======================================================================
void setup() {
//---Serialポートを開く
Serial.begin(9600);
//---SoftwareSerialポートを開く
ss.begin(9600);
}
///=======================================================================
// + loop()
///=======================================================================
void loop() {
//---GPS受信データの展開
while (ss.available() > 0) {
//---GPSモジュールからの読み込み
char c = ss.read();
//---GPSからの生データ
//-Serial.print(c);
//---GPSの[NMEA]形式の変換
gps.encode(c);
//---------------------
// +GPS位置情報更新
//---------------------
if (gps.location.isUpdated()) {
//---緯度
float gps_lat = gps.location.lat();
//---経度
float gps_lng = gps.location.lng();
//---シリアルモニタに表示する
Serial.print(F(" LAT=")); Serial.print(gps_lat, 6);
Serial.print(F(" LONG=")); Serial.println(gps_lng, 6);
}
}
}
何も表示されない場合には、室内だとGPSが受信出来ていない可能性が高いです。窓際にもっていくなどしてみてください。
この状態だと、GPSの受信状態がシリアルモニタを見ないと分からないので先程のようにLチカさせます。
GPSの受信状態でLチカ
GPSのシグナルを受信するとLEDを1秒間点灯させます。

GROVE – LED 青 (280円)
青LEDはGROVEの「D6」に接続します。
simple_gps_4.ino
の内容
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
int led_gps = 6;
TinyGPSPlus gps;
SoftwareSerial ss(2, 3);
//---最後にGPSのLEDが光った時間
unsigned long latest_led_gps_time = 0;
///=======================================================================
// + setup()
///=======================================================================
void setup() {
//---Serialポートを開く
Serial.begin(9600);
//---SoftwareSerialポートを開く
ss.begin(9600);
//---出力に設定
pinMode(led_gps, OUTPUT);
//---起動時LEDを点灯
digitalWrite(led_gps, HIGH);
delay(2000);
//---2秒後にLEDを消灯
digitalWrite(led_gps, LOW);
}
///=======================================================================
// + loop()
///=======================================================================
void loop() {
//---GPS用LEDを1秒で消す
if(latest_led_gps_time && millis() - latest_led_gps_time > 1000){
//--GPS用のLEDを消す
digitalWrite(led_gps, LOW);
}
//---GPS受信データの展開
while (ss.available() > 0) {
//---GPSモジュールからの読み込み
char c = ss.read();
//---GPSからの生データ
//-Serial.print(c);
//---GPSの[NMEA]形式の変換
gps.encode(c);
//---------------------
// +GPS位置情報更新
//---------------------
if (gps.location.isUpdated()) {
//---緯度
float gps_lat = gps.location.lat();
//---経度
float gps_lng = gps.location.lng();
//---シリアルモニタに表示する
Serial.print(F(" LAT=")); Serial.print(gps_lat, 6);
Serial.print(F(" LONG=")); Serial.println(gps_lng, 6);
//---GPS用のLEDを点灯
digitalWrite(led_gps, HIGH);
//---GPS用LEDが光り始めた時間
latest_led_gps_time = millis();
}
}
}
sakura.ioのLチカとGPSのLチカ処理
simple_gps_5.ino
の内容
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <SakuraIO.h>
SakuraIO_I2C sakuraio;
TinyGPSPlus gps;
SoftwareSerial ss(2, 3);
int led_sakuraio = 4;
int led_gps = 6;
//---最後にGPSのLEDが光った時間
unsigned long latest_led_gps_time = 0;
///=======================================================================
// + setup()
///=======================================================================
void setup() {
//---Serialポートを開く
Serial.begin(9600);
//---SoftwareSerialポートを開く
ss.begin(9600);
//---出力に設定
pinMode(led_sakuraio, OUTPUT);
pinMode(led_gps, OUTPUT);
//---起動時LEDを点灯
digitalWrite(led_sakuraio, HIGH);
digitalWrite(led_gps, HIGH);
delay(2000);
//---2秒後にLEDを消灯
digitalWrite(led_sakuraio, LOW);
digitalWrite(led_gps, LOW);
}
///=======================================================================
// + loop()
///=======================================================================
void loop() {
//---------------------------------------------
// + sakura.ioがオンラインの時
//---------------------------------------------
if ((sakuraio.getConnectionStatus() & 0x80) == 0x80) {
digitalWrite(led_sakuraio, LOW);
//---------------------------------------------
// + sakura.ioがオフラインの時
//---------------------------------------------
} else{
//---0.5秒間隔の点滅
if(millis() % 1000 > 500) {
digitalWrite(led_sakuraio, HIGH);
} else{
digitalWrite(led_sakuraio, LOW);
}
}
//---GPS用LEDを1秒で消す
if(latest_led_gps_time && millis() - latest_led_gps_time > 1000){
//--GPS用のLEDを消す
digitalWrite(led_gps, LOW);
}
//---GPS受信データの展開
while (ss.available() > 0) {
//---GPSモジュールからの読み込み
char c = ss.read();
//---GPSからの生データ
//-Serial.print(c);
//---GPSの[NMEA]形式の変換
gps.encode(c);
//---------------------
// +GPS位置情報更新
//---------------------
if (gps.location.isUpdated()) {
//---緯度
float gps_lat = gps.location.lat();
//---経度
float gps_lng = gps.location.lng();
//---シリアルモニタに表示する
Serial.print(F(" LAT=")); Serial.print(gps_lat, 6);
Serial.print(F(" LONG=")); Serial.println(gps_lng, 6);
//---GPS用のLEDを点灯
digitalWrite(led_gps, HIGH);
//---GPS用LEDが光り始めた時間
latest_led_gps_time = millis();
}
}
}
sakura.ioがオフラインの時は赤LEDは点滅、GPSを受信したら青LEDが点灯しました。ここまで作っておくとGPSロガーとしてのテストがとても簡単になります。

次回、sakura.ioのプラットフォームにGPSデータを送ってみます。