« ROBOBASIC講座(FOR...NEXT) | トップページ | RZ1Basic v0.2.6 公開 »

ROBOBASIC講座(テンプレートMAINループ その2)

以前、「ROBOBASIC講座(テンプレートMAINループ)」として、赤外線リモコン用のテンプレートのMAINループをフローチャートにしたものを紹介しましたが、今回は、PSワイヤレスリモコンとラジコン(RC)用のテンプレートのMAINループをフローチャートにしてみましたので載せておきます。今回のMAINループは、赤外線のものよりは簡単ですね。

PS用の方は、MAINループの中に、各ボタンのデジタルデータを取得するためのGOSUBルーチン(GOSUB PSGET)とアナログコントローラからのデータを取得するためのGOSUBルーチン(GOSUB ADGET)があり、それぞれ取得したデータに応じて、ON...GOTO....で各ルーチンへジャンプします。RC用はデータ取得と処理は1セットしかないので、さらに簡単ですね。

Template Plogram For GameCon(Version1.09 20070515).bas
のMAINループのフローチャート図

Template_plogram_for_gamecon

RC Tempate Program(Version 1.21 20060929).bas
のMAINループのフローチャート図
Rc_tempate_2

これらはMAINループは単純ですが、リモコンやプロポからのデータの受信およびアクションへの割り付けを行っているGOSUBルーチン内が、そこそこややこしいですね。今回はPSコントローラのデジタルデータを取得した後のアクションへの割り付けの辺りを見てみましょう
と、その前に、ビット演算子について解説しておきます。

《代入(計算式)その2》
ビット演算子
には、「AND」、「OR」、「XOR」、「<<」、「>>」、「.」があります。ビット演算では、名前の通り、ビットごとの計算を行います。表で例の式をバイナリにして、つみ算のように縦に3つ並べてみました。バイナリですから、0と1なので、「AND」、「OR」、「XOR」は、それぞれの桁を、理論演算子で解説したように計算します。「<<」、「>>」は、それぞれの桁を、指定された数だけズラします。「<<」は、左へズラしますので、ひとつズラせば2倍に、2つズラせば4倍になり、「>>」は、その逆なので、ひとつズラせば2で割る、2つズラせば、4で割ることと同じ意味になります。最後に「.」で すが、数値をバイナリで表すと0と1なので、それぞれの桁を、デジタルデータのフラグ(オン/オフなど)として割り当てて利用する場合があります。例え ば、リモコンのボタン0〜7の8個のボタンがあったら、それぞれのボタンのオン/オフを、BYTE値のそれぞれの桁に割り当てるのです。その様な使い方を している場合、例えば5番目のボタンがオンなのかオフなのかを知りたい場合、n=a.5のような式で、5ビット目が、0ならば0に、1ならば1になるとい う演算子です。計算そのものは、例に書いた様に、その数だけ右にシフトして、1とANDを取る計算をしています

Pagesscreensnapz013

ビット演算はたぶん普通には使わないので解りにくく感じるかもしれませんが、慣れてくるととっても有用なので、頑張って使いこなして下さいね。

《演算子の優先順位》

  1. 算術演算子・ビット演算子
  2. 関係演算子
  3. 理論演算子

それぞれの演算子の優先順位は上記のようになります。


【PSコントローラのデジタルデータの取得】
リモコンの受信機からのデータの取得は、ETX, ERXという送受信のコマンドを使って行います。ETX, ERXの説明はまたの機会にお話することにして、今回は受信したデジタルデータをどのように振り分けているかを見てみましょう(私はこのコントローラを持っている訳でないので、ほんとに正しいかどうかはわかりません)。

Template Plogram For GameConではETX, ERXにより、Data0とData1にデータを取得した後、以下のようなコードが続きます。早速、今回解説したビット演算子の「ドット」を使ったコードです

PS_left = Data1.7'1,0
PS_down
= Data1.6'1,1
PS_right
= Data1.5'1,2
PS_up
= Data1.4'1,3
PS_start
= Data1.3'1,4
PS_r3
= Data1.2'1,5
PS_l3
= Data1.1'1,6
PS_select
= Data1.0'1,7

