Wio TerminalにGPSをつないでみた。

Wio TerminalにGPSモジュールをつないでみた。

f:id:manpukukoji:20200626204250j:plain
GPS
GPSモジュールは、秋月で売ってる GMS7-CR6 ってやつ。
ずいぶん前に買って、RasPiとか、なんかいろんなものにつないで遊んでたんだけど、今回、Wioにつないでみたら、なんか、日付がおかしい???
調べてみたら、ロールオーバーとかなんとかで、去年あたりにGPSの時刻情報がリセットされたらしい。
このままじゃ、日付は、そのままじゃちゃんと表示されない。
まぁ、日付は、それほど重要じゃなさそうなのと、計算が面倒なので、このまま、日付なしで行っちゃえ!
WioとGPSモジュールは、シリアル通信で接続される。
ちょっと前に、GROVEのMP3モジュールで遊んでた時に、ここ(https://wiki.seeedstudio.com/Grove-MP3_v2.0/)に、”SAMDは、ソフトシリアル使えないよ。"( The SAMD does not support software serial. )、みたいにことが書いてあったので、ありゃ、そうかいな…?と思ってたんだけど、シリアルモニタでモニタしながらGPSからメッセージとるのにシリアルが2つ必要になっちゃうので、まぁ、物は試しでソフトシリアルで接続してみたら、すんなりいっちゃった。
と、いうわけで、3.3VとGNDとD2ピンの3本でつながった。
f:id:manpukukoji:20200627160311j:plain
シリアル通信でNMEAのメッセージが取れるようになったところで、今度は、メッセージをカンマ区切りで切り分けなければならない。 四苦八苦してデータを切り分けてたんだけど、これを、ちゃちゃっとやっつけてくれるライブラリがあった。
こちら
TinyGPS++ | Arduiniana

データは、取れるようになったので、あとは、表示だけ。
ディスプレイに表示するだけだけど、意外と表示に時間がかかるようで、こっちにあまり時間を取られると、シリアル通信の方がおかしくなる。 間に合わなくなって、うまく、タイミングがとれなくなるのかな?
とりあえず、必要な緯度経度と時刻、あとは、なんちゃって高度と衛星の数を表示させた。
もう少し、アイデア次第でいろいろ遊べそうです。

#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include"TFT_eSPI.h"

SoftwareSerial mySerial(2, 3); // RX, TX
TinyGPSPlus gps;
TFT_eSPI tft;

TinyGPSCustom ExtLat(gps, "GPGGA", 3);  //N for Latitude
TinyGPSCustom ExtLng(gps, "GPGGA", 5);  //E for Longitude

String p_hour, p_lat, p_lng, p_alt, p_sat;

void setup() {
  // Open serial communications and wait for port to open:
    Serial.begin(57600);
    mySerial.begin(9600);

    tft.begin();
    tft.setRotation(3);

    tft.fillScreen(TFT_BLACK); //Black background    
    tft.setTextColor(TFT_YELLOW);

    tft.setTextSize(3);
    tft.drawString("GPS",120,2);
    tft.setTextSize(2);
    tft.drawString("Time",30,64);
    tft.drawString("LAT",30,96);
    tft.drawString("LONG",30,128);
    tft.drawString("ALT",30,160);
    tft.drawString("Satellites",30,192);

}

void loop() { // run over and over

    while (mySerial.available() > 0) {
      char c = mySerial.read();
      //Serial.print(c);
      gps.encode(c);
    }

    double lat0 = gps.location.lat();
    double lat1 = (lat0 -int(lat0))*60;
    double lat2 = (lat1 - int(lat1))*60;
    String lat3 = String(int(lat0))+':' + String(int(lat1))+':'+String(lat2) + ' ' + String(ExtLat.value());

    double lng0 = gps.location.lng();
    double lng1 = (lng0 -int(lng0))*60;
    double lng2 = (lng1 - int(lng1))*60;
    String lng3 = String(int(lng0))+':' + String(int(lng1))+':'+String(lng2) + ' ' + String(ExtLng.value());

    int hr = gps.time.hour()+9;
    if (hr>24) hr -= 24;
    String hr0 = '0'+String(hr);
    String hr1 = hr0.substring(hr0.length()-2); 
    String min0 = '0'+String(gps.time.minute());
    String min1 = min0.substring(min0.length()-2); 
    String sec0 = '0'+String(gps.time.second());
    String sec1 = sec0.substring(sec0.length()-2);
    String hour0 =  hr1+':'+min1+':'+sec1;

    if (hour0 != p_hour) {    //Time
      tft.fillRect(100,64,120,16,TFT_BLACK);
      tft.drawString(hour0,100,64);
      p_hour = hour0;
    }
    
    if (lat3 != p_lat) {      //Latitude
      tft.fillRect(100,96,132,16,TFT_BLACK);
      tft.drawString(lat3,100,96);
      p_lat = lat3;
    }
    
    if (lng3 != p_lng) {      //Longitude
      tft.fillRect(100,128,156,16,TFT_BLACK);
      tft.drawString(lng3,100,128);
      p_lng = lng3;
    }

    if (String(gps.altitude.meters()) != p_alt) { //Altimeter
      tft.fillRect(100,160,60,16,TFT_BLACK);
      tft.drawString(String(gps.altitude.meters()),100,160);
      p_alt = String(gps.altitude.meters());
    }
    
    if (String(gps.satellites.value()) != p_sat) {  //N of Satellites
      tft.fillRect(160,192,32,16,TFT_BLACK);
      tft.drawString(String(gps.satellites.value()),160,192);
      p_sat = String(gps.satellites.value());
    }

}