ラズパイとNode.jsでエクストリームフィードバックなBB-8を作ろう

2018年5月31日木曜日 tomoki

初めまして!4月から入社したTomokiと申します。

今年の新人研修ブログのトリを勤めさせて頂きますので、よろしくお願いします!





私は今「API Technorogy Dept.」と呼ばれる部署で研修を受けております。
その部署名から今まではAPIのバックエンドをひたすら作っている
ちょっと地味な部署だと思っていました。

しかし研修を受けてみて、その考えは覆されることになりました。
なぜなら、過去のブログ記事でも取り上げましたが、IoT扇風機ベイダー卿ライトアップなど、
ワクワクするようなコレクションがたくさん置いてあったからです!
そんなわけで、私もそのコレクションに加えるべく、新しくアイテムを作らさせていただきました。 それが「エクストリームフィードバックBB-8」です!


こちらにあるスター・ウォーズに出てくるBB-8ラジコン(Amazonで購入できます)を使って、
CIツールの一種であるjenkinsを走らせた時に正常にプログラムが終わったか、
異常が発生してくれたかを知らせてくれるインジケータです。

仕組みとしては以下のようになります。


  1. GitHubにpushする
  2. Jenkinsが走って、結果に応じてラズベリーパイのWebAPIにアクセスする
  3. アクセスされたラズベリーパイのWebAPIに応じてBB-8を動かす
  4. みんなに知らせる

・・・と、本来はこうなる予定でしたが、残念ながら今回は時間が足りず、
ラズベリーパイにwebサーバを用意して、用意されたwebAPIにアクセスすると
BB-8が動くところまでしか作れませんでした。

使用した技術としては、
BB-8を動かすプログラムはcylon.jsを、
APIを受け取るためのwebサーバはexpress.jsを使いました。




ラズパイ側からBB-8にはBluetoothでアクセスしまして、
cylon.jsを使うとこんなにも簡単にBluetooth経由でアクセスできるのか!
と結構感動しました。


プログラムを組み始めた時は、express.jsでwebサーバを立ち上げるのも、
cylon.jsでBB-8にアクセスのも非同期ですし、どうやって内包するのか分からず、
BB-8にアクセスするプログラムをモジュール化して、
APIが呼ばれるたびにBB-8に接続しては切断をするという
回りくどい方法で実装しようとしていました。

しかし先輩に下のような素晴らしい組み込み方法を教えていただいて、
見事にwebサーバとcylon.jsを両立させることができました!

"use strict"
let express = require("express");
let app = express();
var Cylon = require('cylon');

Cylon.robot({
connections: {
bluetooth: { adaptor: 'central', uuid: 'cbc51fd7220a', module: 'cylon-ble' }
},

devices: {
bb8: { driver: 'bb8', module: 'cylon-sphero-ble' }
},
work: function(my) {
app.get('/color/:name',function(req, res){
let name = req.params.name;
console.log(name);
switch(name){
case "red":
my.bb8.color(0xFF0000);
break;
case "green":
my.bb8.color(0x00FF00);
break;
case "blue":
my.bb8.color(0x0000FF);
break;
default:
my.bb8.color(0xFFFFFF);
break;
}
res.send("Now color is ..." + name);
});
app.get('/spin/:round/:speed',(req, res)=>{
let round = req.params.round;
let speed = req.params.speed;
if(round === "stop"){
my.bb8.stop();
}
else{
my.bb8.spin(round, speed);
}
res.send("spin");
})
app.listen(3000, ()=>{
console.log("start server");
});
}
}).start();

実際に動かしてみますと、

http://localhost:3000/color/red
にアクセスすると赤色に、

http://localhost:3000/color/blue
にアクセスするとBB-8が青色に光りますし、

http://localhost:3000/round/right/120
にアクセスするとBB-8が右向きに高速回転します。

こんな風に、簡単にwebAPIを作ることができました。
express.jsを使えば簡単にwebAPIが作れますし、
cylon.jsを使えば簡単にBB-8をぐるぐる回したり
カラフルに点灯させることができます!
みなさんも是非、ご家庭で試してみてはいかがでしょうか?

ただ、作ったAPIのURLを他の人に知られてしまって、
知らない人に勝手にBB-8をぐるぐる回されないように気をつけてください(笑)



ヴァル研究所 18年卒新人特集!