4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SIMCOM社のSIM7080Gで TinyGSMライブラリを使ってみた

Posted at

TinyGSMがSIMCOM社のSIM7080に対応したので早速使ってみました。

TinyGSMは色々な通信モジュールに対応したGSMのライブラリで、LTE通信にも対応しています。
以前QiitaにSIM7000とSIM7500でTinyGSMを使っ記事を書きました。
このころはまだSIM7080に対応していませんでした。

なおSIM7500JCとSIM7000JCの記事は
SIM7500JCでTinyGSMのHttpClientを動かしてみた
SIM7000JCでもTinyGSMのHttpClientを動かしてみた
となります。

今回は TinyGSM のサンプルプログラム
AllFunctions を使ってみました。

TinyGSMはこちらから入手できます。
Github TynyGSM

Arduino IDE に TynyGSM をインストールすると
ファイル → スケッチ例 → TynyGSMの中に AllFunctions があるので
このサンプルを開きます。

変更箇所
モデムの選択で

# define TINY_GSM_MODEM_SIM800 をコメントにして
# define TINY_GSM_MODEM_SIM7080 の先頭の // を消します。

59行目の

# define GSM_AUTOBAUD_MAX 57600
を
# define GSM_AUTOBAUD_MAX 115200
に変更

(自分が SIM7080G のボーレートを115200bps にしいるため)

91行目からのご自身が使用されるSIMに合わせて設定します。
自分はさくらセキュアモバイルSIM
使ったので以下のように書き換えました。

// Your GPRS credentials, if any
const char apn[] = "sakura";
// const char apn[] = "ibasis.iot";
const char gprsUser[] = "";
const char gprsPass[] = "";
128行目の
const int powerkey = 1;                         // SIM7080 powerkey
と 132行目から134行目までの
digitalWrite(powerkey,HIGH);
delay(2000);
digitalWrite(powerkey,LOW);
を追加

これはSIM7080G をアクティブにするために powerkey にパルスを加える処理です。
ご自身のハードウェアに合わせて下さい。

以上の変更を加えたプログラムです。

AllFunctions.ino
/**************************************************************
 *
 * TinyGSM Getting Started guide:
 *   https://tiny.cc/tinygsm-readme
 *
 * NOTE:
 * Some of the functions may be unavailable for your modem.
 * Just comment them out.
 *
 **************************************************************/

// Select your modem:
// #define TINY_GSM_MODEM_SIM800
// #define TINY_GSM_MODEM_SIM808
// #define TINY_GSM_MODEM_SIM868
// #define TINY_GSM_MODEM_SIM900
// #define TINY_GSM_MODEM_SIM7000
// #define TINY_GSM_MODEM_SIM7000SSL
# define TINY_GSM_MODEM_SIM7080
// #define TINY_GSM_MODEM_SIM5360
// #define TINY_GSM_MODEM_SIM7600
// #define TINY_GSM_MODEM_UBLOX
// #define TINY_GSM_MODEM_SARAR4
// #define TINY_GSM_MODEM_M95
// #define TINY_GSM_MODEM_BG96
// #define TINY_GSM_MODEM_A6
// #define TINY_GSM_MODEM_A7
// #define TINY_GSM_MODEM_M590
// #define TINY_GSM_MODEM_MC60
// #define TINY_GSM_MODEM_MC60E
// #define TINY_GSM_MODEM_ESP8266
// #define TINY_GSM_MODEM_XBEE
// #define TINY_GSM_MODEM_SEQUANS_MONARCH

// Set serial for debug console (to the Serial Monitor, default speed 115200)
# define SerialMon Serial

// Set serial for AT commands (to the module)
// Use Hardware Serial on Mega, Leonardo, Micro
# ifndef __AVR_ATmega328P__
# define SerialAT Serial1

// or Software Serial on Uno, Nano
# else
# include <SoftwareSerial.h>
SoftwareSerial SerialAT(2, 3);  // RX, TX
# endif

// See all AT commands, if wanted
// #define DUMP_AT_COMMANDS

// Define the serial console for debug prints, if needed
# define TINY_GSM_DEBUG SerialMon

