JavaScriptでスターウォーズのBB-8を動かす。(Cylon.jsが対応したよ！)


スターウォーズエピソード7皆さんもうみましたか?

![](https://i.gyazo.com/efcfc43282c8c8f64da7c401469dc7cc.png)

スターウォーズシリーズの待望の新作ですね。
今日はこの中で出てくるBB-8をCylon.jsで動かせたのでその話です。

> [`#iotlt`](http://togetter.com/li/925849?page=5)で話した内容の詳細版です。
https://speakerdeck.com/n0bisuke/javascriptdesutauozufalsebb-8wodong-kasitayo-di-11hui-number-iotlt-5fen

## BB-8

スターウォーズエピソード7に出てくるドロイドです。

R2D2やC3POが有名ですが、本作品ではBB-8が活躍します。

![](https://i.gyazo.com/24542c95f399c5a64548f20901a76aef.png)

## Sphero

![](http://orbotix.wpengine.netdna-cdn.com/wp-content/themes/sphero/img/graphic-painting-sphero.jpg)

ロボティクスボールと言われています。
後述するCylon.js(やGobotなど)経由でプログラム制御出来ます。

>参考: [SpheroをGo言語から制御して遊んでみた](http://qiita.com/n0bisuke/items/10aff44c92e752402bea)

## Cylon.js

Node.jsでハードウェア制御するフレームワーク(ライブラリ)です。

この辺りの界隈は英語圏で`JavaScript Robotics`って言っているみたいですね。

過去に`JSオジサン`で[Cylon.jsでIoT](https://speakerdeck.com/n0bisuke/cylon-dot-jsdeiot-di-5hui-number-jsozisan-5fen)、`JS Board Shibuya`で[Cylon.jsの闇](https://speakerdeck.com/n0bisuke/cylon-dot-jsfalsean-di-2hui-number-jsboardshibuya-5fen)という発表もしているので、こちらも参考にして下さい。

![](https://i.gyazo.com/fa99af7480908eecef26bf9d222390e8.png)
![](https://i.gyazo.com/6ca7961bdc2a6849b08490645fd93612.png)



## BB-8とSpheroは基本同じだけど...

**BB-8はSpheroと同メーカーが作っていて基本的にはSpheroと同じ機構です。**
基本的にはSpheroで出来ることはBB-8も出来ます。
なのでCylon.jsで制御できるかと思いきや、 **接続方式が違うみたいです。**

* SpheroはBluetooth
* BB-8はBLE

この違いがあって、Spheroはペアリングする必要があったのですがBB-8はBLEのGATT経由で制御します。

GATTとか分からない人は参考までにこちらをごらんください

> [GoでIoT ~BLE入門してみた話~](https://speakerdeck.com/n0bisuke/godeiot-bleru-men-sitemitahua-go-conference-2015-winter-lt-number-gocon-5fen)

### 接続方式の違いをCylon.jsが吸収してくれました

今まではCylon.jsが対応していなかったので案の定issueが。

![](https://i.gyazo.com/470dc2a2fad68bb68a78224e9b372f7b.png)
https://github.com/orbotix/sphero.js/issues/26


**二日前くらい(2016/1/13)に確認したらBB-8対応したよって話が出てました。**
(正確な時期は分からないですが汗)
https://github.com/hybridgroup/cylon-sphero-ble


ということで Node.jsでBB-8が動かせるようになりました！

##実際に動かしてみます。
購入はAmazonから買えます！
http://amzn.to/1KgydQM

### まずは環境確認

* Mac book pro mid 2014
* Mac OS 10.10
* Node.js v5.3.0

### UUIDを探す

BB-8のUUIDを探します。まずは`cylon-ble`をグルーバルインストールします。

```bash
$ npm i -g cylon-ble
```

`cylon-ble-scan`コマンドが使えるようになるのでsudo実行しましょう。

MacのBluetoothはonにしておいてください。

```
$ sudo cylon-ble-scan

 sudo cylon-ble-scan
Password:
Starting scan.
Peripheral discovered!
  Name: undefined
  UUID: 28f97a8aeb034db4b82c0c3e960fc09e
  rssi: -85
Peripheral discovered!
  Name: undefined
  UUID: bdc6a5526bc24d6f850d47ecccc86ca0
  rssi: -48
Peripheral discovered!
  Name: undefined
  UUID: 10a279a9999d464291b3ab00a4f5e3c1
  rssi: -81
Peripheral discovered!
  Name: BB-XXXX
  UUID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  rssi: -57
  ・
  ・
  ・
  ・
```

Macを起点にして色々な周辺デバイスのUUIDがでてくるので
こんな感じで`BB-XXXX`のような名前とUUIDを探します。`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`って書いたところです。

### サンプルを動かす

UUIDをサンプルコードのUUIDの部分にコピペしましょう。


```bb-8.js
var Cylon = require('cylon');

Cylon.robot({
  connections: {
    bluetooth: { adaptor: 'central', uuid: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', module: 'cylon-ble'}
  },

  devices: {
    bb8: { driver: 'bb8', module: 'cylon-sphero-ble'}
  },

  work: function(my) {
    my.bb8.color(0x00FFFF);

    after(500, function() {
      my.bb8.color(0xFF0000);
    });

    after(1000, function() {
      my.bb8.roll(60, 0);
    });

    after(2000, function() {
      my.bb8.roll(60, 180);
    });

    after(3000, function() {
      my.bb8.stop();
    });
  }
}).start();

```

`colorメソッド`で色指定、`rollメソッド`で移動って感じです。接続した後のこの辺りのメソッドはspheroと同じですね。

実行してみます。

```bash
$ node bb-8.js
```

![](https://i.gyazo.com/d2ee1bd133a385c4eaa27d88ce1f88f3.gif)
動画はこちら。 https://goo.gl/photos/8CxFXMhPSxApWzmr8


**うごきました！！**

感動です

## まとめ

Cylon.jsでBB-8を動かせました。

Node.jsとの連携ができると、Webブラウザ側にコントローラを用意してwebとの連携も簡単にできますね。

`ブラウザ <-> Node.js <-> Sphero`は Milkcocoaで連携確認できているのでサクッといけそうです。

脳波連携してフォースで動かすみたいなことをやりたいですね笑

可能性広がりました。
プログラマブルなBB-8をぜひ使ってみてください :)