Amazon Dash ButtonでPepperを操作してみた。

きっかけはとある相談から始まった。
「次回のIoTLT(IoT縛りの勉強会)をうちの会社でやるんだけど、会場の案内をPepperにやらせられない？」

最初、「話す内容を決めてくれれば、すぐにやれるでしょ。」と安易に思いついたが、長い道のりの始まりだった。

「適当にしゃべるレベルで良いと言われたんだけど、せっかくなので何かIoT的な実装ができたら面白いんだけど、何かアイデアない？」

おいおい、いきなりハードルが上がったじゃないかとツッコミを入れつつ、最近(2016/12/21)買ったAmazon Dash ButtonでPepperを操作するアイデアを思い付いた。

構成：Amazon Dash Button -> 母艦 -> Pepper

検索するとAmazon Dash Buttonをハックしている例はすぐに見つかった。
参考：
Amazon Dash ButtonをただのIoTボタンとして使う
http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4
Amazon Dash Buttonを(正しくない方向で)使ってみた
http://qiita.com/takustaqu/items/8539b33780c9675c8657

Amazon Dash Buttonの初期設定については説明を割愛し、母艦を何にするか模索する旅が始まった。

まず、Pepperは母艦となり得ない(Amazon Dash Buttonからの信号を受信するためにネットワークインターフェイスのプロミキャスモードを利用する必要があり、特権レベルが必要となる)ため、候補として以下を検討した。