// Range to attempt to autobaud
// NOTE:  DO NOT AUTOBAUD in production code.  Once you've established
// communication, set a fixed baud rate using modem.setBaud(#).
# define GSM_AUTOBAUD_MIN 9600
# define GSM_AUTOBAUD_MAX 115200

// Add a reception delay, if needed.
// This may be needed for a fast processor at a slow baud rate.
// #define TINY_GSM_YIELD() { delay(2); }

/*
 * Tests enabled
 */
# define TINY_GSM_TEST_GPRS true
# define TINY_GSM_TEST_WIFI false
# define TINY_GSM_TEST_TCP true
# define TINY_GSM_TEST_SSL true
# define TINY_GSM_TEST_CALL false
# define TINY_GSM_TEST_SMS false
# define TINY_GSM_TEST_USSD false
# define TINY_GSM_TEST_BATTERY true
# define TINY_GSM_TEST_TEMPERATURE true
# define TINY_GSM_TEST_GSM_LOCATION false
# define TINY_GSM_TEST_NTP false
# define TINY_GSM_TEST_TIME false
# define TINY_GSM_TEST_GPS false
// disconnect and power down modem after tests
# define TINY_GSM_POWERDOWN false

// set GSM PIN, if any
# define GSM_PIN ""

// Set phone numbers, if you want to test SMS and Calls
// #define SMS_TARGET  "+380xxxxxxxxx"
// #define CALL_TARGET "+380xxxxxxxxx"

// Your GPRS credentials, if any
const char apn[] = "sakura";
// const char apn[] = "ibasis.iot";
const char gprsUser[] = "";
const char gprsPass[] = "";

// Your WiFi connection credentials, if applicable
const char wifiSSID[] = "YourSSID";
const char wifiPass[] = "YourWiFiPass";

// Server details to test TCP/SSL
const char server[]   = "vsh.pp.ua";
const char resource[] = "/TinyGSM/logo.txt";

# include <TinyGsmClient.h>

# if TINY_GSM_TEST_GPRS && not defined TINY_GSM_MODEM_HAS_GPRS
# undef TINY_GSM_TEST_GPRS
# undef TINY_GSM_TEST_WIFI
# define TINY_GSM_TEST_GPRS false
# define TINY_GSM_TEST_WIFI true
# endif
# if TINY_GSM_TEST_WIFI && not defined TINY_GSM_MODEM_HAS_WIFI
# undef TINY_GSM_USE_GPRS
# undef TINY_GSM_USE_WIFI
# define TINY_GSM_USE_GPRS true
# define TINY_GSM_USE_WIFI false
# endif

# ifdef DUMP_AT_COMMANDS
# include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm        modem(debugger);
# else
TinyGsm        modem(SerialAT);
# endif

const int powerkey = 1;                         // SIM7080 powerkey

void setup() {

  digitalWrite(powerkey,HIGH);
  delay(2000);
  digitalWrite(powerkey,LOW);
  
  // Set console baud rate
  SerialMon.begin(115200);
  delay(10);

  // !!!!!!!!!!!
  // Set your reset, enable, power pins here
  // !!!!!!!!!!!

  DBG("Wait...");
  delay(6000);

  // Set GSM module baud rate
  TinyGsmAutoBaud(SerialAT, GSM_AUTOBAUD_MIN, GSM_AUTOBAUD_MAX);
  // SerialAT.begin(9600);
}

