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

[Sigfox Shield for Arduino (UnaShield)](https://www.kccs-iot.jp/solution/product/device10/)は、Sigfoxモジュールを搭載し、Arduino Uno互換をもった開発ボードであり、基本的な使い方は、[こちら](https://qiita.com/ghibi/items/d80aa646db7223ff770a)で説明していますが、ArduinoからATコマンドのみでメッセージを送信することもできます。
シンプルにSigfox ATコマンドを使ってみたいという方向けにサンプルコードを用いて説明します。

#準備
Sigfox Shield for Arduino (UnaShield)とArduino(Uno)を入手し、無償回線契約（[Sigfox Buy](https://buy.sigfox.com/activate)）を済ませておいてください。

#ATコマンドで動かす
UnaShieldは、ArduinoピンのD4とD5に、通信モジュールとのUARTが割り当てられています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/ae26b645-fc9e-f859-e1c8-fcf89709f92a.png)
ですので、Arduino Unoであれば、SoftwareSerialを用いてATコマンドによる制御が可能になります。D4がUnaShield側の受信（RX）、Arduino側の送信（TX）となります。D5はその逆です。つまり、`SoftwareSerial(5, 4)`ですね。

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

```basic-at.c
#include <SoftwareSerial.h>

#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=0" ,"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. SoftwareSrialでD4/D5ポートを送受にしたシリアル通信とする
2. AT$SFコマンドでSigfoxメッセージ送信

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

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
[Twitter @ghibi](https://twitter.com/ghibi)