LoginSignup
15
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-31

きっかけはとある相談から始まった。
「次回の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機能を利用するなど。)
みなさまの一助になれば幸いです。

15
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10