はじめに

この記事では、ESP32 と Sigfox ブレイクアウトボード BRKLSM100A を使って、WiFiの届かない数キロメートル先の基地局へセンサーデータを送信する方法を解説します。Sigfox は年間1000円程度・アクセスポイント不要で使える LPWAN サービスで、ESP-NOW や BLE が届かない広域 IoT 通信に適しています。ATコマンドの設定手順から Sigfox クラウドの Callback 設定(Slack 通知)まで、実際に躓いた点も含めて紹介します。

Sigfox の具体的な設定方法や技術的な質問にはお答えできませんのでご了承ください。

Sigfoxとは

Sigfox は、低消費電力の広域ネットワーク(LPWAN: Low Power Wide Area Network)技術の一つで、主に IoT デバイス向けに設計されています。LPWANは0G回線とも呼ばれています。Sigfox サービスを展開するのはフランスの会社ですが、日本では 京セラさんが代理店 として窓口に立ってくれています。なにか分からないことがあれば、京セラさんが丁寧にご回答してくれます。

以下、Sigfox の特徴をまとめておきます。

低消費電力

デバイスのバッテリー寿命が数年に渡ることが可能です。通信頻度が低く、消費電力が非常に少ない設計になっています。Sigfox デバイスを制御するには、UART の AT コマンドを使います。Arduino や ESP32、または PIC などでも制御できます。低消費電力の PIC であれば、Sigfox デバイスと組み合わせて太陽電池やリチウム電池で長期間運用も実現可能です。

広範囲カバー

Sigfox デバイスから Sigfox 基地局(Sigfox ゲートウェイ)まで、数キロメートルから数十キロメートルにわたる広範囲の通信が可能です。都市部では数キロメートル、農村部では数十キロメートルの通信距離をカバーします。Sigfox GW(ゲートウェイ)は自前で用意する必要はありません。下記 URL に Sigfox 通信できるエリアが示されています。日本の首都圏で広く展開されており、山間部などの一部地方ではつながらない場合があります。

世界中の多くの国で利用可能で、国境を越えた通信が容易に行えます。Sigfox のネットワークオペレーターがインフラを提供します。

低データレート

1回の通信で最大12バイトのペイロードを送信できます。16進数2文字で1バイトなので、最大24桁の16進文字列(例: 0123456789ABCDEF01234567)まで送れます。センサ値をバイナリに詰めて16進文字列として送れば、12バイト内に複数の値を収められます。一日の送信回数に制限があり、通常は140回までです。

低コスト

BRKLSM100A のような Breakout Board Devkit(開発キット)の場合、1年間の無償回線を利用できる ようです。以下の URL から、Devkit 情報の入力およびユーザーアカウント情報を入力して Devkit 登録を行ってください。

それに気づかず、私の場合は先に回線を買ってしまいました😅 後から連絡しても無償回線を提供いただけなかったので注意です。

下記ページをよく読んでから、回線契約しましょう。

Sigfox 回線を購入する際には、送信回数制限によってプランが異なります。

最大送信回数年間費(1/device)
2¥671
70¥814
140¥1221

私の場合は、70回制限の 年間814円/device プランを選びました。もう少しお金を出せば、位置情報も追加できるようです。盗難防止や異常検知の意味では、リアルタイムな位置情報が分かったほうが良いかもしれません。

利用ケース

項目内容
スマートメーターガス、水道、電力メーターのリモートモニタリング。
資産追跡コンテナ、車両、ペットなどの位置追跡。
環境モニタリング気象センサーや環境データの収集。
セキュリティ防犯センサーやアラームシステム。

技術的な詳細

通信方式 としては、アップリンク(デバイスからクラウド)とダウンリンク(クラウドからデバイス)の通信が可能です。ダウンリンクは制限があり、主にアップリンク通信が主体です。

周波数帯 は、868MHz(ヨーロッパ)および902MHz(北米)など、地域によって異なる周波数帯を使用します。日本においては免許不要の920MHz帯を利用します。Sigfox デバイスが届いたら、AT コマンドを使って RC (region configuration) をその国に合わせて設定しないとデータ通信できません ので注意が必要です。後ほど具体的なプログラミングで解説します。

Sigfox は超狭帯域(UNB: Ultra Narrow Band)を使用して通信を行います。

メリットとデメリット

ここまでのまとめとして、メリットとデメリットを挙げておきます。

メリット は以下の通りです。

  • 長距離通信が可能で、インフラのコストが低い。
  • デバイスの運用コストが低い。
  • 簡単なインテグレーションとスケーラビリティ。

