2
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

obnizラジコンをnode化する

こちらは「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ケーブルも細めの方がすっきりするのでしょうが持ってなかったのでそこは良しとしました。

obniz1_1.jpg

obniz1_1.jpg

nodeプログラムの作成

エンドポイントURLに、~/message?data=forwardや~/message?data=backを指定し、引数に応じてモーターを回すようにしました。
こんな感じになります。

app.js
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化にあたり、Messaging機能を初めて使いましたが(obnizは私にとって全部初めてみたいなものですが)これを使えばHTTPリクエストを使って外部からobnizラジコンを動かすことが出来ます。
セキュリティのためにアクセストークン使うようにコーディングすべきだったな、というのが反省点です。

ここまで読んでいただきましてありがとうございました。
別エントリーに続きがありますのでよろしければそちらも読んでいただけると嬉しいです。
M5Stackでobnizラジコンを操作する
Pepperでobnizラジコンを操作する

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?