こちらは「Obniz Advent Calendar 2018」 の12月4日の記事になります。
obniz公式サイトにはたくさんのサンプルプログラムや作品が載っています。
例えばobnizのハンズオンでも使われているobnizラジコンは、HTMLとJavaScriptでスマホから簡単にラジコンを操作することが出来ます。
https://obniz.io/explore/42
今回はこのラジコンプログラムをnode化してみたいと思います。
##参考にしたサイト
obniz - Nodejsで使う
https://obniz.io/doc/lessons_nodejs
obniz.js API リファレンス - Messaging
https://obniz.io/doc/sdk/doc/messaging
##作り方
###Messaging API
obnizのMessaging機能を使うとHTTPリクエストをメッセージとして受け取ることが出来るようです。
って、これを使うといいよって教えてもらったんですけどね。
呼び出すときのエンドポイントはこんな感じです。
GET https://obniz.io/obniz/{obniz_id}/message?data=***
早速作ってみましょう。
###工作タイム
必要な部品はサンプル作品と同じです。
-
モーターにジャンパーワイヤーをハンダ付け
ネット注文した品にはコードが付いてなかったので20年ぶりくらいにハンダごてを使いました。
コテを当て過ぎてモーター壊すんじゃないかとビビリながらもなんとか。。 -
モーターを張り付ける板の作成
かっこよく3Dプリンタで!と言いたいところですが必要なのは単なる板ですし、
100均ののこぎりと紙やすりで100均の木板を加工してお安く作ります。
4隅を丸くスベスベに整えたのでいい感じになりました。 -
モーター(&タイヤ)とobnizとモバイルバッテリーを板に張り付ける
センスが問われるところです。
セロパンテープやマスキングテープだとちょっと見た目が気になったので両面テープで目立たないように貼り付けました。USBケーブルも細めの方がすっきりするのでしょうが持ってなかったのでそこは良しとしました。
###nodeプログラムの作成
エンドポイントURLに、~/message?data=forwardや~/message?data=backを指定し、引数に応じてモーターを回すようにしました。
こんな感じになります。
var Obniz = require("obniz");
var obniz = new Obniz("{obniz_id}");
obniz.onconnect = async function () {
var motorA = obniz.wired("DCMotor", {forward:0, back:1});
motorA.power(30);
var motorB = obniz.wired("DCMotor", {forward:2, back:3});
motorB.power(30);
obniz.display.clear();
obniz.display.print("motor: stop");
obniz.onmessage = function(message, from) {
switch (message) {
case "stop":
obniz.display.clear();
obniz.display.print("motor: stop");
motorA.stop();
motorB.stop();
break;
case "forward":
obniz.display.clear();
obniz.display.print("motor: forward");
motorA.move(true);
motorB.move(true);
break;
case "back":
obniz.display.clear();
obniz.display.print("motor: back");
motorA.move(false);
motorB.move(false);
break;
case "right":
obniz.display.clear();
obniz.display.print("motor: turn right");
motorA.stop();
motorB.move(true);
break;
case "left":
obniz.display.clear();
obniz.display.print("motor: turn left");
motorA.move(true);
motorB.stop();
break;
default:
obniz.display.clear();
obniz.display.print("motor: bad parameter");
break;
}
}
}
##動作確認
nodeサーバーを起動します。今回はローカルPC上で起動しました。
> node app
Webブラウザのアドレスバーやpostmanなどを使ってHTTP GETリクエストを投げてみましょう。
例えば下のようなURLを指定します。
https://obniz.io/obniz/{obniz_id}/message?data=forward
https://obniz.io/obniz/{obniz_id}/message?data=stop
動きました!
最後の部分をback,right,leftに変えると後退・右回転・左回転します。
この動画だけだと分かりずらいですがnodeサーバーで動いてます。手持ちスマホで撮影したらブレブレ&はみ出しまくり。#obniz pic.twitter.com/2ioYFGbNyy
— hayakumi (@hayakumi8893) 2018年12月3日
##終わりに
案の定プログラムよりも工作時間に大半を費やしました。
node化にあたり、Messaging機能を初めて使いましたが(obnizは私にとって全部初めてみたいなものですが)これを使えばHTTPリクエストを使って外部からobnizラジコンを動かすことが出来ます。
セキュリティのためにアクセストークン使うようにコーディングすべきだったな、というのが反省点です。
ここまで読んでいただきましてありがとうございました。
別エントリーに続きがありますのでよろしければそちらも読んでいただけると嬉しいです。
M5Stackでobnizラジコンを操作する
Pepperでobnizラジコンを操作する