デメリット は以下の通りです。

  • データレートが低く、大量のデータ送信には不向き。
  • 通信のリアルタイム性が低い。
  • 利用可能エリアが限られている場合がある。

これらの特徴により、Sigfox は低消費電力で長距離通信が必要な IoT アプリケーションに適しています。

ESP32からSigfoxでデータ送信するまで

ここでは主に躓いた部分を取り上げつつ、ESP32 から Sigfox でデータ送信するまでのざっくりとした流れを解説します。詳細な設定方法は、京セラさんのブログページをご参考ください。

ゴール(SigfoxクラウドでCallback登録してSlackへWebhookさせる)

下記のようなイメージでシステム構築してみました。

ESP32 と Sigfox デバイス BRKLSM100A は UART(シリアル通信)で繋ぎます。AT コマンドでデータ送信を Sigfox デバイスへ命令します。データ送信に成功すると、Sigfox クラウドのバックエンド画面で受信データを確認できます。受信データは Slack はじめ、各アプリケーションへ送信できます。この仕組みを Sigfox クラウドでは Callback と呼んでいます。Slack の Webhook URL を Callback に登録すれば、デバイスからデータ送信されたタイミングで Slack に通知させることができます。Callback の送信は単純な HTTP リクエストで、Content-Type を設定できるので JSON 形式で POST させることも可能です。

ESP32とSigfoxデバイスの配線

シリアル通信に使うTXとRXの配線に注意してください。

ESP32LSM100A
3V3VCC
GNDGND
16 (RX)TX
17 (TX)RX
4RST

Sigfoxクラウドの設定

デバイスの数だけ回線を契約したら、Sigfox クラウドでデバイス登録をします。DEVICE TYPE を作成してから DEVICE を追加するようにします。手順は京セラさんのブログに詳しく掲載されていますので、そちらをご参考ください。

PACについて

パッケージは捨てないで!

デバイスが届いたら、パッケージに記載されている Device ID と PAC ナンバーを使って Sigfox クラウドにデバイス登録します。PAC はワンタイムパスワード のようなものです。一度登録するとその PAC ナンバーは無効になります。同じデバイスを再度登録する場合は、問い合わせて PAC ナンバーを再発行してもらう必要があります。

Caution

PACはSigfoxクラウド側で必要になるだけで、デバイス自体に設定したりするものではありません。

デバイスがActivateになるタイミング

デバイスが Activate になるタイミングは、はじめて Sigfox クラウドへ送信が成功したときです。その時点で Token state が OK になり、契約中の回線(Contracts)が紐づけられて利用開始となります。このライフサイクルについては下記ブログで詳しく解説されています。

注意として、アクティベート後に デバイスを削除してしまうと紐づけられた回線契約も無効 になってしまいます。回線費が無駄になってしまいますので、デバイス削除は基本しないようにしましょう。デバイス自体は使えますが、PAC の再発行と新たな回線契約が必要になります。

Sigfoxデバイスの設定①(通信方法)

BRKLSM100A デバイスは、初期設定では LoRa 通信になっています。また、RCZ を RC1 から RC3 に変更する必要があります。そのため、データを送信する前に AT コマンドで設定を変更しておきます。

Sigfox デバイスに UART で AT+MODE=0 を送信します。

  • 0: Sigfox
  • 1: LoRa

デバイスを購入した marutsu さんや、京セラさんの案内では AT+MODE=1 を送信するように書かれていますが、←コレ間違っていると思います!

▼ こちら本家のユーザーマニュアルの19ページをご確認いただければ分かります。

LoRa & Sigfox Mode Change. After a MCU reset.
<mode>: [ 0: SigFox, 1: LoRa ]

と記載されています。

1ではなく0が Sigfox 通信の設定になるはずです。つまり AT+MODE=0 が Sigfox 通信の設定です。実機でも確認しましたが、その通りになりますので注意してください。

Sigfoxデバイスの設定②(Region Configuration)

さらに RC (region configuration) の設定が必要ですが、こちらも案内通りだとうまく設定できませんでした。案内では AT$TM=3C,0 となっていますが、実際にコマンド送信してみると ERROR 0x50 のエラーが返ってきてしまい、設定変更できません。

そこで ユーザーマニュアル を読み直し、AT$RC=3C でコマンド送信したところ、RC3 に切り替わりました。 Sigfox へのデータ送信もはじめて成功しました!Sigfox の情報は少なく、はじめの段階で躓いて諦めてしまった方が多いのではないかと思います。

ソースコード

先に記述した通り、ESP32 と Sigfox デバイスを配線後、Sigfox クラウドへのデータ送信に成功したソースコードです。

