obnizでドライブしたい!FPS視点ラジコンを作ろう[obniz編]


はじめに

LEGOとobnizでラジコンを作ったので、その作り方を紹介します。
今回は動力部分『obnizでのモーター制御とコントローラー』の作り方を紹介します。

参考

冬空の下でドライブしてみた

タイトルに偽り無し。ちゃんとドライブしました。ラジコンにはカメラを付けているので、FPS視点(ラジコン視点)でも楽しめます。いやぁ~ラジコンたのしい

完成図

このようにIoTデバイス(ラズパイ、obniz)と、給電用のバッテリーを2つ搭載しています。

今回紹介するのはobnizのモーター制御

後輪のモーター制御には、obnizを使用しています。

左車輪のモーターをobnizの0,1に、右車輪のモーターをobnizの10,11に接続します。赤と黒の配線を図のように接続します。

※今回使用したモーターはこちらです → 赤い歯車モーター

制御の概要

Windows上にNodejsでWebサーバーを用意し、obnizを制御するスクリプトcontroler.htmlを用意します。 ※Webサーバーは必須ではありません。

controler.htmlは、githubに置きました → controler.htmlのソース
11行目の『obniz-ID』を持っているobnizのIDに書き換えます。これで準備完了です。あとはcontroler.htmlをブラウザで開けばコントローラーとして使えます。

コントローラーの説明

コントローラーは、用意したWebサイト(例:http://localhost/controler.html)にアクセスすると開きます。コントローラー画面はこんな感じです。

操作は、画面に指をタッチします(マウスでは操作できません)
指と中心点との位置関係(指の距離、指の角度)でラジコンの動きを制御します。

スクリプトの説明

controler.htmlのJavaScriptについて補足します。


<body ontouchmove="event.preventDefault()">

ontouchmove・・・は、iOSでページ全体のスクロールを無効にしています。コントローラーを指で操作したときにスクロールしないようにしています。


var motor1 = obniz.wired("DCMotor", {forward:0, back:1}); // 左車輪のモーター
var motor2 = obniz.wired("DCMotor", {forward:10, back:11}); // 右車輪のモーター

forward,backに設定している番号は、obnizデバイスの端子の番号です。


let x1 = div_x ;
let y1 = div_y ;
let x2 = event.changedTouches[0].pageX - div_x ;
let y2 = event.changedTouches[0].pageY - div_y ;

x1,y1は、コントローラー用の円の中心点です。
x2,y2は、画面にタッチしている指の座標です。中心点(x1,x2)を原点とした場合の座標にしています。


let mpow  = Math.round( Math.sqrt( Math.pow( x2-x1, 2 ) + Math.pow( y2-y1, 2 ) ) ) ; // 2点間の距離
if( mpow >=100 ) mpow = 100;

円の中心(x1,y1)とタップした指の位置(x2,y2)間の距離を算出します。距離が100を超える場合は、値を100とします。この値が、モーターの出力になります。数値が高いほどモーターの回転速度が上がりラジコンが速く移動します。


let angle = ( Math.atan2( y2 - y1, x2 - x1 ) * 180 / 3.1415 ).toFixed(2);

タップした指の位置(x2,y2)の角度を算出します。


el_hitarea.addEventListener('touchend', function(event) {
    console.log("[debyg] now_x=0 now_y=0");
    motor1.stop();
    motor2.stop();
}, false);

タップした指が画面から離れるとモーターが止まります。


これで説明は以上です。

関連リンク

おまけ

そーいえば年明けてた。2020年の干支はネズミだそうです。