M5Stack用3G拡張ボード
M5Stackは単体でもWi-FiやBluetooth Low Energy(BLE)を搭載しているので接続性に優れたデバイスですが、セルラー通信機能が加わることで屋外でのクラウドやネット上のリソース活用がとても容易になり、利用シーンが大きく広がります。
この拡張ボードには、3Gモデム、nanoSIMスロット、アンテナが入っているため、SIMを準備すればM5Stackの3G通信が可能となります。
M5Stack用3G拡張ボードはソラコムのユーザーコンソールからご購入いただくことができます(購入には無料のSORACOMアカウントが必要です)。
M5Stack用3G拡張ボードで利用可能なSORACOM IoT SIM
M5Stack用3G拡張ボードで利用可能なSORACOM IoT SIMは以下の通りです。
- SORACOM IoT SIM(「plan01s」および「plan01s - Low Data Volume」のどちらでもお使いいただけます)
-
SORACOM 特定地域向け IoT SIM / plan-D
- SIMのサイズは「nanoSIM」サイズです。plan01sおよびplan01s - Low Data Volumeは、nanoSIMを含めた3つのSIMサイズに対応できるSIMカードです。
M5Stack用3G拡張ボードと同様に、SORACOM IoT SIMもソラコムのユーザーコンソールからご購入いただくことができます(購入には無料のSORACOMアカウントが必要です)。
注
ソラコムではM5Stack Basic本体とM5Stack用3G拡張ボードがセットになった「M5Stack Basic 3G 拡張ボード セット」もご用意しています。
SORACOMアカウントの作成方法
SORACOMアカウントを作るためには以下の3つが必要です(すでにアカウントをお持ちの方は、本手順は不要です)。
- モダンなWebブラウザ(Google Chrome推奨)
- 受信可能なメールアドレス1つ
- 有効なクレジットカード1つ
メールアドレスはアカウント作成時に本人確認のために使用します。またクレジットカードはM5Stack用3G拡張ボードやSORACOM IoT SIMの購入やSORACOM各種サービス利用料金の請求先となるため、これらを用意してください。
詳しいサインアップの方法はSORACOM アカウントの作成の手順に沿い、約15分で作成することができます。「支払情報の設定」まで行ったら、アカウント作成は完了です。
SIMの取り付けとM5Stackへの取り付け
M5Stack用3G拡張ボードにSIMを取り付けます。取り付けには1.5mmの六角レンチもしくは六角ドライバーが必要なので、別途ご準備ください。
まずは六角レンチもしくは六角ドライバーを使って、拡張ボードの基板をケースから取り外します。写真のようにスロットを左下に置いて、SIMカードの数字が書いてある面を表、角が欠けている側を右側にして奥まで挿入してください。
次に、M5Stackの上部とボトムモジュールの間にM5Stack用3G拡張ボードを挟む形で取り付けてください。ピンソケットを曲げてしまわないか緊張する瞬間ですが、モジュール間のスキマがなくなるようぐっと押し込みます(灰色部分がM5Stack用3G拡張ボードです。わかりやすいように標準のケースとは異なる色を使用しています)。
以上でハードウェア側の準備は完了となります。
ライブラリのセットアップ
M5Stack用3G拡張ボードを利用するためのライブラリをセットアップします。今回は「TinyGSM」というオープンソースライブラリを利用します。
Arduino IDEのメニューから[ツール]>[ライブラリを管理]で表示されるダイアログ上でTinyGSM by Volodymyr Shymanskyyをインストールします(tinygsmで検索すると見つけやすいです)。
テスト~ワールドクロックの表示
準備が整ったところで、ワールドクロックを表示してみます。今回は「World Time API」というサービスを利用し、API経由でクロック情報を得てみます。
M5StackとPCをUSB Type-Cで接続した後、以下の手順を行います。基本的な手順は先ほどのHelloWorldの時と同じです。
-
Arduino IDEのメニューから[ツール]>[ボード: ...]で、
M5Stack-Core-ESP32を選択します。 - Arduino IDEのメニューから[ツール]>[シリアルポート: ...]で、M5Stackが接続されているポートを選択します。
- Arduino IDEのメニューから[ファイル]>[新規ファイル]を選択し、新たなスケッチを書けるようにします。
- 新たなスケッチの内容をGist / m5stack_3gextboard_worldclock.inoの内容にします。
- Arduino IDEで「書き込み」を行います。
書き込みが正常に完了すれば自動的に再起動して書き込まれたスケッチが実行され、以下のように液晶ディスプレイへWorld Time APIから入手した情報が表示されます(通信の確立まで40~60秒程度かかります)。
Gistで配布しているソースコード
Gistで配布しているソースコードを、こちらにも掲載します。
/*
* Copyright (c) 2019 Kohei "Max" MATSUSHITA
* Released under the MIT license
* https://opensource.org/licenses/mit-license.php
*/
#include <M5Stack.h>
#define TINY_GSM_MODEM_UBLOX
#include <TinyGsmClient.h>
TinyGsm modem(Serial2); /* 3G board modem */
TinyGsmClient ctx(modem);
void setup() {
Serial.begin(115200);
M5.begin();
M5.Lcd.clear(BLACK);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.println(F("M5Stack + 3G Module"));
M5.Lcd.print(F("modem.restart()"));
Serial2.begin(115200, SERIAL_8N1, 16, 17);
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(2000);
}
void loop() {
M5.update();
M5.Lcd.clear(BLACK);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println(F("World Clock from worldtimeapi.org"));
/* HTTP GET example */
if (!ctx.connect("worldtimeapi.org", 80)) {
Serial.println(F("Connect failed."));
return;
}
Serial.println(F("connected."));
/* send request */
ctx.println("GET /api/timezone/Asia/Tokyo.txt HTTP/1.0");
ctx.println("Host: worldtimeapi.org");
ctx.println();
Serial.println("sent.");
/* receive response */
while (ctx.connected()) {
String line = ctx.readStringUntil('\n');
Serial.println(line);
if (line == "\n") {
Serial.println("headers received.");
break;
}
}
char buf[1 * 1024] = {0};
ctx.readBytes(buf, sizeof(buf)); /* body */
ctx.stop();
M5.Lcd.println(buf);
delay(1000 * 10);
}
