sakura.ioをGenuino 101ではじめた（Lチカ～sakura.io接続テスト）

sakura.ioとGenuino 101のBluetoothを組み合わせて使ってみると楽しそう
その前に、LチカのBlinkとSakuraIOのStandardサンプルスケッチを書き込んでみた。

#sakura.ioとは？
> モノとネットワークでデータを送受信するための「さくらの通信モジュール」（以下、「通信モジュール」）、通信環境、データの保存や連携処理に必要なシステムを一体で提供するIoTのプラットフォーム
https://sakura.io/

# 必要な部品を準備する
* [さくらの通信モジュール](https://www.amazon.co.jp/dp/B06Y5LM4RQ)
    * 1x 本体
    * 1x アンテナ接続用ケーブル（付属）
    * 1x 専用アンテナ（付属）
* [Arduinoシールド](https://www.amazon.co.jp/dp/B06Y5Y6Y2Z)
    * 1x 本体
    * 2x 2.0mmジャンパピン（付属）
* Genuino 101
    * 1x 本体
* その他購入が必要なもの
    * 1x USB A-MiniAケーブル
    * 1x ジャンパーコード
    * 1x LED 3V程度

# Hello, World. Lチカする

## ハードウェア

### さくらの通信ジュールにアンテナを接続する
さくらの通信モジュールの空中線コネクタのMain antennaコネクタ及びSub antennaコネクタにアンテナ接続用ケーブルを両方とも取り付けます。アンテナ取り付けケーブルはそれぞれどちらに接続してもかまいません。

![antenna.png](https://qiita-image-store.s3.amazonaws.com/0/95231/e76bc32f-fb52-f51f-1ccf-4889bec29d25.png)


アンテナ接続用ケーブルにネジを回す要領でアンテナを取り付けます。

### さくらの通信モジュールをArduinoシールドに取り付ける
さくらの通信モジュールとArduinoシールドのHost interfaceコネクタ（基板間コネクタ）を接続します。

### ArduinoシールドをGenuino 101に取り付ける
シールドとGenuinoのピンが合わさるように取り付けましょう。

### LEDを取り付ける
LEDを取り付けます。LEDの足が長いほうがアノードなのでデジタル13ピンに、足の短いほうのカソードをグラウンド/GNDに接続します。

![led.jpg](https://qiita-image-store.s3.amazonaws.com/0/95231/ff49633a-85c8-d046-ef92-faddfbb19554.jpeg)

## ソフトウェア

### Arduino IDEをインストール

https://www.arduino.cc/en/main/software

### Arduino IDEにSakuraIOライブラリをインストール
1. *Sketch->Include Library->Manage Libraries...*で遷移し、*Library Managerを開く*
1. 検索窓に**sakuraio**を入力し、*SakuraIO*をインストール

![sakuraio.png](https://qiita-image-store.s3.amazonaws.com/0/95231/4b705e79-fa62-89bf-a466-fa1bd9b4fdd1.png)

### Arduino IDEにGenuino 101ボードをインストールする
1. *Tools->Board: "..."->Boards Manager...*で遷移し、*Boards Manager*を開く
1. 検索窓に**Genuino 101**を入力し、*Intel Curie Boards*をインストール

![curie.png](https://qiita-image-store.s3.amazonaws.com/0/95231/f65f75c0-aa55-7892-9a51-cf5df2e87ad9.png)

### ソフトウェアを書き込む
1. ボードとPCをUSBで繋いで起動したら、*Tools->Boards: "..."->Arduino/Genuino 101*でボードを選択
1. *Tools->Port->COMポート*で接続したArduinoデバイスを選択
1. *File->Examples->Builtin-Examples 01.Basics->Blink*でサンプルスケッチを開く
1. アップロードアイコンをクリックまたは Ctrl + U でスケッチを書き込みます。

````cpp:blink.ino
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}
````

## 完成

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/95231/d4431880-ac81-fd5c-bcee-22483c891911.jpeg)

LEDを1秒点灯、1秒消灯を繰り返します。

# sakura.ioサンプルスケッチを動かしてみる

## sakura.ioプラットフォーム操作

### sakura.io管理画面でモジュールを登録する

「プロジェクト追加」で名称を入力し、「モジュールの追加」で登録用IDと登録用パスワードと名称を入力し、先ほど追加したプロジェクトをプロジェクトの一覧から選択して追加しましょう。

### sakura.ioのWebSocket連携サービスを有効にする

管理画面のプロジェクト一覧からWebSocketを有効にしたいプロジェクトの「サービス追加」をクリックし、「追加サービスの選択」からWebSocketを選択し、名称を入力して追加します。連携サービスに先ほど追加したWebSocketが登録されているのを確認できたら完了です。

## ハードウェア

### Arduinoシールドに電源を供給する
ACアダプターから電源をとる際は必要ないのですが、USBのみから給電する場合シールドへ電源の供給が行われないため、5VとVINをつなぎGenuino 101の5VをArduinoシールドのVINに供給します。

![wire.jpg](https://qiita-image-store.s3.amazonaws.com/0/95231/e68b2f55-98c7-f872-327c-66d3f16aac3b.jpeg)

### ArduinoシールドのI2C接続を有効にする
さくらの通信モジュールュールのI2C信号とArduinoのI2C信号を接続するためにArduinoシールドのI2C接続用ジャンパを取り付けます。図のように接続することでSDA1/SCL1に接続します。

![i2c.png](https://qiita-image-store.s3.amazonaws.com/0/95231/128c80bb-7afa-17b3-c0f8-b65f26464ed5.png)

NOTE: https://sakura.io/developer/pdf/sco-ard-01_manual_latest.pdf[Arduinoシールド取扱説明書]

## ソフトウェア

### ソフトウェアを書き込む

ボードとPCをUSBで繋いで起動したら、*Tools->Boards: "..."->Arduino/Genuino 101*でボードを選択。

*Tools->Port->COMポート*で接続したArduinoデバイスを選択。

*File->Examples->SakuraIO->Standard*でサンプルスケッチを開く。

*Sketch->Include Library->Wire*をインポートします。Wire.hをインポートすることでI2Cを有効にします。

```cpp
#include <Wire.h>
```

Wire.hを使うための`Wire.begin()`関数を`Serial.begin()`関数の後ろに挿入します。

```cpp
  Wire.begin();
```

`setup()`はこのようになります。

```cpp
#include <Wire.h>

#include <SakuraIO.h>

//SakuraIO_SPI sakuraio(10);
SakuraIO_I2C sakuraio;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.print("Waiting to come online");
  for(;;){
    if( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break;
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
}
```

アップロードアイコンをクリックまたは Ctrl+U でスケッチを書き込みます。

```cpp:blink.ino
#include <Wire.h>

#include <SakuraIO.h>

//SakuraIO_SPI sakuraio(10);
SakuraIO_I2C sakuraio;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.print("Waiting to come online");
  for(;;){
    if( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break;
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
}

uint8_t counter = 0;

void loop() {
  counter++;

  Serial.println("");
  Serial.println(counter);

  uint8_t request[33] = {};
  uint8_t response[33] = {};

  // Echoback
  request[0] = counter;
  sakuraio.echoback(1, request, response);
  Serial.print(request[0]);
  Serial.print(" -> ");
  Serial.println(response[0]);

  // Unixtime
  uint32_t unixtime = (uint32_t)(sakuraio.getUnixtime()/1000UL);
  Serial.print("Unixtime ");
  Serial.println(unixtime);

  // ADC
  uint16_t adc;
  adc = sakuraio.getADC(0);
  Serial.print("ADC0 ");
  Serial.println(adc);
  adc = sakuraio.getADC(1);
  Serial.print("ADC1 ");
  Serial.println(adc);

  // ProductID
  uint16_t pid = sakuraio.getProductID();
  Serial.print("PID ");
  Serial.println(pid);

  // UniqueID
  sakuraio.getUniqueID((char *)response);
  Serial.print("UID ");
  Serial.println((char *)response);

  // Version
  sakuraio.getFirmwareVersion((char *)response);
  Serial.print("Ver ");
  Serial.println((char *)response);

  // Connection Status
  uint8_t connectionStatus = sakuraio.getConnectionStatus();
  Serial.print("Status ");
  Serial.println(connectionStatus);

  //getSignalQuality
  uint8_t signalQuality = sakuraio.getSignalQuality();
  Serial.print("Quality ");
  Serial.println(signalQuality);


  // Tx Queue
  uint8_t ret;
  ret = sakuraio.enqueueTx((uint8_t)0, (int32_t)counter);
  Serial.print("Enqueue ");
  Serial.println(ret);

  uint8_t avail;
  uint8_t queued;
  sakuraio.getTxQueueLength(&avail, &queued);
  Serial.print("Tx Available=");
  Serial.print(avail);
  Serial.print(" Queued=");
  Serial.println(queued);

  if(queued >= 30){
    ret = sakuraio.clearTx();
    Serial.print("Clear ");
    Serial.println(ret);
  }else if(queued >= 5){
    ret = sakuraio.send();
    Serial.print("Send ");
    Serial.println(ret);
  }

  // Rx Queue
  sakuraio.getRxQueueLength(&avail, &queued);
  Serial.print("Rx Available=");
  Serial.print(avail);
  Serial.print(" Queued=");
  Serial.println(queued);

  for(uint8_t i=0; i<queued; i++){
    uint8_t channel;
    uint8_t type;
    uint8_t values[8];
    int64_t offset;
    ret = sakuraio.dequeueRx(&channel, &type, values, &offset);
    Serial.print("Dequeue ");
    Serial.print(ret);
    if(ret == 0x01){
      Serial.print(" ch="); Serial.print(channel);
      Serial.print(" type="); Serial.print((char)type);
      Serial.print(" values=[");
      for(uint8_t b=0; b<7; b++){
        Serial.print(values[b]);
        Serial.print(" ");
      }
      Serial.print(values[7]);
      Serial.print("] offset="); Serial.println((int32_t)offset);
    }else{
      Serial.println(" ERROR");
    }
  }

  delay(5000);
}
```

## 完成

*Tools->Serial Monitor* Ctrl+Shift+M でシリアルのログを見てみましょう。

```
241
241 -> 241
Unixtime 1497510704
ADC0 2282
ADC1 1770
PID 1
UID 16A0100470
Ver v1.2.1-170425b-cd8cace
Status 128
Quality 5
Enqueue 1
Tx Available=28 Queued=4
Rx Available=32 Queued=0

242
242 -> 242
Unixtime 1497510709
ADC0 2319
ADC1 1702
PID 1
UID 16A0100470
Ver v1.2.1-170425b-cd8cace
Status 128
Quality 5
Enqueue 1
Tx Available=27 Queued=5 <1>
Send 1 <2>
Rx Available=32 Queued=0

243
243 -> 243
Unixtime 1497510714
ADC0 2319
ADC1 1727
PID 1
UID 16A0100470
Ver v1.2.1-170425b-cd8cace
Status 128
Quality 5
Enqueue 1
Tx Available=31 Queued=1 <3>
Rx Available=32 Queued=0
```
<1> キューを5まで貯める
<2> 送信
<3> キューのカウントがリセットされた

sakura.ioのコントロールパネルのWebSocketログを確認して、プラットフォームにデータが到達しているか確認してみましょう。

sakura.io管理画面のモジュールが登録されているプロジェクトにあるWebSocket連携サービスを開きます。

![b.jpg](https://qiita-image-store.s3.amazonaws.com/0/95231/513a765d-73d9-d1a8-8841-b44e4364708f.jpeg)

しばらく待っていると、データが25秒ごとに5つずつ到達しているのが確認できます。