SORACOM M5Stack 用 3G 拡張ボードの AT コマンドをデバック

# 概要
SORACOM M5Stack 用 3G 拡張ボードでちょっとしたトラブルがあり AT コマンドをデバッグしました。
備忘録としてその手順を簡単にまとめておきます。

# 利用機器
M5Stack Basic 3G 拡張ボード セット
https://soracom.jp/products/kit/3g_module_m5stack_set/
# SORACOM M5Stack 3G 拡張ボードを使う準備
SORACOM SIM の登録方法などは以下を参照ください。
https://dev.soracom.io/jp/start/console/#registsim

M5Srick と 3G 拡張ボード、開発環境の設定は以下を参照ください。
https://dev.soracom.io/jp/start/m5stack/

今回は以下の SORACOM さんの「ステップ 2: M5Stack で開発してみる (HTTP アクセス)」のサンプルコードを利用させていただきます。
https://dev.soracom.io/jp/start/m5stack/#step2

# デバッグの設定と結果
以下は「ステップ 2: M5Stack で開発してみる (HTTP アクセス)」までが完了したことを前提に、設定方法について解説します。
## サンプルコードのまま実行
Arduino IDE シリアルモニタ表示

```
M5Stack initializing...OK
connected.
sent.
HTTP/1.1 200 OK
Connection: close
Server: Cowboy
Date: Fri, 13 Sep 2019 02:32:05 GMT
Content-Length: 307
Content-Type: text/plain; charset=utf-8
Cache-Control: max-age=0, private, must-revalidate
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: 
Access-Control-Allow-Credentials: true
Via: 1.1 vegur

headers received.
```

3G 通信には TinyGSM という Arduino のライブラリィを使いますが、サンプルコードではシリアルモニタで通信内容を全く確認できません。
M5Stack 画面の表示は簡単な状況のみしか把握できません。
![IMG_4048.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/e74ed819-e6ad-ca06-203f-7aa9b5a6d6f4.jpeg)

TinyGSM by Volodymyr Shymanskyy
https://github.com/vshymanskyy/TinyGSM

## デバッグを試す
以下のシエロ工房さんの情報を参照すると Arduino のライブラリィ TinyGSM　はデバッグができることがわかりました。

M5STACK ３G拡張ボードがIPを取得するまで
https://eguchi.jp/blog/?p=1276

早速、コードの #define TINY_GSM_MODEM_UBLOX　の前辺りに #define TINY_GSM_DEBUG Serial を追加し、デバックを実行してみます。

``` soracomTest.c
#include <M5Stack.h>

#define TINY_GSM_DEBUG Serial  // <= この1行を追加
#define TINY_GSM_MODEM_UBLOX
#include <TinyGsmClient.h>

TinyGsm modem(Serial2); /* 3G board modem */
TinyGsmClient ctx(modem);
```

Arduino IDE シリアルモニタ表示

```
M5Stack initializing...OK
[7544] ### TinyGSM Version: 0.7.9
[9659] ### Modem: u-blox SARA-U201
connected.
sent.
[57459] ### URC Data Received: 633 on 0
[57493] ### READ: 63 from 0
[57495] ### URC Data Received: 570 on 0
HTTP/1.1 200 OK
Connection: close
Server: Cowboy
[57521] ### READ: 63 from 0
[57523] ### URC Data Received: 507 on 0
Date: Fri, 13 Sep 2019 02:52:17 GMT
Content-Length: 307
[57548] ### READ: 63 from 0
[57550] ### URC Data Received: 444 on 0
Content-Type: text/plain; charset=utf-8
[57574] ### READ: 63 from 0
[57576] ### URC Data Received: 381 on 0
Cache-Control: max-age=0, private, must-revalidate
Access-Control-Allow-Origin: *
[57601] ### READ: 63 from 0
[57603] ### URC Data Received: 318 on 0
Access-Control-Expose-Headers: 
Access-Control-Allow-Credentials: true
[57627] ### READ: 63 from 0
[57629] ### URC Data Received: 255 on 0
Via: 1.1 vegur

headers received.
```

