当ロボットの仮想マシンのコアは 虹色ランタンシステムと共通です。 そのため詳細な使い方は そちらを参照してください。
とりあえず以下の基本命令だけでかなりのことができると考えます。
これだけは命令ではありません。 jmp や bbtp1 などの命令の飛び先を指定するするものです。 適当な名前を付けて最後にコロン (:) を書くのが特徴です。
HOGE: mtr 4 4 wait 200 mtr -4 -4 wait 200 jmp HOGE |
前進と後進を延々と繰り返す |
左右のモータパワーを指定する。パワーは -7〜7 の値です。 また 8 はブレーキです。
mtr 3 2 |
右のモータを 3、左のモータを 2 のパワーで回す |
左右のモータパワーを加算します。ただし -7 以下, 7 以上にはなりません。
mtr 1 -1 |
右のモータパワーを +1、 左を -1 する |
左右の障害物センサによるセンシングを行います。 センサパワーはセンシング強度で数が大きいほど強くなります。 5 くらいが妥当でしょう。 センシング結果を利用するには bsxx 命令を使います。
top: wait 10 sens 5 5 bsef back bser left bsel right mtr 4 4 jmp top back: mtr -3 -2 jmp top left: mtr 3 -2 jmp top right: mtr -2 3 jmp top |
障害物を回避しつつ前進する |
障害物が見つからなければ飛び先にジャンプする。用例は sens 参照
前方に障害物があれば (左右センサが反応すれば) 飛び先にジャンプする。用例は sens 参照
右に障害物があれば (左センサだけ反応すれば) 飛び先にジャンプする。用例は sens 参照
左に障害物があれば (左センサだけ反応すれば) 飛び先にジャンプする。用例は sens 参照
LED を点灯する
LED を消灯する
スイッチが押されていたら飛び先にジャンプする。
LABEL1: wait 10 bbtp LABEL2 ledoff jmp LABEL1 LABEL2: ledoff jmp LABEL1 |
ボタンが押されたら LED をつける |
スイッチが押されてなかったら飛び先にジャンプする。用例は bbtp を参照。
ジャンプする。用例は LABEL や sens を参照。
lend とペアを組み、指定した回数だけ lend までの処理を繰り返します。。 ただし使用にあたっては以下の点に注意
START: loop 3 mtr 4 4 wait 100 mtr 3 -3 wait 15 lend mtr 4 4 wait 100 loop 3 mtr 4 4 wait 100 mtr -3 3 wait 15 lend mtr 4 4 wait 100 jmp START |
八の字に走る。ただし旋回は調整が必要 |
ループの終わり。loop で指定した回数に達してなければ対応する loop に飛ぶ。 使い方は loop を参照。
一番内側のループを抜ける。使い方は虹色ランタンの同命令参照
ループ情報を初期値に戻す。使い方は虹色ランタンの同命令参照
指定した時間動きを止める。時間の単位は 20msec。用例は他の用例を参考のこと。
サブルーチンコールを行う。なお 5 段以上のコールは行えない。。使い方は虹色ランタンの同命令参照
サブルーチンコールから戻る。用例は call 参照。 なお、ループ中に当命令を実行すると管理情報がおかしくなるので注意。
以下はより凝ったプログラムを組むためのものです。 これらの命令は“レジスタ”と呼ぶ数値置き場を利用してます。 当システムは a, b, r1, r2, r3, r4, z, i の 8 つのレジスタを持ってます。 それぞれのレジスタは 0〜255 もしくは -128〜127 の値を格納することができます。 これは以下のように三つのグループに分けられます。
演算を行う汎用レジスタである
一次的に情報を蓄えておくためのレジスタである。 直接演算を行うことはできない。 また ledst や ledld 等大量の情報を一つの命令で処理する際も用いられる。
特殊な用途に使うレジスタである。 z レジスタは比較命令 (cmp) を行うとその結果が 0〜2bit 目に入る。 また i レジスタは一番内側のループ回数の残りが入る。
以下が命令の一覧です。 {a/b} という表現は a か b のどちらかという意味です。例えば、add{a/b} と書かれていた場合、adda と addb という二つの命令があり、 それぞれ作用するレジスタが a か b かの違いがあるだけです。 以下では a もしくは b レジスタのことを「汎用レジスタ」と呼んでいます。 また引数でレジスタに指定できる文字は a, b, r1, r2, r3, r4, z, i という文字です。
左右のモータパワーをそれぞれ r1、r2 に格納する
r1, r2 に格納された値 (下位 4bit のみ) をそれぞれ左右のモータパワーにする
汎用レジスタに値 (0〜255) を格納する
汎用レジスタに定数値を加算し元のレジスタに格納する。引算を行いたい場合マイナスの値を与えればよい。
汎用レジスタに引数で指定されたレジスタに格納された値を加算する。
汎用レジスタに引数で指定されたレジスタに格納された値を減算する。
汎用レジスタと定数値との論理積を取り元のレジスタに格納する
汎用レジスタと引数で指定されたレジスタとの論理積を取り元のレジスタに格納する。
汎用レジスタと定数値との論理和を取り元のレジスタに格納する
汎用レジスタと引数で指定されたレジスタとの論理和を取り元のレジスタに格納する。
汎用レジスタと引数で指定されたレジスタとの排他的論理和を取り元のレジスタに格納する。
[値]で指定された分だけ汎用レジスタを右シフトする
[値]で指定された分だけ汎用レジスタを左シフトする
a レジスタを上位、b レジスタを下位とする 16bit 変数を想定し右シフトを行う
a レジスタを上位、b レジスタを下位とする 16bit 変数を想定し左シフトを行う
汎用レジスタと引数の値とを比較する。結果は z レジスタに格納され次の beq, bne, bgt, ble 命令で活用される。
汎用レジスタと引数で指定されたレジスタとを比較する。結果は z レジスタに格納され次の beq, bne, bgt, ble 命令で活用される。
事前の cmp 命令で比較結果が等しければ飛び先にジャンプする
事前の cmp 命令で比較結果が等しくなければ飛び先にジャンプする
事前の cmp 命令でレジスタの方が大きければ飛び先にジャンプする
事前の cmp 命令でレジスタの方が小さければ飛び先にジャンプする
コピー元レジスタの値をコピー先レジスタに格納する
引数で指定されたレジスタに格納されている値だけ動きを止める。 数値の単位は20msec。
引数で指定されたレジスタに格納されている値を UART (115200bps) で出力する
UART から受信された情報を指定したレジスタに格納する。 必ず skipuart による受信データの存在を確認を行ってから実行すること
受信バッファに UART から受信データが存在してなければ飛び先にジャンプする
強制的にエラーを発生させる。デバッグ用