きっかけはとある相談から始まった。
「次回の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電圧/電流チェッカーの数値
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。
・Battery Block ・・・3.7V 400mAhのリチウムポリマー(LiPo)電池がついたBlock。LiPo電池の充電用micro USB端子がある。
(参考)
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電池を着脱しやすくなった。
また、注意点として、Base BlockとBattery Blockを重ね合わせる場合、Base Blockのconsole用micro USB端子とBattery Blockの電源端子が干渉してショートする懸念がある(設計不良?!)ためconsole用micro USB端子の上面に絶縁用シール(下記画像の黄色テープ)を貼っておくことをお勧めする。
これで母艦(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の緊急停止ボタンカバーの中にしまってみた。
Amazon Dash Buttonは簡単に使用できますし、EdisonからPepperを操作できるようになったので、今後、いろいろな応用事例が考えられると思います。(例えば、EdisonはBluetooth機能も搭載されているので、PepperからBluetooth機能を利用するなど。)
みなさまの一助になれば幸いです。