Arduino M0ベースのSigfoxモジュールを触ってみた

RC3(日本)対応のArduino + Sigfoxボードとして台湾の[Might Electric](http://www.might.com.tw/)社がリリースしたMTDuinoを触ってみました。

#MTDuino-SFM2CWW001
MTDuinoは、Atmel SAMD21 32-bit Cortex-M0コアとSigfoxモジュールを搭載したArduinoボードで、大きさは、67mm x 25mmとなっています。カタログは[こちら（GitHub)](https://github.com/Mighty-Net/MTDuino/blob/master/SFM2CWW001/MTDuino-SFM2CWW001.pdf)からダウンロードしてください。対応周波数に920MHz帯は書かれていませんが、あります。（RC3を指定してもらうと良いかと）
![IMG_2272.jpg](https://qiita-image-store.s3.amazonaws.com/0/172313/cbca89f0-036c-533a-8e75-3a269d7f1684.jpeg)
microUSB端子が付いていますので、こちらからPCと接続して開発という感じになります。
##Arduino IDEの設定
Arduino IDEのボードマネージャで**Arduino SAMD Boards(32-bits ARM Cortex-M0+)**をインストールしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/0802317c-119d-57b0-8cda-8ee7198a0637.png)

MTDuinoとPCを接続、Arduino IDEで
- ボード:Arduino M0 Pro (Native USB Port)
- シリアルポート: COMx (Arduino M0 Pro (Native USB Port))
- 書込装置: Atmel-ICE
と設定します。
![arduino_mtduino.png](https://qiita-image-store.s3.amazonaws.com/0/172313/217417dd-83aa-605c-3063-9d610d91d615.png)

##Arduinoプログラミング
ユーザーマニュアル及びサンプルコードはMight社がGitHubにアップしていますので、[こちら(https://github.com/Mighty-Net/MTDuino)](https://github.com/Mighty-Net/MTDuino)からダウンロードして使ってもらえばよいですが、そのままではSigfoxメッセージ送信コマンドでエラーになってしまう可能性があるので、その場合は下記コードをお試しください。

``` SIGFOX_Send_initial_RF.ino
#include <Arduino.h>                  // required before wiring_private.h
#include "wiring_private.h"           // pinPeripheral() function
int LED_POW=3;                        // sigfox status LED pin D3
int RF_PWEN=5;                        // sigfox power control pin D5

unsigned long previousMillis = 0;    // Time Counter
const long interval = 2000;          // Unit: ms. 

void setup() {
  SerialUSB.begin(9600);         // Set Terminal Baudrate: 9600bps
  Serial1.begin(9600);           // Set sigfox Baudrate:9600bps
  pinMode(LED_POW,OUTPUT);       // Set LED_POW pin as output
  pinMode(RF_PWEN,OUTPUT);       // Set RF_PWEN pin as output
  digitalWrite(LED_POW,HIGH);    // Set LED_POW to High
  digitalWrite(RF_PWEN,HIGH);    // Set RF_PWEN to High, and Sigfox module power ON
  delay(3000);
  sigfox_atcommand_tx("AT$O=1,3\r");
  delay(100);
}
void loop()
{
  unsigned long currentMillis = millis();
   //sigfox AT Command
  if (currentMillis - previousMillis >= interval)
  {
    sigfox_atcommand_tx("AT$RCZ?\r");        //sigfox AT Command: get RCZ
    sigfox_atcommand_tx("AT$ID?\r");         //sigfox AT Command: Get ID
    sigfox_atcommand_tx("AT$PAC?\r");        //sigfox AT Command: Get PAC
    delay(100);
  
    previousMillis = currentMillis;
    sigfox_atcommand_tx("AT$SF=1234AB\r");     // Send Data to backend function
  }
}

void sigfox_atcommand_tx(char *wBuffer)   
{
  Serial1.print(wBuffer);                    // Send Data to backend                 
  sigfox_atcommand_rx();                     // Get feedback and show on Terminal function
}

void sigfox_atcommand_rx()
{
  char temp;
  while(Serial1.available() <= 0);
  while(Serial1.available() > 0)
  {
    temp = Serial1.read();
    SerialUSB.print(temp);
    delay(10);
  }
}
```
最後に、使用しているSigfox ATコマンドを説明しておきます。

|ATコマンド|説明|
|:--------|:---|
|AT$RCZ?|モジュールのRC確認（日本ではRC3）|
|AT$ID?|SigfoxデバイスIDの確認|
|AT$PAC?|Sigfox PACコードの確認（工場出荷時の情報であり、一度でもSigfoxクラウドにデバイス登録するとPACは切り替わります|
|AT$SF=...|データ送信（最大12バイトを16進表記）|

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