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データを送ってみます。