2017年5月14日日曜日

Arduino JoyStick Libraryで自作コントローラを作ろう:ジョイスティックを動かす

前回の書き込みから考えると、結構なブランクが空いていた。
申し訳ないです。

今回はAJL(Arduino JoyStick Library)で"Grove Thumb Joystick"と呼ばれる
ジョイスティックのモジュールからコントローラを作る。



まず、"Groove Thumb Joystick"とは、PS2のアナログスティックを模した
モジュールで、上から見て縦横に可変抵抗がついている。

縦方向および横方向に倒された大きさと方向は、可変抵抗の抵抗値
から求められるということが分かればOKだ。
この抵抗値がジョイスティックを傾けているX軸方向とY軸方向を
表していて、その値が下の写真の線から出力されるということである。



これ以上の仕様に関しては下記URLを参照してもらいたい。
[SeeedStudio Groove Thumb Joystick]
http://wiki.seeed.cc/Grove-Thumb_Joystick/
因みに購入先は秋月だ。
http://akizukidenshi.com/catalog/g/gM-09279/

================================================

前置きはこれぐらいにして、手順について説明する。
今回用意するものは、以下の通りである。

  • Arduino Leonardo
  • 通信用USB A-microBケーブル(前回トピック同様)
  • ジャンパ四本
  • SeeedStudio Groove Joystick


今回の結線はとても単純なので、写真だけ掲載する。


SeeedStudio Groove Joystick側とArduino Leonardo側で
直接結線する。今回は

  • JoyStick X(黄色) ー Arduino A0ピン
  • JoyStick Y(白色) ー Arduino A1ピン
  • JoyStick Vcc(赤色) ― Arduino Power 5Vピン
  • JoyStick GND(黒) ー Arduino Power GNDピン

の通りに結線してもらえれば、回路的にはOKだ。
結線ができたら、以下のプログラムを書き込んでもらいたい。
(トピックの大きさが大きくなってしまったため、今回はダウンロードして
閲覧してください。ご了承ください。)

[ジョイスティックの確認プログラム(右上の↓アイコンからダウンロードできます)]
https://drive.google.com/file/d/0B_eMFT79G3ctYkYyMElkMEJmLTQ/view?usp=sharing

これは、ジョイスティック側の可変抵抗値をアナログ値として
取得して、それをシリアル通信ポートへ出力するプログラムである。
メニューバーの"ツール"→"シリアルモニタ"でシリアルモニタを
起動して、ジョイスティックをグリグリ動かしたときに値が動いていればOKだ。

次に、このプログラムを使ってジョイスティックの倒した方向と値を紐づけていく。

ここで大事なのは、自分たちがジョイスティックを持つ基点を決めておくことだ。
ジョイスティックを上下反対に持っていれば、当然読み取り値も反対になるからだ。
今回は、以下の持ち方で考えていく(白い端子が左側に来るように持つ)。


次に、読み取り値を決める。

先ほどのシリアルモニタを開いて、右、左、上、下にジョイパッドを動かす。
また、Groove Thumb Joystickを使っているのであれば、一度ジョイスティックを
押し込んでみてもらいたい。

すると、シリアルモニタの値から自分の倒した方向の最小値と最大値が
X軸、Y軸方向に対してそれぞれ把握できるはずだ。
また、Groove Thumb Joystickを使っていた人であれば、押し込んだときに
X軸の値が1023と出力されたハズだ。

================================================

それぞれの最小値と最大値をメモしたら、以下のリンクのプログラムに沿って
コードを改変してもらいたい。ここでAJLを使う。
[ジョイスティックプログラム]
https://drive.google.com/file/d/0B_eMFT79G3ctUXRNSmF3b3ZDUGs/view?usp=sharing

プログラムは至ってシンプル。

setXAxisRange関数およびsetYAxisRange関数で、X軸Y軸方向の
最小値と最大値を決める。先ほどメモした値をそのまま放り込めばいい。

setButton関数で押されるボタンの番号と初期時のボタンの状態(初期化時に押されて
いないため0)について決定し、releaseButton関数およびpressButton関数で
該当ボタンが離されたことと押し込まれたことを決める。

setXAxis関数およびsetYAxis関数で、先ほどの各setRange関数で指定された
範囲の中でのジョイスティックの位置を決定する。今回は読み取ったアナログ値を
そのまま放り込めばいい。

これを確認するため、JoyToKeyからコントローラのテスト画面を呼び出して確認する。
まず、JoyToKeyを起動して、"設定"→"ジョイスティックの設定..."を起動する


"1.アナログスティックの調整・ボタンの確認"というタブをクリックして、
"ゲームコントローラの設定"をクリックする。