#include <Arduino.h>
#include <HardwareSerial.h>

// ESP32 LSM100A
// 16 (RX) → LSM100A TX
// 17 (TX) → LSM100A RX

#define MOD_RESET 4
#define MOD_RX 16
#define MOD_TX 17

HardwareSerial Sigfox(2);

void sendCommand(String command, int timeout) {
    Sigfox.print(command);
    Sigfox.print('\r');
    delay(1000);

    String response = "";
    long limit = millis() + timeout;

    while (millis() < limit) {
        while (Sigfox.available()) {
            char c = Sigfox.read();
            response += c;
        }
    }

    Serial.println(response);
}

void setup() {
    Serial.begin(115200);
    Sigfox.begin(9600, SERIAL_8N1, MOD_RX, MOD_TX);
    delay(1000);

    Serial.println("Sigfox Module Ready....");

    // Sigfoxモジュールをリセット
    pinMode(MOD_RESET, OUTPUT); // 4番ピンをリセットピンとして設定
    digitalWrite(MOD_RESET, LOW);
    delay(100);
    digitalWrite(MOD_RESET, HIGH);
    delay(2000); // 数秒待機してSigfoxモジュールが安定するのを待つ

    Serial.println("Start");

    Serial.println("AT+LINKC? ....");
    sendCommand("AT+LINKC?", 3000);
    // ATコマンド参考: https://www.kccs.co.jp/sigfox/solution/product/device71/pdf/LSM100A_UserManual.pdf

    Serial.println("AT+MODE=0 ....");
    // 通信方法の変更 [0: Sigfox, 1: LoRa]
    sendCommand("AT+MODE=0", 3000);

    Serial.println("AT$RC=3C ....");
    sendCommand("AT$RC=3C", 3000);

    // デバイス情報を取得
    Serial.print("Device ID: ");
    sendCommand("AT$ID", 3000);
}

void loop() {
    // サンプルデータを送信(第2引数0 = uplink only)
    sendCommand("AT$SF=0123456789AB,0", 5000);
    // 11分待機(140回/日制限内に収めるため10分30秒以上の間隔が必要)
    delay(11 * 60 * 1000);
}

【注意】デバイス起動のタイミング

はじめ、AT コマンドを送信しても AT_ERROR が返ってきてしまい困ったものでした。原因は Sigfox デバイス起動のタイミングでした。電源を入れてから ESP32 起動後、一度 Sigfox デバイスをリセットする必要があります。 ソースコードを見てもらうと分かりますが、下記のようにしてリセット処理しています。

    // Sigfoxモジュールをリセット
    pinMode(MOD_RESET, OUTPUT); // 4番ピンをリセットピンとして設定
    digitalWrite(MOD_RESET, LOW);
    delay(100);
    digitalWrite(MOD_RESET, HIGH);
    delay(2000); // 数秒待機してSigfoxモジュールが安定するのを待つ

ESP32 の4番ピンと Sigfox デバイスの RST ピンを接続して制御できます。その後、UART による AT コマンド送信に失敗することがなくなりました。マニュアルにも情報がなく、かなり躓く部分だと思います。

Callback(Slackへの送信)がうまくいかない

Slack の Webhook API へ送信する HTTP リクエストは下記の通りです。

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/XXXXXXXXXXXX

最初は Sigfox クラウドの Callback 設定を JSON 形式ではなく、x-www-form-urlencoded で設定していたため、400エラーが返ってきていました。

400 - Bad Request - #1
POST https://hooks.slack.com/services/XXXXXXXXXXXX HTTP/1.1
content-length: 22
accept-language: fr
host: hooks.slack.com
content-type: application/x-www-form-urlencoded
accept-encoding: gzip,deflate
accept-charset: UTF-8;q=0.9,*;q=0.7
user-agent: SIGFOX

text=30CE86D1719539412

この問題は content-typeapplication/json を設定すれば解決できます。データ内容などの変数も使えますので、下図のように適宜 Body に設定します。

正直ここにたどり着くまでに、何度も Sigfox 通信を諦めようと思いました。ですが、京セラさんの親切な窓口サポートのおかげもあり、なんとかゴールに辿り着きました。 SlackでSigfoxデータ受信

さて、Sigfox の気になる通信距離ですが、窓際でなくても室内の奥まった場所からでもデータ送信に成功しているので、かなり期待できそうです!

この記事が少しでも参考になれば幸いです。なお、Sigfox の具体的な設定方法や技術的な質問にはお答えできませんのでご了承ください。

関連記事

関連アイテム