・(右) RaspberryPi2 [5V-0.29A]
・(中) Intel Edison [5V-0.09A]
・(左) Wio-Node(ESP8266) [5V-0.04A]
　[ ]内はUSB電圧/電流チェッカーの数値
![IMG_5137.JPG](https://qiita-image-store.s3.amazonaws.com/0/72479/d24050f9-4c76-464f-febf-831bdf264f46.jpeg)
![61tHUvih4VL._SL1094_.jpg](https://qiita-image-store.s3.amazonaws.com/0/72479/e5af72c8-308f-91cb-98dc-ecdb483b7482.jpeg)

Pepperに搭載することを想定して、大きさ、Wi-Fi機能の有無、Pepper SDKの動作可否、消費電力を総合的に考慮して、Intel Edisonで実装する方針とした。

Intel Edisonは単独での使用には難があるため、一般的にはアドオンボードを利用する必要がある。
Breakout Board、Arduino Board、Eaglet、Henry、SparkFun Block等が入手できるが、今回はサイズがコンパクトでIntel Edisonの小ささを最大限に活かせるSparkFun Blockを採用した。

使用したBlockは以下の2つ。
・Base Block　・・・console用とOTG用の2つのmicro USB端子があるBlock。
![51IcWRds6rL.jpg](https://qiita-image-store.s3.amazonaws.com/0/72479/629de2da-de36-27c2-dbf2-a79e08fc64b5.jpeg)

・Battery Block　・・・3.7V 400mAhのリチウムポリマー(LiPo)電池がついたBlock。LiPo電池の充電用micro USB端子がある。
![41NTlsR2bNL.jpg](https://qiita-image-store.s3.amazonaws.com/0/72479/822b54ed-04db-59de-4d85-69ec71aa547b.jpeg)

(参考)
http://matsup.blogspot.jp/2015/02/sparkfunintel-edison-blocks.html

ここで問題が発生し、オリジナルのLiPo電池では容量不足？！なのか、Intel Edisonが起動しない(正確にはBootしてconsoleにはメッセージが表示されるが、OS(Yocto Linux)が起動しない)トラブルに見舞われた。
原因切り分けのため、オリジナルのLiPo電池(DTP 502535)をDTP 603048(3.7V 900mAh)へ換装すべく、半田ゴテを使いオリジナルのLiPo電池を取り外し、JST PHR-2コネクタを装着した。これでLiPo電池を着脱しやすくなった。
![IMG_3629.JPG](https://qiita-image-store.s3.amazonaws.com/0/72479/d2a69c73-cafd-5370-2561-662d95c4ee74.jpeg)

また、注意点として、Base BlockとBattery Blockを重ね合わせる場合、Base Blockのconsole用micro USB端子とBattery Blockの電源端子が干渉してショートする懸念がある(設計不良？！）ためconsole用micro USB端子の上面に絶縁用シール(下記画像の黄色テープ)を貼っておくことをお勧めする。
![IMG_3623.JPG](https://qiita-image-store.s3.amazonaws.com/0/72479/43848b09-cb41-a76d-cd4a-b0a71e261c80.jpeg)

これで母艦(Edison)が用意できたので次にセットアップに入る。

# Edisonの環境準備
1.　最新版のOS(iot-devkit-prof-dev-image-edison-20160606-patch)をインストールする。
(参考)
http://qiita.com/katakurashohei/items/e45c5ace3531af0a8909

2.　パッケージを更新する。
\# opkg update

3.　libpcapパッケージをインストールする。
\# opkg install libpcap-dev

4.　dnsmasqパッケージをインストールする。
Amazon Dash Buttonのエラー終了を早くする対策として、Edison内にDNSサーバを立ててAmazon Dash ButtonからのDNS問い合わせに対してNXDomain応答を返す。
\# opkg install dnsmasq
このままではudhcpdと競合するため、/etc/dnsmasq.confを編集し、dhcp設定(dhcp-****)を全てコメントアウトする。

5.　gitコマンドをインストールする。
パッケージのgitではgit submoduleが使えない旨のエラーが出るため、ソースコードからビルドする。
(参考：Edisonにgit 2.11.0を導入する)
http://qiita.com/tanaka_cpp/items/57661f4b77fe24c6b079

6.　node-dash-buttonパッケージをインストールする。
\# mkdir dash-button
\# cd dash-button
\# npm init
\# npm install node-dash-button --save

7.　app.jsファイルを作成する。
(内容)
　const DashButton = require("dash-button");
　const PHY_ADDR = "YY:YY:YY:YY:YY:YY";
　let button = new DashButton(PHY_ADDR);
　console.log("I'm listening'")
　let i = 0;
　button.addListener(() => {
　　console.log("["+(i++)+"] It works.");
　　const exec = require('child_process').exec;
　　exec('<b>Pepperを操作するコマンド</b>', (err, stdout, stderr) => {
　　　　if (err) { console.log(err); }
　　　　console.log(stdout);
　　});
　　console.log("["+(i++)+"] It is executed.");
　});

* YY:YY:YY:YY:YY:YYはAmazon Dash ButtonのMacアドレス。
* <b>Pepperを操作するコマンド</b>は後述。

8.　母艦(Edison)をアクセスポイント化する。
(参考)
http://qiita.com/taki4416/items/b2acbf84ea4e31893e31
* wpa_supplicantのサービス無効化が失敗する場合は以下を実施する。
\# systemctl mask/unmask wpa_supplicant.service
(参考)
http://alpha.mixi.co.jp/entry/2013/12063/

9.　Wi-Fi APの設定(/etc/hostapd/hostapd.conf)
・SSID、パスワードの設定など。
ssid=EDISON
wpa_passphrase=********
(参考)
http://qiita.com/musubi05/items/4d28ec60d0ba4cdea00c

10.　DHCPの設定(/etc/hostapd/udhcpd-for-hostapd.conf)
・スタティックIPの設定など。
static_lease XX:XX:XX:XX:XX:XX 192.168.42.100 \# Pepper
static_lease YY:YY:YY:YY:YY:YY 192.168.42.200 \# Amazon Dash Button
* XX:XX:XX:XX:XX:XXはPepperのMacアドレス。
* YY:YY:YY:YY:YY:YYはAmazon Dash ButtonのMacアドレス。
(参考)
http://qiita.com/musubi05/items/14758c07652a7de3390d

# Pepper SDK実行環境の準備
いちばん頼りにしていたPython SDK(Python 2.7 SDK 2.4.3 Linux 32)はSegmentation Faultで落ちるため使用できない。
\# python
\>>> import qi
Segmentation Fault

次にJava SDK（Java SDK 2.4.3 Linux 32）を試したところ上手く動作した。
1.　Java SDKをダウンロードする。
下記のリンク先からjava-naoqi-sdk-2.4.3.28-linux32.jarファイルをダウンロードする。
https://community.aldebaran.com/en/resources/software

2.　SayHello.javaファイルを作成する。
(内容)
　import com.aldebaran.qi.Application;
　import com.aldebaran.qi.Session;
　import com.aldebaran.qi.helper.proxies.*;
　public class HelloPepper {
　　public static void main(String[] args) throws Exception  {
　　　Application app = new Application(args,"tcp://192.168.42.100:9559");
　　　try {
　　　　app.start();
　　　　Session session = app.session();
　　　　ALTextToSpeech tts = new ALTextToSpeech(session);
　　　　tts.setLanguage("Japanese");
　　　　tts.say("こんにちは");
　　　} catch (Exception e) {
　　　　e.printStackTrace();
　　　}
　　}
　}

* 192.168.42.100はPepperのIPアドレス。

3.　SayHello.javaをビルドする。
\# javac -cp java-naoqi-sdk-2.4.3.28-linux32.jar SayHello.java
SayHello.java:12: error: unmappable character for encoding ASCII
日本語を含んでいる場合、コンパイルでエラーとなる。

4.　日本語環境に対応する。(日本語ロケールをインストールする。)
(参考)
http://qiita.com/masato_ka/items/5ff0373b7674ae79528d

5.　SayHelloを実行する。
\# java -cp java-naoqi-sdk-2.4.3.28-linux32.jar:. SayHello
Pepperが「こんにちは」としゃべったら正常に動作している。

6.　node app.jsを実行する。
上述のapp.jsの"Pepperを操作するコマンド"部分に5.のSayHello実行コマンドを記述する。
\# node app.js

7.　Amazon Dash Buttonのボタンを押す。
しばらくして、Pepperが「こんにちは」としゃべったらOK。
(動画)
https://youtu.be/FrNixRkH-Fk

IoTLT(IoT縛りの勉強会) Vol.23の当日(2017/1/30)の模様はこちら。
(動画)
https://youtu.be/zoYi96-PUNk
ちなみに、EdisonはPepperの緊急停止ボタンカバーの中にしまってみた。
![IMG_9368.JPG](https://qiita-image-store.s3.amazonaws.com/0/72479/456c873e-243c-aacc-0650-01b4ea01ed08.jpeg)

Amazon Dash Buttonは簡単に使用できますし、EdisonからPepperを操作できるようになったので、今後、いろいろな応用事例が考えられると思います。(例えば、EdisonはBluetooth機能も搭載されているので、PepperからBluetooth機能を利用するなど。)
みなさまの一助になれば幸いです。