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

  • 15
    いいね
  • 0
    コメント

きっかけはとある相談から始まった。
「次回の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
61tHUvih4VL._SL1094_.jpg

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

・Battery Block ・・・3.7V 400mAhのリチウムポリマー(LiPo)電池がついたBlock。LiPo電池の充電用micro USB端子がある。
41NTlsR2bNL.jpg

(参考)
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

また、注意点として、Base BlockとBattery Blockを重ね合わせる場合、Base Blockのconsole用micro USB端子とBattery Blockの電源端子が干渉してショートする懸念がある(設計不良?!)ためconsole用micro USB端子の上面に絶縁用シール(下記画像の黄色テープ)を貼っておくことをお勧めする。
IMG_3623.JPG

これで母艦(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('Pepperを操作するコマンド', (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アドレス。
  • Pepperを操作するコマンドは後述。

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

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