経緯
M5STACK用の3G拡張ボードの不具合に遭遇しましたが、交換品が届きましたので、いじくるの再開!
3G通信が可能になったということで、外に持ち出したくなります。そうすると必然的に、位置情報を取得したくなるということで、GPSモジュールを接続したくなるでしょう!
M5STACK用にGPSモジュールがあるのですが、M5STACKのGPIO 16、17番のUARTを使って通信しているのです。
M5STACK用の3G拡張ボードも、同じ、M5STACKのGPIO 16、17番のUARTを使っているので、スタックすることができないので、GROVE端子経由で、GPSを繋ぐことにしました。
M5STACK BASICには、GROVE B,C端子はないので、M5Stack PLUSエンコーダモジュールを使って、ポートを拡張しています。
ソースコード
(GPSのライブラリとして、TinyGPSPlus 1.0.2を使用)
#include <M5Stack.h>
#define CONSOLE Serial
#define GPS Serial1
#define MODEM Serial2
#include <TinyGPS++.h>
TinyGPSPlus gps;
#define TINY_GSM_DEBUG Serial
#define TINY_GSM_MODEM_UBLOX
#include <TinyGsmClient.h>
TinyGsm modem(Serial2);
TinyGsmClient ctx(modem);
void setup() {
M5.begin();
M5.Lcd.clear(BLACK);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.println(F("M5Stack + 3G Module + GPS"));
GPS.begin(9600, SERIAL_8N1, 36, 26); // GROVE B
MODEM.begin(115200, SERIAL_8N1, 16, 17); // 3G MODULE
Serial.print(F("TinyGPS++ library v. "));
Serial.println(TinyGPSPlus::libraryVersion());
M5.Lcd.print(F("modem.restart()"));
modem.restart();
M5.Lcd.println(F("done"));
M5.Lcd.print(F("getModemInfo:"));
String modemInfo = modem.getModemInfo();
M5.Lcd.println(modemInfo);
M5.Lcd.print(F("waitForNetwork()"));
while (!modem.waitForNetwork()) M5.Lcd.print(".");
M5.Lcd.println(F("Ok"));
M5.Lcd.print(F("gprsConnect(soracom.io)"));
modem.gprsConnect("soracom.io", "sora", "sora");
M5.Lcd.println(F("done"));
M5.Lcd.print(F("isNetworkConnected()"));
while (!modem.isNetworkConnected()) M5.Lcd.print(".");
M5.Lcd.println(F("Ok"));
M5.Lcd.print(F("My IP addr: "));
IPAddress ipaddr = modem.localIP();
M5.Lcd.print(ipaddr);
delay(10000);
}
void loop() {
M5.update();
if (MODEM.available()) {
CONSOLE.write(MODEM.read());
}
if (CONSOLE.available()) {
MODEM.write(CONSOLE.read());
}
if(GPS.available()){
if(gps.encode(GPS.read())) {
displayInfo();
}
}
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
}
else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
}
else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
}
else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
動作ログ
10:22:47.703 -> M5Stack initializing...OK
10:22:48.396 -> TinyGPS++ library v. 1.0.2
10:22:54.953 -> [7334] ### TinyGSM Version: 0.7.9
10:22:57.084 -> [9447] ### Modem: u-blox SARA-U201
10:23:49.086 -> Location: INVALID Date/Time: INVALID 01:22:50.74
10:23:49.086 -> Location: INVALID Date/Time: INVALID 01:22:50.74
10:23:49.086 -> Location: INVALID Date/Time: INVALID 01:22:50.74
10:23:49.086 -> Location: INVALID Date/Time: INVALID 01:22:50.74
10:23:49.086 -> Location: INVALID Date/Time: 7/8/2019 01:22:50.74
10:23:49.086 -> Location: INVALID Date/Time: 7/8/2019 01:22:50.74
10:23:49.086 -> Location: INVALID Date/Time: 7/8/2019 01:22:50.74
室内で、執筆しているため、位置情報は取得できていませんが、日時は出力できていて、ATコマンドでもやり取り可能なので、3GモジュールとGPSモジュールが共存できていることが確認できます
以上、ご参考までに