void loop() {
  // Restart takes quite some time
  // To skip it, call init() instead of restart()
  DBG("Initializing modem...");
  if (!modem.restart()) {
    // if (!modem.init()) {
    DBG("Failed to restart modem, delaying 10s and retrying");
    // restart autobaud in case GSM just rebooted
    // TinyGsmAutoBaud(SerialAT, GSM_AUTOBAUD_MIN, GSM_AUTOBAUD_MAX);
    return;
  }

  String name = modem.getModemName();
  DBG("Modem Name:", name);

  String modemInfo = modem.getModemInfo();
  DBG("Modem Info:", modemInfo);

# if TINY_GSM_TEST_GPRS
  // Unlock your SIM card with a PIN if needed
  if (GSM_PIN && modem.getSimStatus() != 3) { modem.simUnlock(GSM_PIN); }
# endif

# if TINY_GSM_TEST_WIFI
  DBG("Setting SSID/password...");
  if (!modem.networkConnect(wifiSSID, wifiPass)) {
    DBG(" fail");
    delay(10000);
    return;
  }
  SerialMon.println(" success");
# endif

# if TINY_GSM_TEST_GPRS && defined TINY_GSM_MODEM_XBEE
  // The XBee must run the gprsConnect function BEFORE waiting for network!
  modem.gprsConnect(apn, gprsUser, gprsPass);
# endif

  DBG("Waiting for network...");
  if (!modem.waitForNetwork(600000L, true)) {
    delay(10000);
    return;
  }

  if (modem.isNetworkConnected()) { DBG("Network connected"); }

# if TINY_GSM_TEST_GPRS
  DBG("Connecting to", apn);
  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
    delay(10000);
    return;
  }

  bool res = modem.isGprsConnected();
  DBG("GPRS status:", res ? "connected" : "not connected");

  String ccid = modem.getSimCCID();
  DBG("CCID:", ccid);

  String imei = modem.getIMEI();
  DBG("IMEI:", imei);

  String imsi = modem.getIMSI();
  DBG("IMSI:", imsi);

  String cop = modem.getOperator();
  DBG("Operator:", cop);

  IPAddress local = modem.localIP();
  DBG("Local IP:", local);

  int csq = modem.getSignalQuality();
  DBG("Signal quality:", csq);
# endif

# if TINY_GSM_TEST_USSD && defined TINY_GSM_MODEM_HAS_SMS
  String ussd_balance = modem.sendUSSD("*111#");
  DBG("Balance (USSD):", ussd_balance);

  String ussd_phone_num = modem.sendUSSD("*161#");
  DBG("Phone number (USSD):", ussd_phone_num);
# endif

# if TINY_GSM_TEST_TCP && defined TINY_GSM_MODEM_HAS_TCP
  TinyGsmClient client(modem, 0);
  const int     port = 80;
  DBG("Connecting to", server);
  if (!client.connect(server, port)) {
    DBG("... failed");
  } else {
    // Make a HTTP GET request:
    client.print(String("GET ") + resource + " HTTP/1.0\r\n");
    client.print(String("Host: ") + server + "\r\n");
    client.print("Connection: close\r\n\r\n");

    // Wait for data to arrive
    uint32_t start = millis();
    while (client.connected() && !client.available() &&
           millis() - start < 30000L) {
      delay(100);
    };

    // Read data
    start          = millis();
    char logo[640] = {
        '\0',
    };
    int read_chars = 0;
    while (client.connected() && millis() - start < 10000L) {
      while (client.available()) {
        logo[read_chars]     = client.read();
        logo[read_chars + 1] = '\0';
        read_chars++;
        start = millis();
      }
    }
    SerialMon.println(logo);
    DBG("#####  RECEIVED:", strlen(logo), "CHARACTERS");
    client.stop();
  }
# endif

# if TINY_GSM_TEST_SSL && defined TINY_GSM_MODEM_HAS_SSL
  TinyGsmClientSecure secureClient(modem, 1);
  const int           securePort = 443;
  DBG("Connecting securely to", server);
  if (!secureClient.connect(server, securePort)) {
    DBG("... failed");
  } else {
    // Make a HTTP GET request:
    secureClient.print(String("GET ") + resource + " HTTP/1.0\r\n");
    secureClient.print(String("Host: ") + server + "\r\n");
    secureClient.print("Connection: close\r\n\r\n");

    // Wait for data to arrive
    uint32_t startS = millis();
    while (secureClient.connected() && !secureClient.available() &&
           millis() - startS < 30000L) {
      delay(100);
    };

    // Read data
    startS          = millis();
    char logoS[640] = {
        '\0',
    };
    int read_charsS = 0;
    while (secureClient.connected() && millis() - startS < 10000L) {
      while (secureClient.available()) {
        logoS[read_charsS]     = secureClient.read();
        logoS[read_charsS + 1] = '\0';
        read_charsS++;
        startS = millis();
      }
    }
    SerialMon.println(logoS);
    DBG("#####  RECEIVED:", strlen(logoS), "CHARACTERS");
    secureClient.stop();
  }
