Intel Edison を使って BB-8 のリモコンを作る

# [BB-8](http://starwars.disney.co.jp/movie/force/character/character05.html) とは

STAR WARS シリーズ最新作の『[スター・ウォーズ/フォースの覚醒](http://starwars.disney.co.jp/movie/force.html)』に登場するボール型ドロイドです。[R2-D2](http://starwars.disney.co.jp/movie/force/character/character10.html) の弟分的な、愛くるしいキャラ。

[![bb-8.png](https://qiita-image-store.s3.amazonaws.com/0/10941/5593253e-e0f9-cfd5-0bed-eb551d4741f0.png)](http://starwars.disney.co.jp/movie/force/character/character05.html)

> 物語の重要なカギを握るボール型のドロイド。与えられた任務には一生懸命。

BB-8 のメイキング映像が公式の Facebook ページに上がっています。
https://www.facebook.com/StarWars.jp/videos/1125623990830969/

# [Sphero BB-8](http://www.sphero.jp/starwars/) とは

以前からボール型ロボットを手掛けている [Sphero](http://www.sphero.jp/) 社が『スター・ウォーズ/フォースの覚醒』に合わせて販売した BB-8 の小型ロボット。Sphero 社は、劇中の BB-8 の制作にも技術協力しています。

公式のアプリ（[iOS](https://itunes.apple.com/jp/app/bb-8-app-enabled-droid-powered/id1032845453?mt=8) / [Android](https://play.google.com/store/apps/details?id=com.sphero.bb8&hl=ja)）が出ていて、Bluetooth 経由でアプリから操作します。動いている様子はこんな感じ。
https://www.youtube.com/watch?v=GqCUegO--gY

# リモコンを作りたい

Sphero BB-8 はスマートフォンアプリから操作させることが前提なので、物理的なリモコンは標準で付いてきません。ただ、子どもに遊ばせることを考えたときに、スマホではなく物理的なリモコンで動かしたいところ。

幸い、Sphero のロボットには[各種 SDK](https://developer.gosphero.com/) が用意されているので、自分でプログラミングして操作することができます。BB-8 の通信には BLE が使われているので、Bluetooth 4.0 が使える環境が必要なのですが、Intel Edison を使えば簡単にリモコンが作れそうです。

# Intel Edison とは

[Edison](http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html) はインテル社が販売するシングルボードコンピュータです。Arduino や Raspberry Pi と違い、Wi-Fi や Bluetooth のモジュールがあらかじめ組み込まれているので、無線通信するようなモノづくりに便利です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/10941/03ef9a96-72e1-8f7d-7d40-8af73c815b39.jpeg" width="320">


# 作ったもの

作り方の前に完成品を。こんな感じのものを作りました。手作り感ありますね。

![IMG_2010.jpg](https://qiita-image-store.s3.amazonaws.com/0/10941/0d847c66-ff3c-fb02-bd95-e4c389eb7f6a.jpeg)

![IMG_2008.jpg](https://qiita-image-store.s3.amazonaws.com/0/10941/fbc164df-e7d7-fd90-5a19-2a41de3e818b.jpeg)

![IMG_2006.jpg](https://qiita-image-store.s3.amazonaws.com/0/10941/61fcc6ed-4471-6f7c-3947-39368c9928a2.jpeg)

# 作り方

では作り方を簡単に紹介します。

## 準備物

1. [Sphero BB-8](http://www.amazon.co.jp/dp/B0107H5FJ6)
2. [Intel Edison Kit for Arduino](http://www.amazon.co.jp/dp/B00O9PMEHY)
3. [ブレッドボード](http://akizukidenshi.com/catalog/g/gP-00315/)
4. [ジョイスティック](http://akizukidenshi.com/catalog/g/gM-06807/)
5. [ジャンパーワイヤ](http://akizukidenshi.com/catalog/g/gP-00288/)
6. [9V 乾電池](http://www.amazon.co.jp/dp/B00MH4QM1S/)
7. [9V 乾電池用ジャンパーワイヤ](http://www.amazon.co.jp/dp/B011IJOZZW/)
8. [ピンソケット](https://www.switch-science.com/catalog/995/)
9. ちょうどよい箱

## Intel Edison のセットアップ

### Wi-Fi 設定

まずは、[ここ](http://edison-lab.jp/gettingstarted/edison-arduino/mac/)などを参考にして、Edison を Wi-Fi に繋げるところまでセットアップしてください。

同じ Wi-Fi ネットワークにあるマシンから、

```sh
$ ssh root@[設定した Edison 名].local
```

で、ログインできるようになれば OK です。

### Bluetooth 設定

執筆時の Edison は、出荷状態（バージョン weekly-159.devkit-2.0）で Bluetooth が無効化されていました。無効化されているかどうかは、`rfkill list` というコマンドで確認できます。

無効化されていた場合は `rfkill unblock bluetooth` で有効化してください。

```
root@edison:~# rfkill unblock bluetooth
root@edison:~# rfkill list
0: phy0: wlan
        Soft blocked: no
        Hard blocked: no
1: brcmfmac-wifi: wlan
        Soft blocked: no
        Hard blocked: no
2: bcm43xx Bluetooth: bluetooth
        Soft blocked: no
        Hard blocked: no
4: hci0: bluetooth
        Soft blocked: no
        Hard blocked: no
```

## 回路を組む

ジョイスティックからの入力を Edison で処理するための、シンプルな回路を組みましょう。

- 9V 乾電池のプラス側を Edison の VIN に、マイナス側を GND につなぐ
- Edison の 5V を ジョイスティックの L/R+, U/D+ につなぐ
- Edison の GND を ジョイスティックの GND につなぐ
- ジョイスティックの L/R を Edison の ANALOG IN A0 につなぐ
- ジョイスティックの U/D を Edison の ANALOG IN A1 につなぐ

L/R は Left/Right（横方向）の値、U/D には Up/Down（縦方向）の値が出力されます。

![IMG_2012.jpg](https://qiita-image-store.s3.amazonaws.com/0/10941/5cc9df59-bc77-19a2-5a51-97319c2cfe3e.jpeg)


## プログラムを書く

制御プログラムは JavaScript (Node.js) で書きます。Edison の入出力端子 (GPIO) を制御するライブラリ [mraa](https://github.com/intel-iot-devkit/mraa) が初期状態で入っているのでこれを使います。

加えて、BB-8 を BLE 経由で操作するために、[noble](https://github.com/sandeepmistry/noble) と [sphero](https://github.com/orbotix/sphero.js) の２つのライブラリを npm でインストールします。

```sh
root@edison:~# npm install noble sphero
```

そうしたら制御プログラムを書きましょう。

```sh
root@edison:~# vi bb8.js
```

bb8.js の中身は[こちら](https://gist.github.com/mach/5f2b489d26df6a5e6316)を参照してください。

やっていることは、ジョイスティックの Left/Right, Up/Down の値 (0~1024) から、角度と速度を計算して、`orb.roll(speed, direction);` で100ミリ秒毎に動かしているだけです。

## 動かす

書いたプログラムを、

```sh
root@edison:~# nohup node bb8.js &
```

で実行してみましょう。実行直後に BB-8 のキャリブレーション（正面決め）が始まるので、青い点が自分の目の前になるように BB-8 を置きます。

キャリブレーションが終わると BB-8 は白色に光るようになるので、そうなったらジョイスティックで操作できるはずです。

---

今回はジョイスティックの入力で BB-8 をそのまま操作するだけの単純なものでしたが、色々なセンサー使ったり、もっと複雑なプログラムを書いたりすれば、より面白いことができると思います。