Arduino の BLE で Lチカしてみる

# 目的
　はじめて Arduino を触ったので、開発環境構築～動作まで記録します。BLE（Bluetooth Low Energy）経由で通信＆Lチカしました。

# 準備
## H/W
- [Genuino 101](https://www.switch-science.com/catalog/2670/)
    - BLE・加速度・ジャイロ付き
    - Genuino とは Arduino と会社が分裂してすったもんだで 2 ブランドできたようなので、同じものと覚えてよさそう
    - ￥4,980
- LED
- USB A-B ケーブル
    - なんで B なんだろう… Type-C かせめて Micro がいい…

## S/W
- 開発 PC(OS問わず)
    - [Arduino](https://www.arduino.cc/en/Main/Software) IDE 1.8.1
        - Board Manager から Intel Curie Boards を Install しておく
- 操作端末（Android / iOS)
    - [nRF Connect for Mobile](https://www.nordicsemi.com/eng/Products/Nordic-mobile-Apps/nRF-Connect-for-mobile-previously-called-nRF-Master-Control-Panel)
        - Bluetooth デバイスに接続したりするもの

# 実装
## ブレッドボード図
　作図ソフトの [Fritzing](http://fritzing.org/download/) を使ってみたかっただけの図。
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/4c8f90e7-7ae6-1197-a762-c86a2eb6ad8d.png)

　[Circuits](https://circuits.io/circuits/) というオンライン作図サービスもありました。

## 仕様
- IN -> OUT
    - BLE:0 -> LED オフ
    - BLE:1 -> LED オン
    - BLE:n(n>1) -> LED n ミリ秒でチカチカ

## ソース
　CurieBLE > LED のサンプルスケッチ があるのでソースを見なくたって実行できてしまうんだけれど、それだけじゃつまらないので写経して一部修正した。

```cpp
#include <CurieBLE.h>
BLEPeripheral blePeripheral;
BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service
BLEUnsignedCharCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite); // カスタムUID

const int ledPin = 13; // 13ピンを設定
void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  blePeripheral.setLocalName("helloBLE"); // ペリファラルにデバイス名（UUID）設定
  blePeripheral.setAdvertisedServiceUuid(ledService.uuid());
  blePeripheral.addAttribute(ledService);
  blePeripheral.addAttribute(switchCharacteristic);
  // set the initial value for the characeristic:
  switchCharacteristic.setValue(0);
  blePeripheral.begin(); //アドバタイジング開始
  Serial.println("BLE LED Peripheral");
}

void loop() {
  bool isBlink = false;
  int blinkDelayMilliSec = 1000;
  
  BLECentral central = blePeripheral.central(); //Listen
  if (central) { //セントラルに接続されたら
    Serial.print("Connected to central: ");
    Serial.println(central.address()); //MACアドレス表示

    while (central.connected()) { //セントラルが接続中なら
      // Characteristic書き込みで分岐
      if (switchCharacteristic.written()) {
        if(switchCharacteristic.value() == 1) {
          Serial.println(F("LED on"));
          digitalWrite(ledPin, HIGH); //HIGH = 5V = LEDオン
          isBlink = false;
        } else if(switchCharacteristic.value() > 1){
          Serial.println(F("LED blink"));\
          Serial.println(switchCharacteristic.value());
          blinkDelayMilliSec = switchCharacteristic.value();
          isBlink = true; //チカチカ
        } else { // 0 とかなら
          Serial.println("LED off");
          digitalWrite(ledPin, LOW); //LOW = 0V = LEDオフ
          isBlink = false;
        }
      }
      if (isBlink) { //チカチカ時
      Serial.println(F("LED blining"));
         digitalWrite(ledPin, HIGH);
         delay(blinkDelayMilliSec);
         digitalWrite(ledPin, LOW);
         delay(blinkDelayMilliSec);
      }
    }
    // セントラル切断
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
  }
}
```

# 結果
nRF Connect から接続して Write Value すると、、、

![image](https://qiita-image-store.s3.amazonaws.com/0/130874/efd5fb5f-b519-7b98-4b2c-c0c51f7b2330.png)

チカる！
![2017-02-25_18_25_50.gif](https://qiita-image-store.s3.amazonaws.com/0/130874/a43b2ba0-60ea-d1de-b61f-8f0fa567a8d6.gif)

楽しい！！！

# 参考リンク
[Arduino - Genuino101CurieBLELED](https://www.arduino.cc/en/Tutorial/Genuino101CurieBLELED)
[Genuino 101 の BLE 機能を試す ｜ Developers.IO](http://dev.classmethod.jp/hardware/ble-genuino-101/)
[Genuino (Arduino) 101 で BLE 経由でLチカさせる - Qiita](http://qiita.com/hotchpotch/items/79bca9ec00e969a0c44a)
[BLEのデバッグツールまとめ - Qiita](http://qiita.com/tomoya0x00/items/28c3b92abbc3b0983178)