# endif

# if TINY_GSM_TEST_CALL && defined TINY_GSM_MODEM_HAS_CALLING && \
    defined                       CALL_TARGET
  DBG("Calling:", CALL_TARGET);

  // This is NOT supported on M590
  res = modem.callNumber(CALL_TARGET);
  DBG("Call:", res ? "OK" : "fail");

  if (res) {
    delay(1000L);

    // Play DTMF A, duration 1000ms
    modem.dtmfSend('A', 1000);

    // Play DTMF 0..4, default duration (100ms)
    for (char tone = '0'; tone <= '4'; tone++) { modem.dtmfSend(tone); }

    delay(5000);

    res = modem.callHangup();
    DBG("Hang up:", res ? "OK" : "fail");
  }
# endif

# if TINY_GSM_TEST_SMS && defined TINY_GSM_MODEM_HAS_SMS && defined SMS_TARGET
  res = modem.sendSMS(SMS_TARGET, String("Hello from ") + imei);
  DBG("SMS:", res ? "OK" : "fail");

  // This is only supported on SIMxxx series
  res = modem.sendSMS_UTF8_begin(SMS_TARGET);
  if (res) {
    auto stream = modem.sendSMS_UTF8_stream();
    stream.print(F("Привіііт! Print number: "));
    stream.print(595);
    res = modem.sendSMS_UTF8_end();
  }
  DBG("UTF8 SMS:", res ? "OK" : "fail");

# endif

# if TINY_GSM_TEST_GSM_LOCATION && defined TINY_GSM_MODEM_HAS_GSM_LOCATION
  float lat      = 0;
  float lon      = 0;
  float accuracy = 0;
  int   year     = 0;
  int   month    = 0;
  int   day      = 0;
  int   hour     = 0;
  int   min      = 0;
  int   sec      = 0;
  for (int8_t i = 15; i; i--) {
    DBG("Requesting current GSM location");
    if (modem.getGsmLocation(&lat, &lon, &accuracy, &year, &month, &day, &hour,
                             &min, &sec)) {
      DBG("Latitude:", String(lat, 8), "\tLongitude:", String(lon, 8));
      DBG("Accuracy:", accuracy);
      DBG("Year:", year, "\tMonth:", month, "\tDay:", day);
      DBG("Hour:", hour, "\tMinute:", min, "\tSecond:", sec);
      break;
    } else {
      DBG("Couldn't get GSM location, retrying in 15s.");
      delay(15000L);
    }
  }
  DBG("Retrieving GSM location again as a string");
  String location = modem.getGsmLocation();
  DBG("GSM Based Location String:", location);
# endif

# if TINY_GSM_TEST_GPS && defined TINY_GSM_MODEM_HAS_GPS
  DBG("Enabling GPS/GNSS/GLONASS and waiting 15s for warm-up");
  modem.enableGPS();
  delay(15000L);
  float lat2      = 0;
  float lon2      = 0;
  float speed2    = 0;
  float alt2      = 0;
  int   vsat2     = 0;
  int   usat2     = 0;
  float accuracy2 = 0;
  int   year2     = 0;
  int   month2    = 0;
  int   day2      = 0;
  int   hour2     = 0;
  int   min2      = 0;
  int   sec2      = 0;
  for (int8_t i = 15; i; i--) {
    DBG("Requesting current GPS/GNSS/GLONASS location");
    if (modem.getGPS(&lat2, &lon2, &speed2, &alt2, &vsat2, &usat2, &accuracy2,
                     &year2, &month2, &day2, &hour2, &min2, &sec2)) {
      DBG("Latitude:", String(lat2, 8), "\tLongitude:", String(lon2, 8));
      DBG("Speed:", speed2, "\tAltitude:", alt2);
      DBG("Visible Satellites:", vsat2, "\tUsed Satellites:", usat2);
      DBG("Accuracy:", accuracy2);
      DBG("Year:", year2, "\tMonth:", month2, "\tDay:", day2);
      DBG("Hour:", hour2, "\tMinute:", min2, "\tSecond:", sec2);
      break;
    } else {
      DBG("Couldn't get GPS/GNSS/GLONASS location, retrying in 15s.");
      delay(15000L);
    }
  }
  DBG("Retrieving GPS/GNSS/GLONASS location again as a string");
  String gps_raw = modem.getGPSraw();
  DBG("GPS/GNSS Based Location String:", gps_raw);
  DBG("Disabling GPS");
  modem.disableGPS();