"Arduino Leonardo"を選択して、"プロパティ"をクリック


出てきたウィンドウで"テスト"のタブを選択すると、以下の画面になる。
このウィンドウから確認ができる。


ここで、左上の"+"マークが動いてくれればOK。
また、Groove Thumb JoyStickのユーザであれば、
押し込まれて"11"番ボタン(10じゃないよ!)が光ればよい。

================================================

ここで、あることに気が付いた人がいると思う。
ジョイパッドの上下が反転しているのだ。

これはAJLの仕様で、"最小値は下で最大値は上"と解釈
されてしまって、値の意味するところが反転しているためである。

ただ安心してもらいたい。修正は一行で済む。
2つめのAJL適用プログラムでいう所の35行目に

Y軸現在値(y_value)=(Y軸最大値+Y軸最小値)-Y軸現在値(y_value)

を入れれあげればいい。
手計算でもよいと思うが、Y軸最大値がY軸現在値に入ったときに計算結果が最小値
のものになって、逆にY軸最小値がY軸現在値に入ったときに計算結果が最大値の
ものになることから、なんとなく察しが付くはず。

コードは以下
[修正版ジョイスティックプログラム]
=======
#include "Joystick.h"

//可変抵抗をつなげるpin
const int x_pin = A0;
const int y_pin = A1;

//L3ボタン(11ボタン)に該当するジョイスティック押し込み
const int L3 = 10;

//可変抵抗の値
int x_value = 0;
int y_value = 0;

//AJLクラスオブジェクト
Joystick_ Joystick;

void setup() {
  // put your setup code here, to run once:
  //AJLの初期化
  Joystick.begin(true);

  Joystick.setXAxisRange(267,771);//519が中間値になるように設定
  Joystick.setYAxisRange(262,766);//514が中間値になるように設定

  //L3に該当するボタン
  Joystick.setButton(L3,0); 
}

void loop() {
  // put your main code here, to run repeatedly:

  //ジョイスティックの可変抵抗値読み取り
  x_value = analogRead(x_pin);//norm 519 MAX 771(left) min 251(right) push 1023
  y_value = analogRead(y_pin);//norm 514 MAX 778(under) min 244(top)

  y_value = 766+262-y_value;//上下反転

  if(x_value != 1023){
    //L3ボタン解除
    Joystick.releaseButton(L3);

    //ジョイスティック値設定
    Joystick.setXAxis(x_value);
    Joystick.setYAxis(y_value);
  }else{
       //L3ボタン押下
       Joystick.pressButton(L3);
  }


  delay(50);
}

=======





長くなってしまったが、これでAJLのジョイスティックに関するトピックは
終わりである。
次回は一度総まとめとして、ボタンとジョイスティック(可変抵抗)
を入力として、何かを作ってみようと思う。

2017年4月9日日曜日

Arduino JoyStick Libraryで自作コントローラを作ろう:導入編

某所への遠方研修がひと段落して、手が動いたのでメモする。
本件はArduinoを使った自作コントローラづくりに関する導入トピックだ。

まず最初に、一つ断りを入れておきたい。
本トピックでは、Arduinoの入門知識や記述言語であるC++に関する
話は述べないこととする。自分が教えられるようなレベルに無いというのもあるが、
「Arduino 入門」や「C++ 入門」でググれば素晴らしいページに出会えるからだ。
(掲示板で聞かれたら、参考になるURLは提示できるようにしたいです。)

ただし、最悪コピペで動かせるような状態にはするため、是非とも入門者でも
見ていただきたい。少しでも参考になれば、私はとても嬉しい。
ーーーーーーーーーーーーーーーーーーーーーーーー

改めて、Arduinoでの自作コントローラづくり導入に関して述べたい。
まず、以下の物品とソフトウェアを用意する。Arduinoの入門がすでに済んでいる
人であれば、自己判断で部品を変えてもらってもいいと思う。