PS_square = Data0.7'1,0
PS_cross
= Data0.6'1,1
PS_circle
= Data0.5'1,2
PS_triangle
= Data0.4'1,3
PS_r1
= Data0.3'1,4
PS_l1
= Data0.2'1,5
PS_r2
= Data0.1'1,6
PS_l2
= Data0.0'1,7

を図にしてみました。ドットの演算子で、それぞれのボタンのオンオフをそれぞれの変数に代入しています。さらにこの続きのコードは

Gamecon

以下のようになっているので、0の時がオン、1の時がオフなんだと分ります。IF文で、それぞれのボタンの番号をPSDT1とPSDT2に割り付けていきます。この際、PSDT2は10の位、PSDT1が1の位になるように割り付けて、足し算した結果が、ON...GOTOでの行き先の番号となります。

実際に私は使っていないのでよくわかりませんが、例えば、PSDT1が左手、PSDT2が右手という感じに割り当てると、分りやすいってことはないのかなぁ??

 

IF PS_l2 = 0 THEN
    PSDT1
= 5
ELSEIF PS_r2 = 0 THEN
    PSDT1
= 7
ELSEIF PS_l1 = 0 THEN
    PSDT1
= 6
.....

.....

|

« ROBOBASIC講座(FOR...NEXT) | トップページ | RZ1Basic v0.2.6 公開 »

ROBOBASIC講座」カテゴリの記事

コメント

ワイヤレスリモコンテンプレートのフローチャートと解説、ありがとう御座います。

イメージとしては理解できましたが、
アクションへの割付や、演算子演算子など、
ややこしくて頭の中が混乱しています。
理解できそうに有りませんが、
ゆっくり勉強します。

Template Ploguramu ForGAMECONの説明に、
左アナログスティクによる連続歩行が追加されていると、
記述されているのですが、どの部分でしょうか。


投稿: shirasu | 2008年3月 2日 (日) 13時47分

shirasuさん
コメントありがとうございます。

>左アナログスティクによる連続歩行が....
GOSUB ADGETの後のON...GOTOがアナログかな?key1ad, key2adとか、adが付くのが、そうではないのでしょうか?ごめんなさい適当で。。。

余談:本質的なことでないですし、shirasuさんが間違えたとかでないのですが、このテンプレートの名前のTemplate Plogram for ...のプログラムってスペルミスですね。

投稿: micono | 2008年3月 3日 (月) 01時07分

ミススペルを気にされる程、
神経質なのですね。
コメントにする事も無いと思いますが?

やっと連続歩行のキーが理解できました。
key1adは左アナログキーを上に傾ければ良いようです。

一つ質問
GAME CONで、
前進→後退→旋回→前進のloopを、
抜けるにはどうすれば良いでしょう?。

投稿: shirasu | 2008年3月 3日 (月) 18時52分

ごめんなさい、オリジナルのファイル名がPlogramとなってて間違っているのであって、shirasuさんが間違えた訳じゃないことを、フォローするつもりでわざわざ書いたのですが、言い足らなくて、逆に受け取られてしまいましたね。

私はあんまり神経質じゃないですよ「てにおは」など文章間違え時たまあると思います。読み返したりしてて気がついても直してないところ何カ所かありますし。。。

>前進→後退→旋回→前進のloop
とは、この前のでしょうかね?
デジタルなボタンならイメージ湧くんですが
アナログで自動なのはイメージ湧き難いですね。


ADSET="F"
ETX 19200,ADSET
ADGET8:
ERX 19200,ADL1,ADGET8
IF ADL1<20 THEN

がスティックを前に倒している意味なので

ELSEIF ADL1>130 THEN

として、スティックを下に倒した時に
抜けるとか

どうでしょうかね?


投稿: micono | 2008年3月 3日 (月) 22時35分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: ROBOBASIC講座(テンプレートMAINループ その2):

« ROBOBASIC講座(FOR...NEXT) | トップページ | RZ1Basic v0.2.6 公開 »