技術情報

Sigfox Shield for Arduino(UnaShield)をATコマンドのみで動かす

2020.03.03

Sigfox Shield for Arduino(UnaShield)は、Sigfoxモジュールを搭載し、Arduino Uno互換をもった開発ボードであり、基本的な使い方はこちらで説明していますが、ArduinoからATコマンドのみでメッセージを送信することもできます。
シンプルにSigfox ATコマンドを使ってみたいという方向けにサンプルコードを用いて説明します。

準備

Sigfox Shield for Arduino(UnaShield)とArduino(Uno)を入手し、無償回線契約※1Sigfox Buy)を済ませておいてください。

※1 2022年7月1日をもって、Devkit対応デバイスのDevkit登録(無償回線利用)が終了いたしました。
Sigfox回線をご利用の際には、Sigfox Buyにて有償回線をご購入ください。
Sigfox Buy お申込みからご利用開始までの流れは
こちら

ATコマンドで動かす

UnaShieldは、ArduinoピンのD4とD5に、通信モジュールとのUARTが割り当てられています。

img-20200303-technical-01.png

ですので、Arduino Unoであれば、SoftwareSerialを用いてATコマンドによる制御が可能になります。D4がUnaShield側の受信(RX)、Arduino側の送信(TX)となります。D5はその逆です。つまり、SoftwareSerial(5, 4)ですね。

サンプルコード

まずは、そのまま動くサンプルスケッチを載せておきます。

basic-at.c
#include

#define rxPin 5
#define txPin 4
SoftwareSerial Sigfox =  SoftwareSerial(rxPin, txPin);

void setup() {
  Serial.begin(9600);

  // open Softserial Communication
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  Sigfox.begin(9600);
  delay(100);

  sendCommand("AT$I=10", "Sigfox Device ID:");
  sendCommand("AT$IF=923200000", "UL Frequency set: ");
  sendCommand("AT$DR=922200000", "DL Frequency set: ");
  sendCommand("ATS410=1" ,"Public key: ");
  sendCommand("AT$WR", "Save config: ");
  sendCommand("AT$T?", "Get module temperature: ");
}

void loop() {
  // put your main code here, to run repeatedly:
  sendMessage("AT$SF=1234567890abcdef\r", "Send Message: ");
}

//Send Sigfox Command
String sendCommand(String cmd, String display){
  Sigfox.print(cmd);
  Sigfox.print("\r");
  delay(100);

  return displayStatus(display + cmd);
}

//Send Sigfox Message
String sendMessage(String cmd, String display) {
  sendCommand(cmd, display);
  while (true) {
    String status = displayStatus("");
    if (status.length()) {
      delay(60000);
      break;
    }
    delay(100);
  }
}

String displayStatus(String message) {
  String status = "";
  char output;

  while(Sigfox.available()){
    output = (char)Sigfox.read();
    status += output;
    delay(10);
  }
  if (message.length()) Serial.println(message);
  if (status.length()) Serial.println(status);
  return status;
}

delay入れまくってますが、本当は避けるべきですね。

Sigfox ATコマンド

先程のサンプルコードで、setup()関数内にあったコマンド群は、出荷時に日本向けに設定済みのものですので、実際には必要ありません。
何を意味するかだけを書いておきます。

ATコマンド内容
AT$I=10 デバイスIDを取得
AT$I=11 デバイスPACを取得※1
AT$IF 上り送信信号の中心周波数(日本では923.2MHz)
AT$DR 下り受信信号の中心周波数(日本では922.2MHz)
ATS410 パブリックモード(1)とプライベートモード(0)の切り替え※2
AT$WR 変更値をモジュール内に保存
AT$SF メッセージ送信
  • ※1デバイスのPACというのは、Sigfoxを一意に識別するための認証コードで、Sigfoxクラウド内での認証に使われます。ただし、このコードはワンタイムコードですので、デバイスをSigfoxクラウドに登録したりすると、AT$I=11コマンドから取得できるPACコードは無効になっており、最新のコードはSigfoxクラウド内のDevice Informationで確認してください。
  • ※2パブリックモードとは、Sigfox基地局及びクラウドに接続するモードです。プライベートモードにするとSigfoxオペレータが運用する基地局には接続しないモードとなります。

まとめ

いろいろと書きましたが、UnaShieldをATコマンドで動かすためには、

  1. SoftwareSerialでD4 / D5ポートを送受にしたシリアル通信とする
  2. AT$SFコマンドでSigfoxメッセージ送信

という2点だけです。是非、ロッカーの片隅にしまったUnaShieldを取り出し、試してみてください。

著者情報

Products and Marketing Department 日比 学

京セラコミュニケーションシステム株式会社(KCCS)よりSigfox社(フランス)に出向中の元自称Sigfoxエバンジェリスト

  • KCCSから追い出され、フランスの片田舎で余生を過ごしています
Twitter:https://twitter.com/ghibi