SMK製Sigfox Breakout Board (EM-WF931-02F) を使ってみる

SMKから[Sigfox Breakout Board (EM-WF931-02F)](https://www.smk.co.jp/products/EM-WF931-02F/)がリリースされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/b05a0f54-4f89-de2a-cf2a-66b524ed5bcf.png)
[WF931](https://www.smk.co.jp/products/series_outline/RF_Modules/?karamu=seihin_mei&sort=asc&no=10&youto=null&tp=0&sid=13321&)というSigfoxモジュールをベースとした評価ボードで、SONYのSPRESENSEとピン互換があります。[こちら](https://github.com/SMK-RD/WF931-Sigfox-module)にSPRESENSE Arduino用のサンプルコードもあるので、SPRESENSEをお持ちの人は簡単に試してみることができるでしょう。
ここでは、SPRESENSEを持っていない方（でも、Arduinoならあるよ）という方向けの使用方法をまとめます。

#Devkitとしてデバイスを登録する
EM-WF931-02FもDevkitとして登録されていますので、[こちら](https://qiita.com/ghibi/items/5893923b44f1757294e9)の参考にして登録してもらえれば、1年間の無料回線込みでお使いいただけます。

#ハードウェア構成
EM-WF931-02Fは、WF931モジュールとチップアンテナが内蔵されていますが、半田ジャンパーで外部アンテナに切り替えることも可能です。
外観とピン配置は下図のようになっており、まず簡単に通信を確認するだけであれば、CN1_1(GND)とCN2_3(VDD)で電源供給、CN1_2(RX0)とCN1_3(TX0)でATコマンド制御、あとは、CN1_6(Reset)ピンに対して、起動時にリセットをかけた方が良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/ed0c58e2-7cba-fe3c-c97f-4caf039ca3c3.png)

#Arduinoと接続
手持ちのArduino（ここではArduino Uno）と下図のように配線します。
![smk.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/193d6372-2e36-3158-a0b2-b0accbc4f49d.jpeg)
参考に配線例を下記に示します。

|EM-WF931-02F|Arduino Uno|
|:-----------|:----------|
|CN1_1|GND|
|CN1_2(RX0)|D9|
|CN1_3(TX0)|D8|
|CN1_6(RESET)|D2|
|CN2_3(VDD)|V3.3|

##Arduinoスケッチサンプル
上記配線にあわせたサンプルスケッチは下記の通りとなります。Software Serialのポートやリセット用のPIN（PIN_RESET）に関しては、ご自身の配線にあわせて変更していただければ結構です。
このサンプルでは、デバイスIDとPACコードを表示、その後、メッセージをSigfoxクラウドに送信する例となっています。

```WF931.c
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 9); // RX, TX
#define PIN_RESET 2

void setup() {
  Serial.begin(9600); // PC-Arduino間のシリアル
  while (!Serial) {;}
  mySerial.begin(9600); // ソフトウェアシリアル(Arduino-EM-WF931-02F間)

  // Configure reset pin
  pinMode(PIN_RESET, OUTPUT);

  // Do reset
  digitalWrite(PIN_RESET, LOW);
  delay(1000);

  // Release reset
  digitalWrite(PIN_RESET, HIGH);
  delay(1000);
  result();

  atcommand("AT$ID?");
  atcommand("AT$PAC?");
  atcommand("AT$SF=0123456789ABCDEF");
}

void atcommand(String cmd){
  mySerial.write("0x00");
  delay(50);
  Serial.println(">" + cmd);
  mySerial.println(cmd);
  delay(100);
  result();
}

void result(){
  char c;
  if (mySerial.available()) {
    do{
      c = mySerial.read();
      Serial.write(c);
      if(c==0xFF){
        Serial.println("Error!");
        return;
      }
    }while(c!='\r');
    // for LF
    Serial.write(mySerial.read());
  }
}

void loop() {
  if (mySerial.available()) Serial.write(mySerial.read());
  if (Serial.available()) mySerial.write(Serial.read());
}
```

>ATコマンドを投げる前に"0x00"を送ってあげるのが、この評価ボードのマナーなのかと思います。（定かではありませんが、0x00なしでは、ATコマンドを受け付けませんでした。

###ATコマンド例
EM-WF931-02FもSigfoxの標準的なATコマンドを受け付けるようですが、`AT?`コマンドは何も返してきませんでした。

|ATコマンド|内容|
|:--------|:---|
|AT$ID?|デバイスIDの取得|
|AT$PAC?|PACコードの取得|
|AT$SB|バイトメッセージ送信コマンド|
|AT$SF|メッセージ送信コマンド|

通信に成功すれば、SigfoxクラウドのDevice-Messages画面で受信メッセージを確認することができます。

#EM-WF931-02Fの入手方法
[フルタカパーツオンライン](https://www.furutaka-netsel.co.jp/maker/smk/em-wf931-02f.html)で取り扱いがあるようです。

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)