M5STACK用3G 拡張ボードとGPSを繋いで見た


経緯

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をM5Stack PLUSエンコーダモジュールのGROVE B端子に接続しています。

ソースコード
(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モジュールが共存できていることが確認できます

以上、ご参考までに