# endif

# if TINY_GSM_TEST_NTP && defined TINY_GSM_MODEM_HAS_NTP
  DBG("Asking modem to sync with NTP");
  modem.NTPServerSync("132.163.96.5", 20);
# endif

# if TINY_GSM_TEST_TIME && defined TINY_GSM_MODEM_HAS_TIME
  int   year3    = 0;
  int   month3   = 0;
  int   day3     = 0;
  int   hour3    = 0;
  int   min3     = 0;
  int   sec3     = 0;
  float timezone = 0;
  for (int8_t i = 5; i; i--) {
    DBG("Requesting current network time");
    if (modem.getNetworkTime(&year3, &month3, &day3, &hour3, &min3, &sec3,
                             &timezone)) {
      DBG("Year:", year3, "\tMonth:", month3, "\tDay:", day3);
      DBG("Hour:", hour3, "\tMinute:", min3, "\tSecond:", sec3);
      DBG("Timezone:", timezone);
      break;
    } else {
      DBG("Couldn't get network time, retrying in 15s.");
      delay(15000L);
    }
  }
  DBG("Retrieving time again as a string");
  String time = modem.getGSMDateTime(DATE_FULL);
  DBG("Current Network Time:", time);
# endif

# if TINY_GSM_TEST_BATTERY && defined TINY_GSM_MODEM_HAS_BATTERY
  uint8_t  chargeState = -99;
  int8_t   percent     = -99;
  uint16_t milliVolts  = -9999;
  modem.getBattStats(chargeState, percent, milliVolts);
  DBG("Battery charge state:", chargeState);
  DBG("Battery charge 'percent':", percent);
  DBG("Battery voltage:", milliVolts / 1000.0F);
# endif

# if TINY_GSM_TEST_TEMPERATURE && defined TINY_GSM_MODEM_HAS_TEMPERATURE
  float temp = modem.getTemperature();
  DBG("Chip temperature:", temp);
# endif

# if TINY_GSM_POWERDOWN

# if TINY_GSM_TEST_GPRS
  modem.gprsDisconnect();
  delay(5000L);
  if (!modem.isGprsConnected()) {
    DBG("GPRS disconnected");
  } else {
    DBG("GPRS disconnect: Failed.");
  }
# endif

# if TINY_GSM_TEST_WIFI
  modem.networkDisconnect();
  DBG("WiFi disconnected");
# endif

  // Try to power-off (modem may decide to restart automatically)
  // To turn off modem completely, please use Reset/Enable pins
  modem.poweroff();
  DBG("Poweroff.");
# endif

  DBG("End of tests.");

  // Do nothing forevermore
  while (true) { modem.maintain(); }
}

このプログラムを実行するとターミナルに以下のように表示されて、
TynyGSMライブラリが SIMCOM社のSIM7080Gでも使えるのが確認できます。