データ通信のデバッグはできていますね。

ただ、それ以前の AT コマンドを送信して実際にコネクションを確立するまでのプロセスはわからないままです。
実際はこの部分のトラブルが多いので、ATコマンドのデバッグまで行いたいですよね。
例えば、3G通信が弱くて接続できない、3G拡張ボード自体の不具合などです。

## AT コマンドのデバッグを試してみる
そこで、シエロ工房さんの情報を詳しく参照すると、
「TinyGSMCommon.h内のsendAT関数内のコメントアウトされていたATコマンドを表示するように設定」
とあるので、早速試してみました。

Arduino のライブラリィ TinyGSM のファイル TinyGsmCommon.h は、Windows の場合で、Arduino IDE と、TinyGSM を SORACOM さんのWebで紹介されている通常のインストールを行った場合は、以下に存在します。  
C:\Users\ユーザ名\Documents\Arduino\libraries\TinyGSM\src\TinyGsmCommon.h

TinyGsmCommon.h のファイルの末尾に近い602行辺りに以下の記述があります。

``` TinyGsmCommon.h
  void sendAT(Args... cmd) { \
    streamWrite("AT", cmd..., GSM_NL); \
    stream.flush(); \
    TINY_GSM_YIELD(); \
    /* DBG("### AT:", cmd...); */ \
  } \
```

以下のように /* DBG("### AT:", cmd...); */ のコメントを外します。

``` TinyGsmCommon.h
  void sendAT(Args... cmd) { \
    streamWrite("AT", cmd..., GSM_NL); \
    stream.flush(); \
    TINY_GSM_YIELD(); \
    DBG("### AT:", cmd...); \
  } \
```

通常のデバッグ結果では無事3G通信のコネクションを確立し、http 通信状況まで確認できますね。

```
M5Stack initializing...OK
[772] ### AT: 
[1071] ### AT: 
（中略）
[4061] ### AT: 
[4065] ### AT: +CFUN=16
[7544] ### TinyGSM Version: 0.7.9
[7544] ### AT: 
（中略）
[9637] ### AT: 
[9640] ### AT: E0
[9644] ### AT: +CMEE=2
[9648] ### AT: +CGMI
[9652] ### AT: +GMM
[9657] ### Modem: u-blox SARA-U201
[9658] ### AT: +CPIN?
[10665] ### AT: +CPIN?
[10672] ### AT: I
[10693] ### AT: +CGREG?
（+CGREG? を何回か繰り返す）
[19375] ### AT: +CGREG?
[19383] ### AT: +UPSDA=0,4
[19391] ### AT: +CGATT=1
[19397] ### AT: +UPSD=0,1," soracom.io "
[19403] ### AT: +UPSD=0,2," sora "
[19408] ### AT: +UPSD=0,3," sora "
[19413] ### AT: +UPSD=0,7,"0.0.0.0"
[19418] ### AT: +UPSDA=0,3
[52008] ### AT: +UPSND=0,8
[52016] ### AT: +CGREG?
[52022] ### AT: +UPSND=0,0
[54065] ### AT: +USOCTL= 0 ,10
[54073] ### AT: +USOCR=6
[54078] ### AT: +USOSO= 0 ,6,1,1
[54083] ### AT: +USOCO= 0 ," worldtimeapi.org ", 80
connected.
[69005] ### AT: +USOWR= 0 , 41
[69219] ### AT: +USOWR= 0 , 2
[69425] ### AT: +USOWR= 0 , 22
[69633] ### AT: +USOWR= 0 , 2
[69838] ### AT: +USOWR= 0 , 2
sent.
[70044] ### AT: +USORD= 0 ,0
[70050] ### AT: +USOCTL= 0 ,10
[70545] ### AT: +USORD= 0 ,0
[70551] ### AT: +USOCTL= 0 ,10
[70754] ### URC Data Received: 633 on 0
[70770] ### AT: +USORD= 0 ,0
[70777] ### AT: +USORD= 0 , 63
[70790] ### READ: 63 from 0
[70791] ### AT: +USORD= 0 ,0
[70792] ### URC Data Received: 570 on 0
[70797] ### AT: +USORD= 0 ,0
HTTP/1.1 200 OK
Connection: close
Server: Cowboy
[70804] ### AT: +USORD= 0 , 63
[70818] ### READ: 63 from 0
[70819] ### AT: +USORD= 0 ,0
[70820] ### URC Data Received: 507 on 0
[70825] ### AT: +USORD= 0 ,0
Date: Fri, 13 Sep 2019 03:45:40 GMT
Content-Length: 307
[70833] ### AT: +USORD= 0 , 63
[70847] ### READ: 63 from 0
[70848] ### AT: +USORD= 0 ,0
[70849] ### URC Data Received: 444 on 0
[70855] ### AT: +USORD= 0 ,0
Content-Type: text/plain; charset=utf-8
[70863] ### AT: +USORD= 0 , 63
[70877] ### READ: 63 from 0
[70878] ### AT: +USORD= 0 ,0
[70879] ### URC Data Received: 381 on 0
[70884] ### AT: +USORD= 0 ,0
Cache-Control: max-age=0, private, must-revalidate
Access-Control-Allow-Origin: *
[70891] ### AT: +USORD= 0 , 63
[70905] ### READ: 63 from 0
[70907] ### AT: +USORD= 0 ,0
[70907] ### URC Data Received: 318 on 0
[70912] ### AT: +USORD= 0 ,0
Access-Control-Expose-Headers: 
Access-Control-Allow-Credentials: true
[70920] ### AT: +USORD= 0 , 63
[70934] ### READ: 63 from 0
[70935] ### AT: +USORD= 0 ,0
[70936] ### URC Data Received: 255 on 0
[70942] ### AT: +USORD= 0 ,0
Via: 1.1 vegur

headers received.
```

