LED電球をマイコン（Intel Edison）から制御する(1)

市販されているLED電球には，Bluetooth経由で色を変えたり音を鳴らすことのできるものがあります．通常は付属のスマートフォンアプリから制御しますが，マイコン（Intel Edison）からの制御にチャレンジしました．

# そもそものきっかけ

昨年末，IT系開発コンテスト[MashupAwards](http://mashupaward.jp/)に参加しました．参加2回目の今回はAI（チャットボット）とセンサを使ったIoTトイレシステムを製作・応募しました（[関連記事](http://jp.techcrunch.com/2016/12/28/masupawards2016/)）．システムの機能の一つには「見守り」機能があり，トイレが長すぎるとボットが「大丈夫？」と声をかけたり，蓋が空きっぱなしだと「空きっぱなしじゃない？」と注意を促したりします．

この音声案内機能を実現するにあたり，単機能のBluetoothスピーカーに代わりスピーカー機能付きのLED電球を利用したのですが，「電源の取り回しが楽になる」「トイレの天井に設置でき音が通りやすい」というメリット以外にも，「話し言葉に合わせて色を変える（例：注意を促す場合は黄色）」など面白い使い方ができました．

制御可能なLED電球というと真っ先にPhilipsのHueが浮かびますが，光しか制御できないHueに対して，音・光の双方を制御できるBluetooth接続タイプのLED電球はアートなどより面白い使い方ができるのではと思いましたので，ここにその制御方法をまとめておくことにしました．

# やりたいこと

![slide.png](https://qiita-image-store.s3.amazonaws.com/0/156705/c27031cb-ecc4-a242-74e3-f16264d52404.png)

- 1stステップ : マイコンからコマンドを打って制御
- 2ndステップ : マイコン上でプログラムを動かして制御

この記事ではまず1stステップまでを，以降の記事で2ndステップを書きます．

# 環境

- [Intel Edison](https://www.switch-science.com/catalog/1956/)
    - スイッチサイエンスにてBreakout Boardとのセットを購入，購入時10,000円程度．
- [MiPow PLAYBULB color Smart LED](http://www.playbulb.com/en/playbulb-color.html)
    - [Amazon](https://www.amazon.co.jp/gp/product/B00PVKR8R2/)にて購入，購入時7,000円程度．
    - Bluetooth（正確にはBluetooth LE）で制御可能

![DSC_0203.JPG](https://qiita-image-store.s3.amazonaws.com/0/156705/cf028ff7-15f1-bd58-3956-4b49a6cac5bf.jpeg)

LED電球としてMiPow PLAYBULBを使いました（本体にはBT100というモデル名が印字あり）．実はこれ以外にも別機種のBluetooth制御型LED電球をいくつか試したのですが，通信プロトコルが解析できず制御に至りませんでした．

またマイコンとしてはUSBバッテリーで動かせ，取り回しのよいIntel Edisonを使いました．試してはいませんが，Raspberry Pi 3や，PCなどでも同様の制御を実現できるのではないかとおもいます．
 
# 制御までの手順

## [1] マイコン（Edison）側のBluetooth準備

Intel EdisonのWifiなどはセットアップ済みのものとします（好みで[こちら](http://qiita.com/hishi/items/47e15c7f1b398357a8e2)の設定も）．ファームウェアバージョンは以下．

```
root@edison:~# uname -a
Linux edison 3.10.98-poky-edison+ #1 SMP PREEMPT Mon Jun 6 14:32:08 PDT 2016 i686 GNU/Linux
```

あわせてBluetoothも有効化しておきます．なお，Edisonを再起動すると再度無効化されてしまうので，
[これ](http://rwx.io/blog/2015/02/18/seting-up-an-edison/)を参考に起動時に自動で有効化されるように設定しました．

```
root@edison:~# rfkill unblock bluetooth
root@edison:~# rfkill list
...
2: bcm43xx Bluetooth: bluetooth
        Soft blocked: no
        Hard blocked: no
```

## [2] LED電球（PLAYBULB）の接続確認

LED電球をソケットにさし，スマートフォン用PLAYBULB専用制御アプリから色変更ができるところまでは確認できているものとします．まずはIntel EdisonのコンソールからPLAYBULBが見えているかどうか確かめます．

```
root@edison:~# bluetoothctl 
[NEW] Controller 98:4F:EE:04:28:48 edison [default]
[bluetooth]# scan on
Discovery started
[CHG] Controller 98:4F:EE:04:28:48 Discovering: yes
[NEW] Device DB:22:4B:13:AC:E6 PLAYBULB COLOUR LED    <-- LED電球機能
[NEW] Device AC:E6:4B:13:E4:9F PLAYBULB COLOUR        <-- スピーカー機能
```

PLAYBULBはLED電球とスピーカー2つの機能をもつのでDeviceとしても2つ確認できます．LED電球側のアドレスをメモしておきます．

## [3] gatttoolsのインストール

次に制御に必要なツール（gatttools）をIntel Edisonにインストールします．

Bluetoothには各種デバイスに合わせたプロファイル（マウスやキーボードであればHIDプロファイル，音声であればA2DPプロファイルなど）が用意されていますが，PLAYBULBではBluetooth LEにおける標準的なプロファイルであるGeneric Attribute Profile（GATT）を使って制御を行います．
[Intel Edison上でgatttoolsを使う解説記事](https://software.intel.com/en-us/articles/using-the-generic-attribute-profile-gatt-in-bluetooth-low-energy-with-your-intel-edison)が公式サイトににありますのでこの通りで問題ありません．参考までに手元のコマンドを載せておきます．

```
root@edison: wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.43.tar.xz
root@edison: tar -xf bluez-5.43.tar.xz
root@edison: cd bluez-5.43
root@edison: ./configure --prefix=/usr/local --disable-systemd -disable-udev
root@edison: make
root@edison: make install
root@edison: cp ./attrib/gatttool /usr/local/bin
root@edison: export PATH=$PATH:/usr/local/bin
root@edison: gatttool 
Usage:
  gatttool [OPTION...]
...
```

今後頻繁に利用するので/usr/local/binにコピーしパスを通しておきました．

## [4] 制御してみる

Bluetooth LE GATTプロファイルでの機器制御について私は

- 特定のハンドル（Attribute Handleというアドレスのようなもの）に
- 特定の制御データを書き込む/読みだす

というイメージでとらえています．まずは電球の色を変えてみます．
`gatttool -b`後には先ほど`bluetoothctl`にて調べたLED電球側のアドレスを指定します．

```
root@edison:~# gatttool -b DB:22:4B:13:AC:E6 -I
[DB:22:4B:13:AC:E6][LE]> connect
Attempting to connect to DB:22:4B:13:AC:E6
Connection successful
[DB:22:4B:13:AC:E6][LE]> char-write-cmd 0x001b 00ff0000  <-- 赤
[DB:22:4B:13:AC:E6][LE]> char-write-cmd 0x001b 0000ff00  <-- 緑
[DB:22:4B:13:AC:E6][LE]> char-write-cmd 0x001b 000000ff  <-- 青
...
```

![DSC_0036.png](https://qiita-image-store.s3.amazonaws.com/0/156705/a92072ea-b40c-bb90-1be4-d5ea4cc1e3e6.png)


色が変わりましたか？上記では色の制御を行うハンドル（0x001b）に4byteのデータを書き込むことで制御を行っていますが，これ以外にも点滅パターンなどを指定できます．以下に対応表を載せておきます．

### 点灯モード（0x001b）

| Byte | Effect |
|:-:|:--|
| 0 | **Whiteレベル** |
| 1 | **Redレベル**  |
| 2 | **Greenレベル** |
| 3 | **Blueレベル** |

### 点滅・フェードモード（0x0019）

| Byte | Effect |
|:-:|:--|
| 0 | Reserve? |
| 1 | **Redレベル（単色時）**  |
| 2 | **Greenレベル（単色時）**  |
| 3 | **Blueレベル（単色時）**  |
| 4 | **0x00 : 単色点滅<br>0x01 : 単色フェード<br>0x02 : レインボー点滅<br>0x03 : レインボーフェード** |
| 5 | Reserve?  |
| 6 | **エフェクトスピード(0x00最速)** |
| 7 | Reserve?  |

**注意**：この対応表は公式に配布されているものではなく独自に解析を行い割り出したもののため，間違っていたりモデルによって変わる可能性がありえます．また製造者の意図しないパラメータを設定してしまい製品にダメージを与える可能性がありえます．あくまでも自己責任で行ってください．

# まとめ

Bluetooth LE GATTプロファイルにのっとり制御コマンドを送信することで，LED電球（PLAYBULB）をマイコン（Intel Edison）から制御できるようになりました．

ただ，上記の方法では制御のためにいちいちコマンドを打たねばならず応用がききません．次は，プログラミング言語（Python）をつかっての制御にチャレンジします．