17:29:55.439 -> [2011] Wait...
17:30:01.465 -> [8011] Trying baud rate 115200 ...
17:30:02.441 -> [9023] Modem responded at rate 115200
17:30:02.441 -> [9023] Initializing modem...
17:30:05.428 -> [11983] ### TinyGSM Version: 0.10.9
17:30:05.428 -> [11984] ### TinyGSM Compiled Module:  TinyGsmClientSIM7080
17:30:05.428 -> [11998] ### Modem: SIMCOM SIM7080
17:30:05.428 -> [12014] Modem Name: SIMCOM SIM7080
17:30:05.428 -> [12019] Modem Info: R1951.01
17:30:05.475 -> [12024] Waiting for network...
17:30:11.501 -> [18067] ### Network time and time zone updated.
17:30:11.501 -> [18078] Network connected
17:30:11.501 -> [18079] Connecting to sakura
17:30:12.576 -> [19155] GPRS status: connected
17:30:12.576 -> [19160] CCID: 8981040000000128772f
17:30:12.576 -> [19165] IMEI: 860016040058013
17:30:12.576 -> [19169] IMSI: 454065830912877
17:30:12.623 -> [19177] Operator: SoftBank SAKURA Internet
17:30:12.623 -> [19200] Local IP: 192.168.10.10
17:30:12.623 -> [19205] Signal quality: 24
17:30:12.623 -> [19205] Connecting to vsh.pp.ua
17:30:14.678 -> [21237] ### Got Data: 0
17:30:14.678 -> [21239] ### Closed:  0
17:30:14.913 -> HTTP/1.1 200 OK
17:30:14.913 -> Server: nginx/1.10.3 (Ubuntu)
17:30:14.913 -> Date: Sun, 13 Jun 2021 08:30:13 GMT
17:30:14.913 -> Content-Type: text/plain; charset=UTF-8
17:30:14.913 -> Content-Length: 121
17:30:14.913 -> Connection: close
17:30:14.913 -> X-DNS-Prefetch-Control: off
17:30:14.913 -> X-Frame-Options: SAMEORIGIN
17:30:14.913 -> Strict-Transport-Security: max-age=15552000; includeSubDomains
17:30:14.913 -> X-Download-Options: noopen
17:30:14.913 -> X-Content-Type-Options: nosniff
17:30:14.913 -> X-XSS-Protection: 1; mode=block
17:30:14.913 -> Accept-Ranges: bytes
17:30:14.913 -> Cache-Control: public, max-age=0
17:30:14.913 -> Last-Modified: Wed, 27 Sep 2017 09:03:12 GMT
17:30:14.913 -> ETag: W/"79-15ec2936080"
17:30:14.913 -> 
17:30:14.913 -> 
17:30:14.913 ->   _____            _____  _____  _____
17:30:14.913 ->     |  | |\ | \_/ |  ___ |_____ |  |  |
17:30:14.913 ->     |  | | \|  |  |_____| _____||  |  |
17:30:14.913 -> 
17:30:14.913 -> 
17:30:14.913 -> [21492] #####  RECEIVED: 633 CHARACTERS
17:30:14.913 -> [21500] Connecting securely to vsh.pp.ua
17:30:17.989 -> [24562] ### Got Data: 1
17:30:17.989 -> [24565] ### Closed:  1
17:30:18.220 -> HTTP/1.1 200 OK
17:30:18.220 -> Server: nginx/1.10.3 (Ubuntu)
17:30:18.220 -> Date: Sun, 13 Jun 2021 08:30:17 GMT
17:30:18.220 -> Content-Type: text/plain; charset=UTF-8
17:30:18.220 -> Content-Length: 121
17:30:18.220 -> Connection: close
17:30:18.220 -> X-DNS-Prefetch-Control: off
17:30:18.220 -> X-Frame-Options: SAMEORIGIN
17:30:18.220 -> Strict-Transport-Security: max-age=15552000; includeSubDomains
17:30:18.220 -> X-Download-Options: noopen
17:30:18.220 -> X-Content-Type-Options: nosniff
17:30:18.220 -> X-XSS-Protection: 1; mode=block
17:30:18.220 -> Accept-Ranges: bytes
17:30:18.220 -> Cache-Control: public, max-age=0
17:30:18.220 -> Last-Modified: Wed, 27 Sep 2017 09:03:12 GMT
17:30:18.220 -> ETag: W/"79-15ec2936080"
17:30:18.220 -> 
17:30:18.220 -> 
17:30:18.220 ->   _____            _____  _____  _____
17:30:18.220 ->     |  | |\ | \_/ |  ___ |_____ |  |  |
17:30:18.220 ->     |  | | \|  |  |_____| _____||  |  |
17:30:18.220 -> 
17:30:18.220 -> 
17:30:18.220 -> [24807] #####  RECEIVED: 633 CHARACTERS
17:30:18.267 -> [24837] Battery charge state: 0
17:30:18.267 -> [24837] Battery charge 'percent': 19
17:30:18.267 -> [24838] Battery voltage: 3.25
17:30:18.267 -> [24838] End of tests.

次回はTynyGSMライブラリの WebClient を使ってみます。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?