一方、M5Stack と 3G 通信モジュールをアルミ箔と缶で覆って通信を遮断したところ、以下の結果のように +CGREG? を繰り返し、パケット圏内かどうかを問い合わを続けるのみで、3G通信ができない状況がわかります。

```
M5Stack initializing...OK
[772] ### AT: 
[1071] ### AT: 
[1370] ### AT: 
[1669] ### AT: 
[1968] ### AT: 
[2267] ### AT: 
[2566] ### AT: 
[2865] ### AT: 
[3164] ### AT: 
[3463] ### AT: 
[3762] ### AT: 
[4061] ### AT: 
[4065] ### AT: +CFUN=16
[7554] ### TinyGSM Version: 0.7.9
[7554] ### AT: 
[7853] ### AT: 
[8152] ### AT: 
[8451] ### AT: 
[8750] ### AT: 
[9049] ### AT: 
[9348] ### AT: 
[9647] ### AT: 
[9650] ### AT: E0
[9653] ### AT: +CMEE=2
[9656] ### AT: +CGMI
[9661] ### AT: +GMM
[9665] ### Modem: u-blox SARA-U201
[9666] ### AT: +CPIN?
[10672] ### AT: +CPIN?
[10679] ### AT: I
[10699] ### AT: +CGREG?
[10955] ### AT: +CGREG?
[11210] ### AT: +CGREG?
（AT: +CGREG? を繰り返す）
```

その他では、+CGREG? と +CGATT? を交互に繰り返す場合もありましたが、+CGATT? はでバイスの接続を確認していますので、3G 通信モジュールと他の何等かの環境がバッティングでしてUART接続を認識できてないことなどが推察されます。

## 参考情報
M5Stack Basic 3G 拡張ボード セット
https://soracom.jp/products/kit/3g_module_m5stack_set/

SORACOM M5Stack 3G 拡張ボードを使う準備
https://dev.soracom.io/jp/start/console/#registsim

M5STACK ３G拡張ボードがIPを取得するまで
https://eguchi.jp/blog/?p=1276

ATコマンド
https://m2msupport.net/m2msupport/atcgatt-ps-attach-or-detach/