LPWANコンボ通信を嗜む
世界的な情勢不安定によるさまざまな危機が叫ばれております。電力無くして生きる術のない情報通信業界に身を置く者として、改めて「砂上の楼閣」感を強く感じてしまう今日この頃です。
そんな状況ですが、今回も米粒ごときのたわいもないネタで楽しんでみたいと思います。「事始め」として、Arduino MKR WAN 1310 と LTE-M モジュールをつなげて、疎通確認してみます。
1. 背景
社会的な諸事情が異なるためか、日本以外のマーケットでは、屋内外含めてアセットトラッキングのソリューションが見受けられ、また受け入れられているようです。
少し調査してわかったことですが、欧米系のアセットトラッキングデバイスとして、LPWAN 通信モジュールをコンボ搭載した製品がしばしば見受けられます。例えば LTE-MとLoRaWAN など、通信手段を二つ持っているデバイスです。
欧州では、国境を跨いだ物流網が構築されており、その中で切れ目のない通信を実現するために、コンボモジュール搭載のアセットトラッキングデバイスに一定のニーズがあるのだと理解しています。
残念ながら、日本では見かけたことがありません。人口カバー率や通信部分だけのコストで見れば、国内ではLTE系一択と思っている方々が多いのかもしれません。ニーズがないから製品もない、ということかもしれません。
しかしコンセプトとしては興味深いので、何か実験的なことができないかな?と思い、まずは LoRaWAN搭載Arduino で LTE-M モジュールを動作させてみることにしました。
2. 用意するもの
用意するものリスト
Arduino MKR WAN 1310 は、この Tech ブログでも数回登場しております。「CayenneLPP が使えると、とっても楽チンなコト」に LoRaWAN を使う場合の Tips が書いてあります。
開発環境は、定番の Arduino IDE を利用します。
3. 実験すること
Arduino MKR WAN 1310 で、LTE-M モジュールを動かしてみます。Arduino MKR WAN 1310 で LTE-M モジュールを動かすことができれば、その時々の通信環境に応じて、LoRaWAN か LTE-M か、どちらの通信方法で情報を伝達するかを選択することが可能です。
4. 有用な参考情報
今回は、ほぼプログラムはしません。非常に有用な情報が公開されていますので、それを利用するだけです。巨人と先人の肩に乗りまくりです。
まず、Qiita で多くの記事を投稿されている上野 和昭さん @kaz19610303 に感謝です。上野さんの記事「SIMCOM 社の SIM7080G を Arduino UNO でコントロール」の内容がほぼそのまま使えます。
また、SICOM 社 SIM7080G の情報としては、M5Stack 社が先日発売した「STAMP CATM」や、Waveshare 社の「SIM7080G Cat-M/NB-IoT HAT」の情報が活用可能です。
5. 実験結果
非常に幸運にも、Arduino MKR WAN 1310 は、ハードウェアシリアルを搭載しております。Pin13 が Rx, Pin14 が Tx です。LTE-M モジュールは、 USB 接続だけでなくシリアル用 PIN が用意されています。+5V 電源, GNN も合わせて 4 本の線で繋げば、Arduino 側から AT コマンドで LTE-M モジュールを制御できます。
5.1. Arduino 用プログラム
不要な部分をコメントアウトし、ハードウェアシリアル部分を有効にするだけです。
/* This code is an example of how to use the AT command library to
* send AT commands (or ASCII commands) to a module via UART (TX/RX)
* using software or hardware serial. The commands can be set up to
* check for a specified reply from the module as well as a timeout.
*
* Author: Timothy Woo (botletics.com)
* Last Modified: 10/20/2017
*/
#include "ATcommands.h"
// #include <SoftwareSerial.h>
//#define MCU_RX 8 // Remember MCU RX connects to module TX and vice versa
//#define MCU_TX 7
// #define RST 12 // MCU pin to SIM7080G module pwrket
//#define RESET_PIN 11 // MCU pin to SIM7080G module reset
//#define PWRKEY 12 // MCU pin to SIM7080G module pwrket
#define LED 6 // MCU pin to LED
//SoftwareSerial moduleSS = SoftwareSerial(MCU_RX, MCU_TX); // MCU RX, TX
//SoftwareSerial *moduleSerial = &moduleSS;
// Hardware serial is also possible!
HardwareSerial *moduleSerial = &Serial1;
ATcommands module = ATcommands(RST, true); // Use "false" if you don't want AT commands with newline, "true" otherwise
void setup() {
Serial.begin(115200);
moduleSerial->begin(115200); // Verify your module's baud rate
module.begin(*moduleSerial);
//pinMode(RESET_PIN, OUTPUT);
//digitalWrite(RESET_PIN, HIGH);
//delay(100);
//digitalWrite(RESET_PIN, LOW);
delay(100);
// Reset module if needed. This example pulses the reset pin low for 10ms.
// If left out, the pulse duration is 100ms by default.
module.reset(HIGH, 10); // module.reset(HIGH/LOW, pulseDuration)
module.sendCommand("AT", "OK", 1000);
module.sendCommand("AT+CGDCONT=1,\"IP\",\"soracom.io\"", "OK", 1000);
module.sendCommand("AT+CGAUTH=1,3,\"sora\",\"sora\"", "OK", 1000);
module.sendCommand("AT+COPS=1,2,\"44010\"", "OK", 1000);
module.sendCommand("AT+COPS?", "OK", 1000);
module.sendCommand("AT+CPIN?", "OK", 1000);
module.sendCommand("AT+CNMP=38", "OK", 1000);
module.sendCommand("AT+CMNB=1", "OK", 1000);
module.sendCommand("AT+CSQ", "OK", 1000);
module.sendCommand("AT+CGREG?", "OK", 1000);
module.sendCommand("AT+CGNAPN", "OK", 1000);
module.sendCommand("AT+CPSI?", "OK", 1000);
module.sendCommand("AT+CNACT=0,1", "OK", 1000);
module.sendCommand("AT+CNACT?", "OK", 1000);
module.sendCommand("AT+SNPING4=\"google.com\",3,16,3000", "OK", 5000);
module.sendCommand("AT+CNACT=0,0", "OK", 1000);
}
void loop() {
// Nothing here
}
5.2. 動作結果ログ
サンプルプログラムの動作結果ログです。
08:33:27.066 -> <--- AT+CGDCONT=1,"IP","soracom.io"
08:33:27.066 -> OK
08:33:27.066 ->
08:33:27.066 -> ---> AT+CGAUTH=1,3,"sora","sora"
08:33:28.077 -> <--- AT+CGAUTH=1,3,"sora","sora"
08:33:28.077 -> OK
08:33:28.077 -> K
08:33:28.077 ->
08:33:28.077 -> ---> AT+COPS=1,2,"44010"
08:33:29.070 -> <--- AT+COPS=1,2,"44010"
08:33:29.070 -> OK
08:33:29.070 -> "
08:33:29.070 -> OK
08:33:29.070 -> K
08:33:29.070 ->
08:33:29.070 -> ---> AT+COPS?
08:33:30.084 -> <--- AT+COPS?
08:33:30.084 -> +COPS: 1,2,"44010",7
08:33:30.084 ->
08:33:30.084 -> OK
08:33:30.084 ->
08:33:30.084 -> ---> AT+CPIN?
08:33:31.066 -> <--- AT+CPIN?
08:33:31.066 -> +CPIN: READY
08:33:31.066 ->
08:33:31.066 -> OK
08:33:31.066 ->
08:33:31.066 ->
08:33:31.066 -> OK
08:33:31.066 ->
08:33:31.066 -> ---> AT+CNMP=38
08:33:32.081 -> <--- AT+CNMP=38
08:33:32.081 -> OK
08:33:32.081 -> READY
08:33:32.081 ->
08:33:32.081 -> OK
08:33:32.081 ->
08:33:32.081 ->
08:33:32.081 -> OK
08:33:32.081 ->
08:33:32.081 -> ---> AT+CMNB=1
08:33:33.076 -> <--- AT+CMNB=1
08:33:33.076 -> OK
08:33:33.076 ->
08:33:33.076 -> READY
08:33:33.076 ->
08:33:33.076 -> OK
08:33:33.076 ->
08:33:33.076 ->
08:33:33.076 -> OK
08:33:33.076 ->
08:33:33.076 -> ---> AT+CSQ
08:33:34.088 -> <--- AT+CSQ
08:33:34.088 -> +CSQ: 18,99
08:33:34.088 ->
08:33:34.088 -> OK
08:33:34.088 -> K
08:33:34.088 ->
08:33:34.088 ->
08:33:34.088 -> OK
08:33:34.088 ->
08:33:34.088 -> ---> AT+CGREG?
08:33:35.067 -> <--- AT+CGREG?
08:33:35.067 -> +CGREG: 0,1
08:33:35.067 ->
08:33:35.067 -> OK
08:33:35.067 ->
08:33:35.067 ->
08:33:35.067 -> OK
08:33:35.067 ->
08:33:35.067 -> ---> AT+CGNAPN
08:33:36.082 -> <--- AT+CGNAPN
08:33:36.082 -> +CGNAPN: 1,"soracom.io"
08:33:36.082 ->
08:33:36.082 -> OK
08:33:36.082 ->
08:33:36.082 -> ---> AT+CPSI?
08:33:37.073 -> <--- AT+CPSI?
08:33:37.073 -> +CPSI: LTE CAT-M1,Online,440-10,0x172B,47544848,117,EUTRAN-BAND19,6100,3,3,-10,-98,-74,16
08:33:37.073 ->
08:33:37.073 -> OK
08:33:37.073 ->
08:33:37.073 -> ---> AT+CNACT=0,1
08:33:38.066 -> <--- AT+CNACT=0,1
08:33:38.066 -> OK
08:33:38.066 ->
08:33:38.066 -> +APP PDP: 0,ACTIVE
08:33:38.066 -> 0,0x172B,47544848,117,EUTRAN-BAND19,6100,3,3,-10,-98,-74,16
08:33:38.066 ->
08:33:38.066 -> OK
08:33:38.066 ->
08:33:38.066 -> ---> AT+CNACT?
08:33:39.057 -> <--- AT+CNACT?
08:33:39.057 -> +CNACT: 0,1,"10.231.113.87"
08:33:39.057 -> +CNACT: 1,0,"0.0.0.0"
08:33:39.057 -> +CNACT: 2,0,"0.0.0.0"
08:33:39.057 -> +CNACT: 3,0,"0.0.0.0"
08:33:39.057 ->
08:33:39.057 -> OK
08:33:39.057 ->
08:33:39.057 -> ---> AT+SNPING4="google.com",3,16,3000
6. 今後に向けて
次は、LoRaWAN も動かし、状況次第で通信が変わるような実験をしてみたいと思っています。(いつになるかは不明ですが。。。)