Wio Terminalに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本でつながった。シリアル通信で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()); } }