iPhoneの加速度センサー値をBLE経由でEdisonに送ってカラーLEDを光らせてみる


いわゆるLチカです.
シンプルだけど、動かすのに何が必要なのかをまとめてみる
Xcode8 (swift3) で少し書き方が変わっているためそのあたりも含め。


LEDとの接続はIntel Edison board for ArduinoのGPIOを利用

# 構成

X軸 Acceralation -> Red
Y軸 Acceralation -> Green
Z軸 Acceralation -> Blue

という具合に、3軸を色にマッピングしてみて、振って遊べるようにする

カラーLEDは手元にあったベストセンサーモジュールキットのものを使用、EdisonからGPIOを利用して光らせる。
EdisonのGPIO番号とMRAAの番号の関連づけは、以下のサイトを参考に。
http://iotdk.intel.com/docs/master/mraa/edison.html



接続は以下のような構成
![edison-iphone-color-led.png](https://qiita-image-store.s3.amazonaws.com/0/92491/75ecff60-9dc4-662e-0219-138fd4be4007.png "edison-iphone-color-led.png")
![IMG_5473.JPG](https://qiita-image-store.s3.amazonaws.com/0/92491/00e17140-18a6-45b0-b8c4-22e7db318f83.jpeg "IMG_5473.JPG")

(最終的な動画では、10kの抵抗を入れてプルダウンしてます..直接つなぐと明るすぎ)

# Edison 側のプログラム
## カラーLEDをランダムに光らせる
まずは、Edison側は PWM を3つ使って、接続したカラーLEDをランダムに光らせる。
BLE経由でiPhoneから受け取ったものを利用するのは次。

Edison側のプログラムはXDKを使って開発。カラーLEDを光らせる。
新規プロジェクトを作成して、main.jsを以下のようにした.


```main.js
var mraa = require('mraa'); //require mraa

var r = new mraa.Pwm(5);
var g = new mraa.Pwm(3);
var b = new mraa.Pwm(6);

r.enable(true);
r.period_us(2000);
r.write(0.5);

g.enable(true);
g.period_us(2000);
g.write(0.5);

b.enable(true);
b.period_us(2000);
b.write(0.5);

periodicActivity();

var count = 0;
function periodicActivity()
{
  setTimeout(periodicActivity,100);
  
  // 乱数で適当に色を生成して設定
  var rcolor = (count*Math.random()*10)%255 / 255;
  var gcolor = (count*Math.random()*10)%255 / 255;
  var bcolor = (count*Math.random()*10)%255 / 255;
  
  r.write(rcolor);
  g.write(gcolor);
  b.write(bcolor);
  
  count ++;
}
```


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">edisonでカラーLED <a href="https://t.co/TFglRElluW">pic.twitter.com/TFglRElluW</a></p>&mdash; Motokazu Nishimura (@motokazu) <a href="https://twitter.com/motokazu/status/789683073868718081">2016年10月22日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


## BLEで待ち受けてカラーLEDを光らせる

こちらのサイトが非常に参考になる。
http://edison-lab.jp/blog/2015/07/lets-make-edison-iphone-ble.html

# edison 側のセットアップ

bluez5-devをインストール

```bash
opkg update
opkg install bluez5-dev
```

bluetoothを有効にする
Bluetoothのソフトがブロックされているため、ブロックを解除する

```bash
rfkill list
rfkill unblock bluetooth
rfkill list
```

コードをセットアップする

```bash
git clone https://github.com/motokazu/led-edison-ble.git
cd led-edison-ble
npm i
node main.js 
stateChange : poweredOn
start advertising ...
```


# 続いて、iOS側のセットアップを行う
iOS側は、加速度センサー値を取得して BLE経由でデータを送る。今回は簡易的にテキストをカンマ区切りで送ることにした。

```データフォーマット
timestamp,acceleration.x,acceleration.y,acceleration.z
```

コードはこちら
https://github.com/motokazu/device-ios-ble
Xcodeでビルドして実機にインストールする

- iOSで加速度センサー値を取得するには、CoreMotionを使う
- iOSでBLEを使うには、CoreBluetooth.frameworkを使う

完成バージョンの動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">BLE経由でLチカ <a href="https://t.co/cPq2RqjpLK">pic.twitter.com/cPq2RqjpLK</a></p>&mdash; Motokazu Nishimura (@motokazu) <a href="https://twitter.com/motokazu/status/789767280850632704">2016年10月22日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


# 途中で出会った問題
開発途中に、iOSからBLE経由で writeValueしてデータを送っていると、すぐに送信が停止してEdisonとの接続がDisconnectとなってしまう問題が発生。

```
writeValue : 4743982319333547688,-0.382124,-0.409589,-14.219012
writeValue : 4743982319333963817,-0.388445,-0.524466,-14.224679
Disconnect!
error: Optional(Error Domain=CBErrorDomain Code=7 "The specified device has disconnected from us." UserInfo={NSLocalizedDescription=The specified device has disconnected from us.})
```

突然 接続が切れる...。

参考ページを見ていたら、"bluetoothdが背後で起動していると blenoに干渉する" と書いてあるのに.. この手順を飛ばしていた。以下を実行すると接続が切れなくなった。

```
killall bluetoothd
hciconfig hci0 up
```