4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-03

はじめに

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年の干支はネズミだそうです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?