[物品]
・Arduino Leonardo(http://akizukidenshi.com/catalog/g/gM-07384/)
2017/4/9(日)現在で約3000円だが、互換を含めもっと安いルートはあると思う

・USB A-microB データ通信ケーブル(https://goo.gl/oiItfM)
百円均一ショップでも売ってるけど、必ずデータ通信ケーブルを購入すること

・オス―オスジャンパーピンセット(http://akizukidenshi.com/catalog/g/gC-05371/)
・ブレッドボード(http://akizukidenshi.com/catalog/g/gP-05294/)
・カーボン抵抗 300 Ω(http://akizukidenshi.com/catalog/g/gR-25301/)
・ダクトスイッチ(http://akizukidenshi.com/catalog/g/gP-03647/)
Aitendoでもいいけども、とりあえず秋月に統一する。
カーボン抵抗は電圧を得るために使うだけだから、10 kΩとかでもいいと思う。

・Windows 10のノーパ
あくまでも私の環境というだけ。後述のライブラリはMac OSやLinuxでも導入
できるはずだが、後述のJoyToKeyが使えないため、何かしら代用できる手段を用意
してほしい。

[ソフトウェア]
・Arduino IDE(https://www.arduino.cc/en/Main/Software)
インストーラに沿って、そのまま順繰りにしてもらえればOK。

・Arduino JoyStick Library(https://goo.gl/m53TXu)
インストール方法は後述する。以降AJLと呼ぶことにする

・JoyToKey(http://joytokey.net/ja/)
シェアウェアだが、一応試用は可能。気に入ったら700円支払って
末永く使ってあげよう。

手順としては、以下の通りである。

1."Clone Or download"→"Download ZIP"でzipファイルを適当なところにダウンロード
2.ダウンロードしたzipファイルを解凍する。
3."C:\Program Files (x86)\Arduino\libraries"に、解凍後フォルダにあるJoystickフォルダを、フォルダごとそのままコピー
4.解凍後フォルダにある"deploy.bat"をクリックして実行
5.ブレッドボード上に結線する
6.ソースコードをコピペ(あくまでも今回の目的は導入の確認のため)
7.コンパイル&書き込み
8.JoyToKey起動
9.ボタン1を割り当て
10.ボタンを押して左クリックが行われるか確認

1.~4.は読んで字の如く。分からなければ掲示板で教えていただけるとありがたい。
5.~10.は写真やコードを提示して詳細を述べる。

5. ブレッドボード上に結線する

下図のようにジャンパで結線する。
抵抗で得られた電位をそのままGPIOの9番目に割り当てている。

6.ソースコードをコピペ

以下のソースコードをArduino IDEにてそのまま記述
AJLのサンプルコードの中身をちょっと変えただけ。

7.コンパイル&書き込み

コードに適当なファイル名を付けて保存して、”マイコンボードへの書き込み”
(→ボタン)をクリック。もしボードへの書き込みができなければ、コンパイル終了後の
タイミングでArduino上のResetボタンを押すといいかもしれない。

8.JoyToKey起動

起動すると課金の旨を申し出るが、OKを押すとそのまま続行される。

Button 1(このとき「機能」はDisabledになっているはず)をクリックして、
ボタンの設定画面に入る。

9.ボタン1を割り当て

”特殊なボタンの割り当て”内の左のボックスにて、”マウス左ボタン”
を選択。右は"Key 1"になっていることも確認してほしい。

"割り当てる"ボタンをクリックすれば、黄色くハイライトされた
”左クリック”を確認できるハズだ。

最後にOKをクリックして、設定を終了する。

10.ボタンを押して左クリックが行われるか確認

ブラウザ上の適当なボタンなどにカーソルを合わせて、
ブレッドボード上のボタンを押してもらいたい。
左クリックが実行されるハズだ。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー

以上のことが確認できれば、お手元のArduinoでAJLが動かせることが
確認できる。動かなければ、Arduino IDEの”シリアルモニタ”をから、
回路の方の確認をしたほうがいいと思う。

ボタンが押されていればTrue,離れていればFalseが出力される。
(ただし、チャタリング対策が無いので、チョコチョコ出力がぶれると思います)

とりあえず今回のトピックはこれで終わらせたい。
次回はコードの解説を行いたい。


2017年4月1日土曜日

今後の投稿について

おそらく前回の投稿から2週間ぐらいブランクが空いたと思う。
次のトピックを見つけるという名目で結構遊んでいた。申し訳ないです。

改めて、本件の内容(というより連絡)である、今後の投稿について述べたい。

今後のブログの更新ペースが、遠方での新人研修があったり仕事が始まったりして、
結構スローペースになると思う。ただ、少なくとも一カ月に一回ぐらいは
更新できるようにしたいなと、個人的に考えている。

ただ、マシンクラフトのスクリプト入門に関するトピックは一通りフィニッシュした
つもりなので、新しい内容についてチャレンジしたいなーと考えている。

今のところ考えているものは、次の通り。

  1. Arduino(Leonardo)を用いた自作PCコントローラ作成
  2. マシンクラフト用例別逆引きスクリプト集

1. は、Arduino Joystick Libraryと呼ばれるライブラリをつかって、自分専用の
オレオレなコントローラを作り、マシンクラフトのモデルを操作するのに最適な
制御盤を自分で作ってみようという内容だ。

ただ、私も初めての試みとなるため、難しそうであればUSBAPIArduino HID
 Libraryを検討するかもしれない。

[Arduino Joystick Library]
https://github.com/MHeironimus/ArduinoJoystickLibrary
[USBAPI(URLが長かったため短縮しました)]
https://goo.gl/UNdQpM
[HID Library]
https://www.arduino.cc/en/Reference/HID

2. は、用例からどんなスクリプトを記述するのかをひたすら解説していく
といった内容だ。目標としては、読者の要求からスクリプトを逆引きできる
ようにする。

以上のものはあくまでも検討しているもので、もしかしたら別のトピックを
投稿するかもしれない。また、これについて投稿してほしいというものがあれば、
Twitterや本掲示板の書き込みで教えていただけると助かる。

ただし、何かしらマシンクラフトに関わるものの方が個人的にはありがたい。

以上の内容について、迷惑をおかけするかもしれないけれども、なるべく
読んでいる人の役に立てるような、そんなブログにしたいと思っています。
何卒、よろしくお願いします。

2017年3月20日月曜日

MachineCraft備忘録:接合パーツの自由化と固定化

学校を卒業して学士を取得したことを確認して、ホッと一息をついていた。
接合パーツの自由化と固定化についてメモをしていなかったため、これについて
投稿する。Twitterで教えてくれた方に感謝だ。

例えば、自動車の駆動形式をFRやFFにしたり、牽引式のトレーラートラックや
電車などの関節部を実装するためには、自由に動く接合パーツがほしくなる。

しかし、接合パーツの自由化のためにSETUPを無設定にすると、パーツが
固定化されて動かなってしまい、自由化どころか動かなくなってしまう。
でも大丈夫。ちゃんと設定方法は用意してある。

必要なステップは二つ。

  1. SETUP画面にて、接合パーツにNEUTRALを設定
  2. パラメータを左一杯まで動かして、左矢印をクリック
スクリプトいらず、超シンプルである。
以下にRotatorSを例に、写真付きで説明する。

1SETUP画面接合パーツにNEUTRALを設定


2. パラメータを左一杯まで動かして、左矢印をクリック


NEUTRALの下のゲージに注目。
-100からFREE変わったはずだ。

今回はRotatorSで試してみたが、RotatorAや,Hinge(S,A),Piston(S,A)
でも可能である。

Wikiあたりでも解説はされているハズだが、マニュアル無しでマシクラを
始めた人の参考として、本トピックを掲載した。

因みに例として使ったモデルはコレである。私が初めて装飾パーツで造形を作った
LMPカーもどきである。


2017年3月16日木曜日

MachineCraftスクリプト機能(C#)の基本(総まとめ):スピードキープ車を作ろう

今までのトピックの総まとめとして、ある一定スピードを維持する車を作る。

要求としては、以下の通りとする。
・Carモデルを使用
・100[km/h]前後で速度を維持する
・キーボード入力から自動車を走行させる。

3番目の要求が前回トピックの「キー入力はスクリプトから受け付けない~」
に抵触するような気がするが、方法はある。
StartActionの「(キー割り当ては必須ではない)」というルールを使ってスクリプト
専用のブレーキアクションを作ってしまえばいい。

前回CarモデルのコピーのASSIGN画面を開いてアクション"Brake"を登録する。

これをそれぞれのWheelにつながっている4つのRotatorSに登録する。
Brakeアクションのパラメータは0(RotatorSを停止)にする。


あとはスクリプトだが、ここで重要なのがマシクラ基本(その4)で述べた
スクリプト中で使われる関数の出力はゲームにて表示されるパラメータ
と一致するとは限らない」という点。
計器上の値がそのまま使えないのだから、計器上の100[km/h]のときの
スクリプト上のスピードをPrintやLogで確認すればいい。
(勿論、100[km/h]×(スクリプト上の速度[-]/計器上の速度[km/h])で導いてもよい)

筆者の環境(Ver. 232a)では、スクリプト上のスピードは27だった。
以下にスピードキープ車のスクリプトを乗せる。

スクリプト上のUserNameは必ず自分のものに変えておくこと。


TESTで動かすと、こんな結果が得られるハズ。
こんな感じで、100[km/h]を超えるとBrakeアクションが発生し、RotatorS
チョコチョコと停止していることが確認できる。
ちなみにノーマルCarのトップスピードは190[km/h]である。

ただ注意してもらいたいのは、スクリプトが実行される周期はゲーム中のfps
に依存する。また、スクリプトの実行速度の都合上、ユーザ入力に根負けしてしまう
ことがある。

例えば上記プログラムのif条件文を"absVel>5"にしても、トップスピードはある
一定速度以下まで下がらないハズだ。

以上がMachineCraftスクリプト機能(C#)の基本である。
このプログラムが理解できれば、想像力次第でマシンが幾つもつくれるハズだ。

読者の参考になれば幸いである。

MachineCraftスクリプト機能(C#)の基本(その5):スクリプトからモデルを動かす

前回トピックでは、モデルに関する情報をスクリプト上から取得した。
今回は、得られた値からモデルを動かしてみたい。

モデルを動かすにあたって、覚えておかなければいけない関数は以下の二つである。
これらもLua解説テキストから確認できる内容である。
StartAction関数は、ASSIGNで指定した(name)アクションをduration[f]だけ実行する。
durationが-1であれば、そのアクションはソフトウェアのクラッシュや後述の
EnsAction関数などの例外を除いて実行され続ける。

EndAction関数は、StartAction関数で動いているアクションを無条件で停止させる。
この関数の説明は上述のコードの通りなため割愛するが、筆者の確認だと
キー入力されているアクションはどうやら停止できていないらしい。もし違う場合
はコメント欄やTwitterで教えてもらえるとありがたい。

確認として、StartAction関数でモデルを永遠に前進させてみようと思う。
ただし、今回は単純化のために_sampleのCarをモデルとして扱いたい。
元ファイルに手を付けたくないため、Copyをお願いしたい。


Buildをクリックして、Build画面へと遷移し、TABキー→ASSIGNでアクションの名前
を確認したい。TABキー→SETUPWheelにつながっているRotatorSで確認してもらって
もかまわない。

前者の方法であれば、こんな画面が出てくる。


"MoveF"というアクションを覚えてもらいたい。
これをStartAction関数の引数に指定する。

以上のスクリプトをCarモデルのコピーに適用して動かすと、
下の動画のような面白い状況になるかもしれない。
"MoveF"がずっと実行されている。結果としてEnemyに衝突した。

次はコメントアウトを消してEndAction関数を有効にしてみる。
結果の写真や動画は上げないが、全く動かないハズだ。

OnStart関数が実行された後にOnUpdate関数が走っているので、
StartAction関数が実行された直後にEndAction関数が実行される。
それ故に、アクション発生した直後にキャンセルされ、結果として
モデルが動かない。

一方で、Wキーを押してユーザから直接"MoveF"アクションを実行
してみると、普通に前進するハズだ。このことから、スクリプト外
のアクションに対してEndAction関数は動かないことが確認できる。

以上が、スクリプトからモデルを動かす方法である。
前回のトピックの内容を踏まえれば、いろいろな動きを作れると思う。

次回は、今までの"MachineCraftスクリプト機能(C#)の基本"
トピックの総まとめとして、速度をキープするCarを作ってみたい。

パラメータに応じてモデルを動かすということができれば、マシンクラフトの
スクリプトの書き方は一応理解できるハズ。

2017年3月14日火曜日

MachineCraftスクリプト機能(C#)の基本(その4):モデルの情報を得る

前回トピックでは、AutoPilotの立ち位置について述べた。
今回では、AutoPilotでモデルの情報を確認してみようと思う。

今回のモデルの情報というのは、モデルに含まれたCoreブロックから見た位置,
速度,傾き,方角などの空間的な情報のことを示す。実際に得られるデータは
これだけではないが、基本ということでこの4つに絞りたい。
興味があれば、_scriptフォルダのLua解説テキストあたりを参考に
調べてみるとよい。

モデルの位置や速度,傾き,方角は次の関数から得られる。参照元は
Lua解説テキストの60行目あたり。ほぼLua解説テキストからの抜粋である。


前回(その2)と同じ要領でC#スクリプトを組み、モデルに適用する。

速度に関しては、x,y,z方向への速度から絶対速度を求めただけである。
実をいうと、GetSpeed関数もあるが、今回はUnity3D謹製のクラスおよび
関数が使えることも示したかったため、あえてGetVelocity関数を使っている。

結果としてはこんな感じになる。






ここで勘のいい人であればあることに気づく。
右下のメータと速度が一致していない。わざとらしく単位を付けて申し訳ない。

ここで大事なことは、スクリプト中で使われる関数の出力はゲームにて表示される
パラメータと一致するとは限らないということだ。筆者はまだ確認できていないが、
位置もなんとなく違う気がする。

以上のことから、今後パラメータを使ってモデルの動きを変えていく際には、
Print関数やLog関数を活用して頂けると筆者は幸いである。

次回は、モデルを動かす事に関するトピックを述べていきたい。