スタジオ ミュウ

MYU USB BASIC COMPILER (myuusbbasic.exe)

LED計測制御 | LEDグループ学習 | メロディのプログラム | RCサーボの制御 | モーターのPWM制御
MYUロボ-II | MYU-USB転送ソフト | MYU USB BASIC | USBドリトル | C アセンブラMYUUSB-1基板 | MYUUSB命令一覧
転送ソフト(232C) | MYU BASIC(232C) | 構造化ドリトル | エクセルで制御 | エクセルで計測 | MYUアセンブラ | MYUROBO-1A基板 | MYUロボ(232C)命令一覧 | ドリトル命令一覧

■MYU-520 MYU-USB基本セット 3,672円(8%税込)
■MYU-521 MYU-USBベルト基本セット 3,672円(8%税込)
■MYU-522 3軸MYU-USB基本セット 4,536円(8%税込)
■MYU-524 MYU-USB制御基板(2モーター用) 2,592円(8%税込)
■MYU-526 MYU-USB制御基板(4モーター用) 3,024円(8%税込)


●MYU USB BASIC プログラム | 言語仕様 | リファレンス | リアルタイム計測 | 入出力プログラム | LEDの制御
MYU BASIC は、GOTO文を使わないVisual Basicライクな構造化言語です。複雑な入出力処理も簡単で見やすいプログラムを書くことができます。
MYU BASIC COMPILERは、MYU BASIC言語をミュウロボ命令にコンパイルします。コンパイルしたミュウロボ命令は転送ケーブルを通して制御基板に転送し実行します。
また、パソコンにつないだままアナログ/デジタル計測・リモート操作など便利な機能もあります。

MYU USB BASIC(myurobousb.zip) はここからダウンロード(94K V1.17 2017/3/10)できます。(64bitOS対応)

●起動方法
ダウンロードしたmyurobousb.zipを展開しmyuusbホルダをCD-ROM・ハードディスク・サーバー・USBメモリなどにコピーしてください。ホルダ中のmyuusbbasic.exe(赤いアイコン)を実行するとMYU USB BASICが起動します。
Microsoft VC# VB 用参考ソース

●プログラム
myuusbbasic.exeを立ち上げてください。編集ボックス内でプログラムを作っていきます。
Openボタンを押してmyubasic1.mbsを読み込んでください。下の画面になります。
PCとMYU-USB制御基板とを転送ケーブルで接続、転送ボタンを押し、転送しますか?<はい>で転送され'ピピ'と鳴れば転送終了です。転送ケーブルを抜きタクトスイッチを押すとプログラムが実行されます。
また、転送ケーブルをつないだままアナログ入力や触覚の入力など基板からの情報も見ることができます。
プログラムは、マウスを使って命令を編集ボックスに部品を配置するようにして作ります。

編集ボックス
  MYU BASICプログラムを編集する場所です。
命令タブ(MYU命令と制御命令)
  MYU BASICで使われる命令リストです。命令はMYU命令とMYU BASIC制御命令に分かれています。タブをクリックして切り替えます。
  命令をクリックすると解説ボックスにその命令の説明が表示されます。
  右クリックすると別の名前の命令を追加することができます。
  命令をドラッグして編集ボックスに配置してMYU BASICプログラムを作っていきます。
解説ボックス
  命令リスト内の命令をクリックすると命令の解説が表示されます。
  転送ボタンを押すと編集ボックスのプログラムがMYUロボ命令にコンパイルされ表示されます。
USB-●
  基板と接続したか表示します。
Openくボタン
  MYU BASICプログラムを読み込みます。拡張子は.mbs
Saveボタン
  編集ボックスのMYU BASICプログラムを保存します。拡張子は.mbs
Clearボタン
  編集ボックス内をクリアします。
転送ボタン
  編集ボックス内のMYU BASICプログラムをコンパイル、基板に転送します。

計測/R実行ボタン(右のダイヤログが表れ、転送ケーブルを繋いだまま各種操作可能)
  ◆RC0-RC7のチェックボックス
    ポートCの出力をビットごと設定できます。(LED制御に便利)
  ◆入力ポート
    デジタル計測が始まりIn2-In4の状態がリアルタイムで見ることができる
  ◆アナログ計測(AN10-AN4)
    アナログセンサーの計測値を見ることができる
  ◆サーボスライダ
    接続されているサーボモータを操作できる

  ◆記録開始ボタン
    記録停止までの間、計測間隔ごとにアナログ計測値をファイル(myu.txt)に保存する。Excelなどで結果を表やグラフにできる。
  ◆R実行ボタン
    編集ボックスに書いてあるプログラムを転送しないで実行できる
  ◆R逐次実行ボタン
    編集ボックスに書いてあるプログラムを1行づつ実行できる
  ◆ステップインボタン
    基板のプログラムを1行づつ実行しレジスタの変化を見ることができます
    (デバッグモード)
※プログラム中にSTEPIN命令を入れ実行するとそこで止まりデバッグモードになる

リモート
  ドロップダウンリストで選んだ命令を隣のボタンでリモート操作できる
※R実行やリモートでモータを動かすとモーターノイズの影響をうけますので注意してください。
◆命令のカスタマイズ
startupusb.iniやmyurobo.iniを編集すると命令をカスタマイズすることができます。

●はじめてのMYU BASICプログラミング
MYU-520 MYU-USB基本セット 3,570円(税込)を素材に簡単なプログラムを作ってみます。
myuusbbasic.exe(赤いアイコン)を立ち上げ命令リストの"前進"をクリックしてください。下の解説ボックスに説明が表示されます。
続けて"前進"をドラッグして編集ボックスにドロップしてください。左側の編集ボックスに"前進"が表示されます。スペース" "続けて"10"と入力します。
同様に"右回り 5"と入力します。
※命令をダブルクリックしても同じことができます。

前進 10
右回り 5

MYU BASICは、最初に命令、スペース、引数の順で書いていきます。引数が複数の場合、半角のコンマで区切って続けます。引数の数は命令によって異なります。詳しくはリファレンスをご覧ください。

プログラムはこれで終わりです。動作は前進を1秒行い右回り0.5秒です。次にパソコンと基板とを転送ケーブルで接続し、転送ボタンを押し<はい>で転送されます。'ピピ'と鳴れば転送終了です。転送ケーブルを抜きタクトスイッチを押すとプログラムが実行されます。
※転送エラーの場合は、再度転送ボタンを押してください。

プログラムは編集ボックスに直接書いても同じ結果となります。
転送されたプログラムは電源を切っても覚えています。ロボットの電源を入れタクトスイッチを押すと何回でも実行できます。

●ロボットのプログラム
下の命令を使ってプログラムします。※引数は、0〜255の整数値です
命令 説明
前進 <式> <式>x 0.1秒だけ前進する 前進 10
後退 <式> <式>x 0.1秒だけ後退する 後退 10
右回り <式> <式>x 0.1秒だけ右回りする 右回り 10
左回り <式> <式>x 0.1秒だけ左回りする 左回り 10
停止 <式> <式>x 0.1秒だけ停止する 停止 10
左前 <式> <式>x 0.1秒だけ左側が前進する 左前 10
左後 <式> <式>x 0.1秒だけ左側が後転する 左後 10
右前 <式> <式>x 0.1秒だけ右側が前進する 右前 10
右後 <式> <式>x 0.1秒だけ右側が後転する 右後 10
Wait <式> 直前の状態のまま、<式> x 0.1秒だけ待つ Wait 10
モーター3左 <式> <式>x 0.1秒だけモーター3を左回転する モーター3左 10
モーター3右 <式> <式>x 0.1秒だけモーター3を右回転する モーター3右 10
モーター4左 <式> <式>x 0.1秒だけモーター4を左回転する モーター4左 10
モーター4右 <式> <式>x 0.1秒だけモーター4を右回転する モーター4右 10

<式>のなかで使用できるもの
1、10進定数    123
2、16進定数     &hF0 H'11'+H'1F' &h1F+1
3、2進定数     B'10110011'
4、リテラル定数  "A" "@"+1
5、変数      Byte型とInt型の変数や1次元の配列が使える
6、システム変数  PA(ポートA)、PB(ポートB)、PC(ポートC)、T0H、T0L(タイマ0(250KHz)の上位・下位8ビット)
         TRISA TRISB TRISC 設定専用:各ポートの入出力をビットごと(0:出力 1:入力)に設定する
7、算術演算子   + - * / MOD(剰余)
8、関係演算子   = > < >= <= <> 真なら1、偽なら0を返す
9、論理演算子   AND OR XOR
10、()       ()内の計算は最優先
11、<<単項    1ビット左シフトする B=<<A Aの倍がBに入る Aは変化しない。
12、>>単項    1ビット右シフトする B=>>A Aの半分がBに入る Aは変化しない
13、-単項     符号反転 A=-A A=-(1-2)
14、Not 単項    単項が0なら1、0以外なら0を返す A=Not A
15、++変数     インクリメント演算子 ++A Aを+1する B=++A Aが1の場合AもBも2となる
16、--変数     デクリメント演算子 --A Aを-1する B=--A Aが1の場合AもBも0となる
17、In(定数)    デジタル入力ポート In(ポート番号)の値をHigh=1、Low=0として返す
18、AN(定数)    アナログ入力ポート AN(ポート番号)の値を8BIT(0-255)の値で返す
19、AN10(定数)   アナログ入力ポート AN10(ポート番号)の値を10BIT(0-1023)の値で返す
20、関数(<式>,<式>,・・)

演算子の優先順位について
単項演算子(++ -- << >>) > 算術演算子(* / MOD) > 算術演算子(+ -) > 関係演算子 > 論理演算子 の順で計算する

前進や右回りなどの命令を使い引数(動作時間)をセットすることでロボットを動かすことができます。

上のようなコースを作ってプログラムの練習をしてください。
※モーターなどのバラつきによりロボットはなかなか直進しません。前進命令の間に右前 左前 などの命令を入れ直進するようプログラムを修正します。
下は、前進3秒の間に右前の命令を入れ、左方向に修正した例です。前進と右前の時間の比率を変え調整します。

前進 9
右前 1
前進 9
右前 1
前進 9
右前 1

◆マウス(ドラッグ&ドロップ)を使ったプログラム編集
※編集ボックス内のプログラムをドラッグ&ドロップすると行単位で移動・入替できます。
※ドロッグした行を枠外に移動すると行削除ができます。
※間違って削除した場合、Ctrl-Z(Ctrlキーを押したままZキーを押す)で元に戻ります。
※Ctrlキーを押したまま行移動すると行をコピーします。
※Shiftキーを押したまま行をクリックすると複数行の移動ができます。

次に下のようにプログラムします。
Do
  前進 10
  右回り 5
Loop
DoとLoopは制御文といってセットになっています。間の<文>(命令)は自動的に段落がつきます。同様にIf EnfIf、For Nextなどの制御文も内部に段落がつきます。制御文はMYU BASIC言語仕様をご覧ください。
これを転送/実行してみます。ロボットは多角形を描くような動きを繰返すはずです。Do Loopは間にはさまれた<文>を繰返し実行します。
プログラムは命令を順に実行しますが、制御文はその流れを変えることができます。またプログラムはSaveボタンを押してファイル名を指定し保存するようにしてください。
※繰返し実行する制御文をループ文といいます。他にFor Nextループなどがある。
※Do...Loopは無限ループとなりプログラムは永遠に終了しません。ループから抜けるにはDo...Loop内で ExitDo 命令を使います。
※また Do WHile <式>...Loop や Do...Loop While <式> など条件を付けたループ文を使うとループから抜けられます。

◆制御文一覧
制御文 説明
Do <文> Loop Do Loop間の<文>を繰り返し実行する。Do Loopから脱出するには'ExitDo'命令を使う
Do While <式> <文> Loop <式>が0以外ならDo Loop間の<文>を繰返し実行
Do <文> Loop While <式> <式>が0以外ならDo Loop間の<文>を繰返し実行
ExitDo Do Loop間から抜け出す
IfHi(1-4) Then <文> EndIf 入力ポートIn(1-4)がHigh(off)ならEndIfまでの<文>を実行する
IfLo(1-4) Then <文> EndIf 入力ポートIn(1-4)がLow(on)ならEndIfまでの<文>を実行する
Else <文> EndIf IfH() や IfLo() の条件が成り立たない場合、EndIfまでの<文>を実行する
For 変数=初期値 To 最終値 Step 値
  <文>
Next
変数に初期値を代入, Step値が正の場合、変数<=最終値なら<文>を実行
Step値が負の場合、変数>=最終値なら<文>を実行
変数はStep値が加算され終了値以内ならFor Next間を繰返す ※Stepを省略するとStep 1となる
If <式> Then <文> EndIf <式>が0以外ならEndIfまでの<文>を実行する
ElseIf <式> Then <文> EndIf 別の条件を設定する
Else <文> EndIf すべての条件が成り立たない場合、EndIfまでの<文>を実行する

◆制御文のフローチャート

次はFor Next文の説明です。ここではTIMEという名前の変数を使っています。変数は値(テータ)を入れる入れ物です。
変数は使う前にはByte TIMEと変数名を宣言しなければなりません。ここではTIMEとしましたが変数名は自由につけられます。
※MYU BASICで扱う値は、Byte型の整数(0 〜 255)とInt型の整数(-32768 〜 32767)が扱える

<変数名、プロシージャ名、関数名について>
半角の英文字で始まり英文字、数字、'_'が使用できる。大文字、小文字の区別はしない。また、文字数の制限はない。
※'TIME' も 'time' もMYU BASICでは同じと判断されます。

Byte TIME
For TIME=1 To 10
  前進 TIME*2  //TIMEの倍前進する
  右回り 5
Next

上のFor Nextでは変数TIMEの値を1から10まで1づつ増やしFor Nextの間の<文>(命令)を繰返し実行します。
前進の引数(パラメータとも呼ぶ)に注目してください。TIME*2と<式>が使われています。このようにMYU BASICでは引数に<式>が使えます。ここではTIMEの2倍が前進の引数になります。
※    前進 <<TIME  //左シフト演算子を使ってもTIMEの倍前進する
また//以下は次の行までコメントが書けます。コメントを残しておくと後からプログラムの内容が理解しやすくなります。
これを転送/実行すると渦巻き旋回のような動きをします。
If EndIf、Do Loop、For Nextなどの制御文は入れ子構造といって内部に別の制御文を書くことができます。その際も下のように制御文どおしセットで段落を付けて書くと見やすくなります。

Byte TIME,V
For V=1 To 5
  For TIME=V To 10
    前進 TIME*2  //TIMEの倍前進する
    右回り V
  Next
Next

MYUUSB-1基板は入力ポートを4個(In1-In4)持っています。基板の触覚は、入力ポートのIn2(左)とIn3(右)に接続されています。下の例は入力ポートの状態を調べ、触覚が障害物を感知したら後退して向きを変えるプログラムです。
MYU BASIC言語仕様リファレンスと一緒にご覧ください。
触覚は左右にあり、どちらかが壁を感知したら「後退して向きを変える」というプログラムとなっています。
最初はIfLo() Thenを使った例です。If文は条件が成り立ったらThenからEndIfまでの<文>(命令)を実行します。
※入力ポートはプルアップ(High)されています。触覚が基板角の2mmビスに触れるとIn2、In3がLowとなり壁を感知できます。(Highは 1、Lowは 0)

Do
  前進       //引数を省略すると0にセットされ待ち時間なしで次の命令を実行できる
  IfLo(2) Then   //触覚左(In2)が押された場合ThenからEndIfの間を実行
    後退 10
    左回り 10
  EndIf
  IfLo(3) Then   //触覚右(In3)が押された場合ThenからEndIfの間を実行
    後退 10
    左回り 10
  EndIf
Loop

下は関数 In() を使った例です。In2とIn3のどちらかがLowの場合ThenからEndIfの間を実行:OR(論理和)条件
※In(ポート番号)は、入力ポートの状態をHigh=1、Low=0として返す

Do
  前進              //引数を省略すると0にセットされ待ち時間なしで次の命令を実行できる
  If In(2)=0 OR In(3)=0 Then //左右どちらかの触覚が壁を感知したらThenからEndIfの間を実行
    後退 10
    左回り 10
  EndIf
Loop

下は Else を使った例です。Elseは、If文の条件が成り立たなかった場合、ElseからEndIfまでの<文>(命令)を実行します。

Do
  If In(2)=0 OR In(3)=0 Then //左右どちらかの触覚が壁を感知したらThenからElseの間を実行
    後退 10
    左回り 10
  Else            //条件が成り立たなかったらElseからEndIfの間を実行
    前進
  EndIf
Loop

条件ループ文を使った例です。In2とIn3がHigh(両方押されていない状態)の間、Do Loop間を繰り返し実行:AND(論理積)条件
※Do While In(2) AND In(3) は、Do While In(2)=1 AND In(3)=1 と同じ結果です。

Do
  Do While In(2) AND In(3)  //左右両方の触覚が壁を感知しない間、Do Loop間を繰り返し実行
    前進
  Loop
  後退 10
  左回り 10
Loop

PB(ポートB)、PC(ポートC)の値を直接読んだり出力することでも同じことが出来ます。詳しくはこちらをご覧ください。
※ここでは2進数(B'101')を使っています。2進数や16進数はこちらをご覧ください。

Do
  PC=B'101'             //ポートCに前進の信号を出力
  If (PB AND B'1100000')<>B'1100000' Then //ポートBのビット5(In3)と6(In2)がB'11000000'以外ならThenからEndIfの間を実行
    PC=B'10000010'         //ポートCに後退の信号を出力
    Wait 10             //1秒のウエイト
    PC=B'10000001'            //ポートCに左回りの信号を出力
    Wait 10             //1秒のウエイト
  EndIf
Loop

MYU BASICでは命令の引数を省略すると引数が 0 にセットされます。
※上の例の前進のように引数を省略すると前進の信号を出した後、待ち時間なしで次の命令を実行できます。

◆Buzzer命令
Buzzer命令を使うと一定時間ブザー音を出すことができます。

Buzzer <式>    //<式> x 0.1秒の間 ブザー音を鳴らす

BuzzerやPulsOut命令は、直前のロボットの動きを続けますからブザー音を出しながらロボットを動かすことができます。
下の命令を実行すると1秒間ブザーを鳴らしながら前進します。

前進
Buzzer 10

◆メロディのプログラム
PulsOut命令を使うとメロディのプログラムが可能になります。

PulsOut <式1>,<式2>    //<式1> x 0.1秒の間 パルス幅<式2>の音を鳴らす

下は音階を表にしたものです。(※パルス幅が大きいほど低い音になります)

音階 ド# レ# ファ ファ# ソ# ラ#
パルス幅 80 75 71 67 63 60 56 53 50 47 44 42
パルス幅 39 37 35 33 31 29 27 26 24 23 22 20


下の例は、電子音命令を使って「ドレミ」を繰り返し演奏するプログラムです。

//「ドレミ」を繰り返し演奏
Do
  PulsOut 5,80      //「ド」の音をを0.5秒ならす
  PulsOut 5,71      //「レ」の音をを0.5秒ならす
  PulsOut 5,63      //「ミ」の音をを0.5秒ならす
  停止 5         //停止命令を使うと0.5秒間音を出ない
Loop

◆PortOut命令とPC命令
ポート出力命令やPC命令を使うと4個のモータを自由にコントロールできます。

PortOut <式1>,<式2>  //<式1> x 0.1秒だけ <式2>をポートCに出力する
PC=<式>         //<式>の値をポートCに出力する

下の表から"前進"は5、"モーター3左"は64、これを加えた値 69 をポートCに出力すると前進しながらモーター3左を実行できます。

PortOut 10,69       //前進とモーター3左を1秒間行う
PortOut 10,B'1000101'  //前進とモーター3左を1秒間行う(2進数を使うとビット操作が解りやすい)

PC=69           //前進とモーター3左を出力
Wait 10          //1秒待つ
PortOut 10,B'1000101' //前進とモーター3左を出力(2進数を使うとビット操作が解りやすい)
Wait 10          //1秒待つ

※PC命令は時間の設定ができないのでWait命令を使う

ポートCの出力表(RC0-RC7)
命令 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 10進値 2進値
停止                 0 B'0'
左前               1 B'1'
前進             5 B'101'
右前               4 B'100'
モーター3左               64 B'1000000'
モーター3右               8 B'1000'
左後               2 B'10'
後退             130 B'10000010'
右後               128 B'10000000'
右回り             129 B'10000001'
左回り             6 B'110'
モーター4左               16 B'10000'
モーター3右               32 B'100000'

◆PWM(パルス幅変調)制御
PWM制御は、右図のようにモーターのON,OFFの時間(デューティ比)を変えることでモーターの電圧をコントロールする方法です。
例えば電圧が3V、ONの時間が2、OFFの時間が1とするとモーターは 3V x デューティ比(2/3) = 2Vの電圧で駆動することになります。

下のプログラムは、PWM制御を利用して左右のモーターの回転差によってロボットを緩旋回するものです。

//右緩旋回
Byte C
Do
  For C=0 To 20 //繰返し数を大きくすると大回りになる
    前進    //両モーターがON
  Next
  For C=0 To 10 //繰返し数を大きくすると小回りになる
    左前    //右モーターだけOFF
  Next
Loop

◆DEFINE(定義)
DEFINEは第1引数の名前を定義して第2引数から次の行までの<文>に置き換えます。解かりやすい命令や定数を定義したりします。
※定義名は数字以外で始まり半角アルファベット、全角文字、数字が使えますが半角と全角の混在は禁止です。

DEFINE ARG,10
DEFINE Uターン,後退 ARG 左回り ARG
前進 ARG        //最初に1秒前進をする
Do
  前進              //引数を省略すると0にセットされ待ち時間なしで次の命令を実行できる
  If In(2)=0 OR In(3)=0 Then //In2またはIn3(OR条件)がLowならThenからEndIfの間を実行
    Uターン
  EndIf
Loop

◆プロシージャ
Proc <プロシージャ名>(Int <ローカル変数>,Int <ローカル変数>,・・)  ※Intを省略するとByte型になる
  <文>     ※'ExitProc'命令を使うと<文>の途中から戻れる
EndProc

プログラムで何回も同じ処理をすることがあります。この部分をサブルーチン(部品)化するとプログラムが見やすくコンパクトになります。MYU BASICではプロシージャと関数にあたりますが両者の違いは関数は値を返しますがプロシージャは返しません。
下は前のプログラムにMELODYのプロシージャを追加したものです。最初と障害物を感知した時、動作します。

MELODY        //MELODYの呼び出し 引数は省略
Do
  前進              //引数を省略すると0にセットされ待ち時間なしで次の命令を実行できる
  If In(2)=0 OR In(3)=0 Then //In2またはIn3(OR条件)がLowならThenからEndIfの間を実行
    MELODY          //プロシージャMELODYの呼び出し
    後退 10
    左回り 10
  EndIf
Loop
Proc MELODY(W)      //プロシージャMELODYの宣言 呼び出しに引数が省略されたのでWは内部のローカル変数となる
  停止
  For W=48 TO 34 Step -2 //Wの増減値をStep -2で指定、Wを48から34まで2づつ減らしFor Next間を繰返し実行する
    PulsOut 2,W      //第2引数Wのパルス幅の音を0.2秒鳴らす
  Next
EndProc

プロシージャや関数はそのままではなにも動作しません。呼び出しによって動作し処理の終わりとともに呼ばれた場所に戻ります。どこに在ってかまいませんがプログラムの見やすさを考えると後半に置いた方が良いでしょう。
※最初に実行する部分(上の例ではMELODYからLoopまで)をメインプログラム、プロシージャや関数部分をサブプログラムと呼びます。

MYU BASICでは変数を使った演算ができます。下のプログラムは触覚が障害物を感知した回数をカウントし、3回ごとにメロディを2回鳴らすというものです。

Byte C             //変数Cを宣言
MELODY             //MELODYの呼び出し 引数は省略
C=0               //Cをゼロにする
Do
  前進              //引数を省略すると0にセットされ待ち時間なしで次の命令を実行できる
  If In(2)=0 OR In(3)=0 Then //In2またはIn3(OR条件)がLowならThenからEndIfの間を実行
    C=C+1          //Cを+1する
    If C=3 Then       //Cが3なら
      MELODY
      C=0
    EndIf
    MELODY          //プロシージャMELODYの呼び出し
    後退 10
    左回り 10
  EndIf
Loop

Proc MELODY(W)      //プロシージャMELODYの宣言 呼び出しに引数が省略されたのでWは内部のローカル変数となる
  停止
  For W=48 TO 34 Step -2 //Wの増減値をStep -2で指定、Wを48から34まで2づつ減らしFor Next間を繰返し実行する
    PulsOut 2,W      //第2引数Wのパルス幅の音を0.2秒鳴らす
  Next
EndProc

◆関数
Function <関数名>(Int <ローカル変数>,Int <ローカル変数>,・・)  ※Intを省略するとByte型になる
  <文>
  <関数名>=<式>    ※関数の戻り値 'ExitFunction'命令を使うと<文>の途中から戻れる
EndFunction

プロシージャと違い関数は値を返します。下の例は、PBMASK() という関数の値(戻り値という)を プロシージャ BZ の引数として使っています。このように関数は引数など<式>の中で使うことができます。
このプログラムを実行してポートBの5,6ビット(左の触覚:In2と右の触覚:In3)をアース(ビスに接触)してみてください。ブザーの回数が変わるはずです。
※関数は<式>以外でもプロシージャのように独立して使うこともできます。

//プロシージャと関数の使用例:ポートBの5,6ビット(In2とIn3)の状態をブサーの回数で知らせる
Do
  BZ PBMASK() //プロシージャBZの呼び出し 引数に関数PAMASK()を使う 関数の呼び出しは、引数のない場合でも()で囲う
  Wait 10   //1秒のウエイト
Loop

Proc BZ(C)    //引数だけブザーを鳴らせる
  Do While C  //Cが0以外ならDo Loop間を繰り返す
    Buzzer 1 //ブザーを0.1秒鳴らす
    Wait 1
    --C    //C=C-1
  Loop
EndProc

Function PBMASK()     //プロシージャや関数の宣言は、引数の無い場合でも()で囲う
  PBMASK=(PB AND B'1100000')/32 //関数名に代入することで戻り値になる ポートBの5,6ビットをマスクして戻り値とする
EndFunction

◆モーターのノイズについて
MYUUSB-1基板は48MHzと高速で動作していますのでモーターを動かすとノイズの影響を受けやすくなります。
モーターの端子に1000pFぐらいのセラミックコンデンサーをハンダ付けするとよいでしょう。

◆PowerOnStartについて
パワーオンスタート命令がプログラムの先頭に入っていると基板のスイッチONとともにプログラムがスタートします。この状態で新しいプログラムを転送するには、一旦スイッチを切り、転送ケーブルを接続してから基盤のタクトスイッチを押したまま基盤のスイッチを入れれば新しいプログラムを転送できます。

◆MYU BASICエラーについて
myuusbbasic.exeでは転送ボタンを押した時、エラーチェックを行います。
文法エラーがあった場合、ダイヤログが現れエラー部分が表示され転送は中止されます。

◆MYUUSB-1制御基板のエラーについて
MYUUSB-1制御基板は深さ16レベル以上のサブプログラム呼び出しやIXを128以上にセットしIXMを使うとエラーとなり警告音を鳴らし続けます。
また電池の電圧が下がると転送エラーが起こり警告音を鳴らし続けることがあります。
※エラーの場合は一旦電源を切りプログラムを修正したり電池をかえたりして再転送してください。

※myuusbbasic.iniを編集(例えば、'前進'を'FF'に変える)すると命令をカスタマイズすることができます。
※いろいろなロボットの工作例はこちら
※メロディなど音階の設定はこちら
※ゆっくり前進したいなどモーターのスピードをコントロールするにはこちら
※RCサーボの制御はこちら
そのほかいろいろなことが出来ます。詳しくは下のMYU BASIC言語仕様やリファレンスなどをご覧ください。

●リアルタイム計測
MYUUSBBASIC.EXEを立ち上げ、基板とPCを転送ケーブルで接続するとリモート制御やリアルタイム計測が出来ます。

光センサー(CDS)にあたる光を遮ってみてください。アナログ計測値が変化します。プログラムのしきい値の参考になります。デジタル入力ではIn4部分が○から●となります。
アナログ入力は明るさによって値が0-255に変化しますが、デジタル入力の場合、明るいか暗いかだけの判断となります。
※光センサー(CDS)は、デジタル入力ではIn4に、アナログ入力ではAN10に接続されています。

リアルタイムアナログ計測値を参考に制御プログラムを作ってみます。
//一定の明るさで停止するロボット
Byte CDS        //アナログ計測値をセットする変数をByte型で宣言
Do
  CDS=AN(10)     //AN10のアナログ値を計測、変数CDSにセット
  If CDS<100 Then   //明るい場合は前進(0-99)
    前進
  ElseIf CDS<150 Then //一定の明るさで停止(100-149)
    停止
  Else         //暗い場合は後退(150-255)
    後退
  EndIf
Loop

●入出力プログラム  (MYUUSB-1基板の回路図)
《主な仕様》
動作電圧: 2.5V-5.5V
クロック:48MHz タイマー0:250KHz
プログラムサイズ:6141bytes
変数エリア:128bytes サブルーチンの深さ:16
最大4個のDCモータ駆動(各モータドライバ最大負荷:1W以内)
サーボモータ8個まで制御可能、またメロディのプログラムも可能
デジタル入力4BIT + 出力8BIT
アナログ入力:2-8チャンネル(8/10BIT)
※モータ駆動の数によって異なる
EEPROM(256bytes)の読書き、16BIT符号付四則演算、デバッグ機能など

《PIC18F14K50設定情報》
1:+V
2:OSC1
3:OSC2
4:RA3(入力) In1
5:RC5(出力) M4L,S1
6:RC4(出力) M4R,S2
7:RC3(出力) M3L,AN7,S3
8:RC6(出力) M3R,AN8,S4
9:RC7(出力) M2L,AN9,S5
10:RB7(出力) LEDと圧電ブザー
11:RB6(入力) In2
12:RB5(入力) In3,AN11
13:RB4(入力) In4,AN10
14:RC2(出力) M2R,AN6,S6
15:RC1(出力) M1L,AN5,S7
16:RC0(出力) M1R,AN4,S8
17:VUSB 未使用
18:D-
18:D+
20:-V

◆PortOut命令
上の回路図のとおりポートC(RC0-RC7)は出力に設定されていてモータの回転を制御しています。また、右下図のようにLEDを配線してLEDを光らせることができます。
PortOut命令はポートCに値を出力でき4個のモータを自由にコントロールできます。
例えば、"前進"と"モーター3左"と同時に動かすには下の表からRC6,RC2,RC0のビットを'1'にすることで可能になります。(10進値で69、2進値ではB'1000101')

PortOut <式>,<式>   //第1引数(0-255)x0.1秒だけ 第2引数の値(0-255)をポートCに出力する

システム変数PCを使いポートCに直接、値を出力することもできます。Wait命令と組み合わせるとPortOut命令と同じ結果になります。

PC=<式>   //<式>の値をポートCに出力する
Wait <式>  //<式>の値(0-255)x0.1秒だけ待つ

命令 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 10進値 2進値
停止                 0 B'0'
左前               1 B'1'
前進             5 B'101'
右前               4 B'100'
モーター3左               64 B'1000000'
モーター3右               8 B'1000'
左後               2 B'10'
後退             130 B'10000010'
右後               128 B'10000000'
右回り             129 B'10000001'
左回り             6 B'110'
モーター4左               16 B'10000'
モーター3右               32 B'100000'

※引数の入力に2進表記を使うとビット操作が解りやすくなります。特にLED制御に便利 (例: B'10100001')
※ポートCは、出力命令以外の命令の間も出力状態を維持します。前進の後、ブザー命令を実行するとブザーを鳴らしながら前進します。

//0.5秒ごとにポートC出力を1増やす(LED制御)
Do
    ++PC
    Wait 5
Loop

◆デジタル入力
In1-In4はデジタル入力ポートです。これらはプルアップされていて入力が無い状態では'1'、入力があると'0'になります。
入力の有無は、ポートAとポートBの値を読むことで可能ですが、MYU BASICにはIn(1-4)やIfHi(1-4) Then、IfLo(1-4) Thenなどの命令が用意されています。下はタクトスイッチ(In1)が押されたときブザーを鳴らすプログラム例です。上の回路図からスイッチが押されるとIn1(RA3)がLowになることを理解してください。

  In1       10進値 2進値
ポートA 1 0 0 0 8 B'1000'
  In2 In3 In4         10進値 2進値
ポートB 1 1 1 0 0 0 0 112 B'1110000'




//IfLo(1)を使う方法
Do
  IfLo(1) Then
    Buzzer 1
  EndIf
Loop
//In(1)を使う方法
Do
  If In(1)=0 Then
    Buzzer 1
  EndIf
Loop
//ポートAのビット3(RA3)をチェックする
Do
  If Not(PA AND B'1000') Then
    Buzzer 1
  EndIf
Loop

ポートAのビット3(RA3)だけを調べる方法ですがビット3は2進表記でB'1000'、10進表記で8です。これとポートAとAND演算を行うことで可能です。このようにAND演算して特定のビットだけを選別することをマスクするといいます。

◆アナログ入力
デジタル入力が有るか無いか'1'か'0'を返すのに対し、アナログ入力は入力電圧を8BIT(0-255)または10BIT(0-1023)の値として返します。
アナログ入力は、AN,n 命令を使います。n はアナログポートの番号です。通常はポートBのAN10とAN11を使ってください。
※AN4-AN9はモータ制御を行う場合使えなくなります。

下の例はIn2(AN10)に光センサー(CDS)を接続しデジタルとアナログ入力の違いを表しています。
デジタルの場合、明るさの判断は一定ですが、アナログの場合プログラムでしきい値を変えることができます。
※In4とAN10は同じ場所です。デジタル入力はIn4、アナログ入力はAN10として機能します。
※CDSは明るいと抵抗値が下がり"入力あり"と同じ状態になり暗くなると逆に"入力なし"となる。

//CDSを使って明るさを計測、暗くなったらブザーを鳴らす(デジタル入力例)
Do
    If In(4)=0 Then  //In4に接続したCDSが暗くなったらEndIfまで実行
        Buzzer 1
    EndIf
Loop

//CDSを使って明るさを計測、暗くなったらブザーを鳴らす(アナログ入力例)
Byte A         //変数Aを宣言
Do
    A=AN(10)      //AN10に接続したCDSを8ビットアナログ計測、変数Aにセット
    If A > 100 Then  //アナログの場合、明るさのしきい値を変えることできる
        Buzzer 1
    EndIf
Loop

●LEDの制御
右図のようにLEDを配線して制御します。LED制御には2進数や16進数を使うと便利です。
2進数の'1'はLEDの点灯、'0'は消灯となります。
下の製品は、LED制御できます。

■MYU-532 LED計測制御キット(LEDハンダ付けタイプ)2,052円(8%税込)
■MYU-533 LED計測制御基板(LEDハンダ付け済み) 2,160円(8%税込)
■MYU-535 LED計測制御グループ学習セット(ハンダ付け済み) 2,538円(8%税込)


//LEDを1つおき交互に光らせる
Do
  PortOut 1,B'01010101'   //ポートCにB'01010101'を0.1秒間出力
  PortOut 1,B'10101010'   //ポートCにB'10101010'を0.1秒間出力
Loop

//0.1秒ごとにポートCの値を1づつ増やす
Do
  ++PC     //ポートCを1増やし出力
  Wait 1    //0.1秒の待ち時間
Loop

//LED Shift タクトスイッチ(In1)を押している間LEDが左へ離している間右へ移動点灯する
PC=1        //ポートCに1を出力
Do
  Wait 1     //0.1秒のウエイト
  IfHi(1) Then  //タクトスイッチOffで左シフト
    If PC=B'10000000' Then
      PC=1
    Else
      PC=<<PC //ポートCを左シフト
    EndIf
  Else      //タクトスイッチOnで右シフト
    If PC=1 Then
      PC=B'10000000'
    Else
      PC=>>PC //ポートCを右シフト
    EndIf
  EndIf
Loop

◆2進数と16進数
コンピュータデータの最小単位はビットです。1か0、ONかOFFかです。
これが8つ集まった単位がバイトとなります。
1バイトはB'00000000'からB'11111111'までの数、0から255までの数字を扱います。
16進数は4ビットを0からFの1文字で表しますから1バイトは上位4ビット、下位4ビットの2文字で表現します。
上の表から後退を2進数で表すとB'00100010'となり10進数では34となります。
これを16進では左表から&h22と表します。
ポート出力命令や下のLED制御ではビットごとのデータを扱うので2進数や16進数を使うと便利です。

MYU BASICの16進表記
前進 &h0A    //16進入力 10進数の10と同じ
前進 H'0A'   //16進入力 10進数の10と同じ

MYU BASICの2進表記
前進 B'1010'   //2進入力 10進数の10と同じ

MYU BASICのリテラル表記
前進 "@"   //リテラル入力 @の文字コードは64なので、前進 64 となる


MYU BASIC言語仕様
【コメント】   // 以下は次の行までなにも実行しない。注釈などを書く

【定義】     DEFINE 定義名,<文> 第1引数の名前を定義して第2引数から次の行までの命令に置き換える
         ※定義名は数字以外で始まり半角アルファベット、全角文字、数字が使えるが半角と全角の混在は禁止

【変数宣言】   Byte 変数,変数,配列(定数)・・・
         Int 変数,変数,配列(定数)・・・ Int(-32768 〜 32767)型の変数宣言

【代入文】    変数=<式>
 
【ステートメント】 命令 <式>,<式>    引数の数は命令によって異なる 引数を省略すると 0 にセットされる

【制御文】    If <式1> Then     <式1>=0なら偽 0以外なら真<文1>を実行する
           <文1>
         ElseIf <式2> Then    <式2>=0なら偽 0以外なら真<文2>を実行する:省略可
           <文2>
         ElseIf <式3> Then    <式3>=0なら偽 0以外なら真<文3>を実行する:省略可
           <文3>
         Else           偽なら<文4>を実行する:省略可
           <文4>
         EndIf

         IfHi(1-4) Then      入力ポートIn(1-4)がHighなら真<文1>を実行する
           <文1>
         ElseIf <式> Then    <式>=0なら偽 0以外なら真<文2>を実行する:省略可
           <文2>
         Else           偽なら<文3>を実行する:省略可
           <文3>
         EndIf

         IfLo(1-4) Then      入力ポートIn(1-4)がLowなら真<文1>以下を実行する
           <文1>
         ElseIf <式> Then    <式>=0なら偽 0以外なら真<文2>以下を実行する:省略可
           <文2>
         Else           偽なら<文3>を実行する:省略可
           <文3>
         EndIf

         Do    Do Loop間を繰返し実行
           <文>
         Loop

         Do While <式>     <式>が0以外ならDo Loop間を繰返し実行
           <文>
         Loop

         Do
           <文>
         Loop While <式>     <式>が0以外ならDo Loop間を繰返し実行

         ExitDo      Do Loopからの抜け出し

         For 変数=<式:初期値> To <式:最終値> Step <定数:値>  変数に初期値を代入
           <文>         Step値が正の場合、変数<=最終値なら<文>を実行
         Next            Step値が負の場合、変数>=最終値なら<文>を実行
         変数はStep値が加算され終了値以内ならFor Next間を繰返す
         ※Stepを省略するとStep 1となる

【プロシージャ】 Proc <プロシージャ名>(Int <ローカル変数>,Int <ローカル変数>,・・) Intを省略するとByte型になる
           <文>
         EndProc

         ExitProc     プロシージャからの抜け出し

【関数】      Function <関数名>(Int <ローカル変数>,Int <ローカル変数>,・・) Intを省略するとByte型になる
           <文>
           <関数名>=<式>  関数の戻り値
         EndFunction

         ExitFunction    関数からの抜け出し

<式>のなかで使用できるもの
1、10進定数    A=123
2、16進定数     A=&hF0 A=H'11'+H'1F' A=&h1F+1
3、2進定数     A=B'10110011' AND B'00001111'
4、リテラル定数  A="A" A="@"+1
5、変数      A=A+B B(A+1)=0
6、システム変数  PA(ポートA)、PB(ポートB)、PC(ポートC)、T0H、T0L(タイマ0(250KHz)の上位・下位8ビット)
         例 A=PA PC=&h1f T0H=0 A=T0L
         TRISA=<定数> 設定専用:ポートAの入出力をビットごと(0:出力 1:入力)に設定する
         TRISB=<定数> 設定専用:ポートBの入出力をビットごと(0:出力 1:入力)に設定する
         TRISC=<定数> 設定専用:ポートCの入出力をビットごと(0:出力 1:入力)に設定する
7、算術演算子   + - * / MOD(剰余) A=A+1 A=B*(A+1) A=1+B/3 A=10 MOD 3
8、関係演算子   = > < >= <= <> 真なら1、偽なら0を返す
9、論理演算子   AND OR XOR A=A AND &H1F
10、()       ()内の計算は最優先
11、<<単項    1ビット左シフトする B=<<A Aの倍がBに入る Aは変化しない。
12、>>単項    1ビット右シフトする B=>>A Aの半分がBに入る Aは変化しない
13、-単項     符号反転 A=-A A=-(1-2)
14、Not 単項    単項が0なら1、0以外なら0を返す A=Not A
15、++変数     インクリメント演算子 ++A Aを+1する B=++A Aが1の場合AもBも2となる
16、--変数     デクリメント演算子 --A Aを-1する B=--A Aが1の場合AもBも0となる
17、In(定数) デジタル入力ポート In(ポート番号)の値をHigh=1、Low=0として返す
18、AN(定数) アナログ入力ポート AN(ポート番号)の値を8BIT(0-255)の値で返す
19、AN10(定数) アナログ入力ポート AN10(ポート番号)の値を10BIT(0-1023)の値で返す
20、関数(<式&gt,<式&gt,・・)

演算子の優先順位について
単項演算子(++ -- << >>) > 算術演算子(* / MOD) > 算術演算子(+ -) > 関係演算子 > 論理演算子 の順で計算する
関係演算子を使った計算:真なら1 偽なら0を返す
1=0:偽 1=1:真 1=2:偽  1=1+1 計算結果は0 ※算術演算子を優先、関係演算子を後に計算
1>0:真 1>1:偽 1>2:偽  1+1>1 計算結果は1
1<0:偽 1<1:偽 1<2:真
1>=0:真 1>=1:真 1>=2:偽
1<=0:偽 1<=1:真 1<=2:真
1<>0:真 1<>1:偽 1<>2:真

論理演算子を使った計算:AND 論理積 OR 論理和 XOR 排他的論理和
B'00001111' AND B'00010001' 計算結果はB'00000001'(1)
B'00001111' OR B'00010001' 計算結果はB'00011111'(31)
B'00001111' XOR B'00010001' 計算結果はB'00011110'(30)

※MYU BASICではInt型変数を使わないかぎり値は全てByte型(0-255)となり以下の注意が必要です。
※Byte型の-1は255と判断されます。1-2の計算結果は255となり、255(-1)+1は0となります。
※一般に-1<0は真ですがByte型では255<0と判断され偽となります。
※同様にFor A=-1 To 1 もA=255 To 1と判断されFor Nextループを実行しません。
※またFor A=x To 255の場合、Aが255の次に0に戻る為、無限ループとなります。
※同様にFor A=x To 0 Step -1の場合、Aが0の次に255となる為、無限ループとなります。
※Int型変数の場合、この問題はありません。
※T0L,T0Hは連動して動く250KHzの16ビットタイマです。T0Lは0.004mSec,T0Hは0.004x256=1.024mSecで動作し
524.288mSecで一周します。

<変数名、プロシージャ名、関数名について>
半角の英文字で始まり英文字、数字、'_'が使用できる。大文字、小文字の区別はしない。
文字数の制限はない。また文字数によってコンパイルされるプログラムサイズは変化しない。

<変数>
変数はByte型またはInt型で宣言してから使う。Byte型またはInt型で宣言した変数はグローバル変数となり
プログラム中どこでも有効です。変数は','コンマで区切って複数宣言できる。配列は()内に数を指定する。
ただし使える変数、配列、内部スタックの合計は128バイトまで。
※プロシージャ、関数を呼出すとローカル変数の数だけ関数はさらに戻り値の1バイト分内部スタックを使います。
なおプロシージャ、関数から戻ると内部スタックは開放されます。
例:
Byte Abc,DD(3)  //変数AbcとDD(0)からDD(3)までの配列が使える

<プロシージャと関数>
プログラムで何回も同じ処理をすることがあります。この部分をプロシージャや関数としてまとめ呼び出すように
するとプログラムが見やすくコンパクトになります。
また引数を設定して値を変えて呼び出すことで複雑な処理も可能になります。
関数は値を返すことができ<式&gtの中で使うことができます。
プロシージャはProc <プロシージャ名>() EndProc、関数はFunction <関数名>() EndFunctionの間に
処理を書きますが、そのままではなにも動作しません。呼び出しによって動作し処理の終わりとともに
呼ばれた場所に戻ります。また()内に変数を宣言するとローカル変数となります。
呼び出しはプロシージャ名、関数名で行いますが引数は省略できます。関数は引数を()で囲う。
ローカル変数は引数を値渡しで受け取ります。
関数は内部で値を関数名に代入することで外部に返します。
※呼び出し側の引数よりローカル変数を多く宣言した場合、多い部分は受け渡しの無いローカル変数として使えます。
※プロシージャ、関数内からプロシージャや関数の呼び出しは深さ16レベルまで可能。
※ローカル変数や関数は内部スタックを使うため、深い呼び出しはスタックエラーとなります。
※ローカル変数は局所変数ともいい宣言したプロシージャ、関数内のみ有効な変数です。
呼び出し:     <プロシージャ名> <式&gt,<式&gt,・・・
         A=<関数名>(<式&gt,<式&gt,・・・)+1
         If <関数名>(<式&gt,<式&gt,・・・)=1 Then

//プロシージャと関数の使用例:ポートAの5,6ビット(In2とIn3)の状態をブサーの回数で知らせる
Do
  BZ PBMASK() //プロシージャBZの呼び出し引数に関数PAMASK()を使う関数の呼び出しは引数のない場合でも()で囲う
  Wait 10   //1秒のウエイト
Loop
Proc BZ(C)    //引数だけブザーを鳴らせる
  Do While C  //Cが0以外ならDo Loop間を繰り返す
    Buzzer 1 //ブザーを0.1秒鳴らす
    Wait 1
    --C    //C=C-1
  Loop
EndProc
Function PBMASK()         //ポートBの5,6ビットをマスクして戻り値とする
  PBMASK=(PB AND B'1100000')/32 //関数名に代入することで戻り値になる
EndFunction

◆16進数、2進数やリテラル入力例

前進 &h0A    //16進入力 10進数の10と同じ
前進 B'1010'   //2進入力 10進数の10と同じ
前進 "@"     //リテラル入力 @の文字コードは64なので、前進 64 となる

<MYU BASICエラーについて>
MYU BASICでは転送ボタンを押した時、コンパイルと同時にエラーチェックを行います。
文法エラーがあった場合、ダイヤログが現れエラー部分が表示されコンパイルは中止されます。
正しくコンパイルされた場合、右下のボックスにコンパイルサイズやミュウロボ命令が表示されます。

◆PowerOnStartについて
PowerOnStart命令がプログラムの先頭に入っていると基板のスイッチONとともにプログラムがスタートします。
この状態で新しいプログラムを転送するには、一旦スイッチを切り、転送ケーブルを接続してから基盤のタクト
スイッチを押したまま基盤のスイッチを入れれば新しいプログラムを転送できます。

<MYUUSB-1制御基板のエラーについて>
MYUUSB-1制御基板は深さ16レベル以上のプロシージャや関数の呼び出し、変数、配列、内部スタックの合計が
128バイトを越えた場合エラーとなり警告音を鳴らし続けます。
※エラーの場合は一旦電源を切りプログラムを修正してから再転送してください。

<MYU BASIC リファレンス>

※<式>のなかで使用できるものは、こちら!
命令その他 使用例および解説
// // 以下は次の行までなにも実行しない。注釈などを書く
DEFINE 定義名,<文> 第1引数の名前を定義して第2引数から次の行までの命令に置き換える
Byte 変数,変数,配列(定数)・・・ Byte ABC,D(2),XX Byte型の変数や配列をコンマで区切って宣言する
配列は()内に数を指定する。上の例ではD(0)からD(2)までの配列として使える
Int 変数,変数,配列(定数)・・・ Int ABC,D(2),XX Int型の変数や配列をコンマで区切って宣言する
配列は()内に数を指定する。上の例ではD(0)からD(2)までの配列として使える
PwerOnStart プログラムの先頭に置くと電源オンとともにプログラムが始まる
前進 <式> 前進 10+A 両輪を前転させた後、引数の値(0-255)x0.1秒だけ待つ
後退 <式> 後退 10 両輪を後転させた後、引数の値(0-255)x0.1秒だけ待つ
右回り <式> 右回り 10 左車輪を前転・右車輪を後転させた後、引数の値(0-255)x0.1秒だけ待つ
左回り <式> 左回り 10 右車輪を前転・左車輪を後転させた後、引数の値(0-255)x0.1秒だけ待つ
停止 <式> 停止 10 全モーターを停止させた後、引数の値(0-255)x0.1秒だけ待つ
左前 <式> 左前 10 左車輪を前転させた後、引数の値(0-255)x0.1秒だけ待つ
左後 <式> 左後 10 左車輪を後転させた後、引数の値(0-255)x0.1秒だけ待つ
右前 <式> 右前 10 右車輪を前転させた後、引数の値(0-255)x0.1秒だけ待つ
右後 <式> 右後 10 右車輪を後転させた後、引数の値(0-255)x0.1秒だけ待つ
モーター3左 <式> モーター3左 10 第3モーターを左回転させた後、引数の値(0-255)x0.1秒だけ待つ
モーター3右 <式> モーター3右 10 第3モーターを右回転させた後、引数の値(0-255)x0.1秒だけ待つ
モーター4左 <式> モーター4左 10 第4モーターを左回転させた後、引数の値(0-255)x0.1秒だけ待つ
モーター4右 <式> 専用) モーター4右 10 第4モーターを右回転させた後、引数の値(0-255)x0.1秒だけ待つ
Wait <式> Wait 10 引数の値(0-255)x0.1秒だけ前の状態を続ける
Buzzer <式> Buzzer 10 引数の値(0-255)x0.1秒だけブザーを鳴らす
WaitIn1 リミットスイッチ(In1)が押されるまで以前の状態を続ける
Servo <式>,<式> Servo 185,2 第1引数のパルス幅(30-255)を第2引数のサーボ(1-6)にセット
PulsOut <式>,<式> PulsOut 10,30 第1引数(1-255)x0.1秒だけ第2引数:パルス幅(1-255) の音を鳴らす
PortOut <式>,<式> PortOut 10,B'101' 第1引数(1-255)x0.1秒だけ第2引数の値をポートCに出力する
LoopProc プロシージャ名,定数 LoopProc BZ,3 第1引数のプロシージャを第2引数の回数(0-255)を繰り返す。回数が0の場合は無限に繰り返す
Delay <式> Delay 1000 引数の値x0.001秒だけ待つ
Init Init ポートを初期化する
StepIn StepIn デバッグモードとなりレジスタの値をシリアルポートに出力。任意のシリアル入力でステップ動作となる
BreakP BreakP プログラムポインタ:コマンドコード:AH.A.ARG2.ARG1.IXP.IX.IXM.FSR.INDFレジスタの内容をシリアルポートに出力し停止。任意のシリアル入力で次の命令から再実行
If <式1> Then
  <文1>
ElseIf <式2> Then
  <文2>
ElseIf <式3> Then
  <文3>
Else
  <文4>
EndIf
<式1>が0以外なら<文1>を実行

<式2>が0以外なら<文2>を実行:省略可

<式3>が0以外なら<文3>を実行:省略可

上の条件以外なら<文4>を実行:省略可

If In(1)=0 Then   //In1のスイッチがONなら
  左前
ElseIf In(2)=0 Then //In2のスイッチがONなら
  前進
ElseIf In(3)=0 Then //In3のスイッチがONなら
  停止
Else          //上の条件以外なら
  右前
EndIf
IfHi(1-4) Then
  <文1>
ElseIf <式> Then
  <文2>
Else
  <文3>
EndIf
入力ポートIn(1-4)がHighなら<文1>を実行

<式>が0以外なら<文2>を実行:省略可

上の条件以外なら<文3>を実行:省略可

IfHi(1) Then   //In1のスイッチがOFFなら
  左前
ElseIf In(2) Then //In2のスイッチがOFFなら
  前進
Else         //上の条件以外なら
  右前
EndIf

IfLo(1-4) Then
  <文1>
ElseIf <式> Then
  <文2>
Else
  <文3>
EndIf
入力ポートIn(1-4)がLowなら<文1>を実行

<式>が0以外なら<文2>を実行:省略可

上の条件以外なら<文3>を実行:省略可

IfLo(1) Then    //In1のスイッチがONなら
  左前
ElseIf In(2)=0 Then //In2のスイッチがONなら
  前進
Else          //上の条件以外なら
  右前
EndIf

Do
  <文>
Loop
Do Loop間を繰返し実行
Do
  前進 10
  右回り 5
Loop
Do While <式>
  <文>
Loop
<式>が0以外ならDo Loop間を繰返し実行
Do While In(1) //In1がOFFなら繰返し実行
  前進
Loop
Do
  <文>
Loop While <式>
Do
  前進
Loop While In(1) //In1がOFFなら繰返し実行

<式>が0以外ならDo Loop間を繰返し実行
ExitDo Do Loop間から抜け出す
Do
  前進
  IfLo(1) Then
    ExitDo //In1がONならDo Loopから抜け出す
  EndIf
Loop
For 変数=<式:初期値> To <式:最終値> Step <定数>
  <文>
Next
変数に初期値を代入、Step値が正の場合、変数<=最終値なら<文>を実行
Step値が負の場合、変数>=最終値なら<文>を実行
変数はStep値が加算され終了値以内ならFor Next間を繰返す
※Stepを省略した場合Step値は1となる
※MYU BASICで扱う値は全てバイト型(0-255)です。-1は255と同じです。
※For A=-1 To 1 はA=255 To 1と判断されFor Nextループを実行しません。
※またFor A=x To 255の場合、Aが255の次に0に戻る為、無限ループとなります。
※同様にFor A=x To 0 Step -1の場合、Aが0の次に255となる為、無限ループとなります。
For PC=1 To 32 //ポートCに1から32までを0.1秒間隔で出力
  Wait 1
Next
Proc <プロシージャ名>(<ローカル変数>,<ローカル変数>,・・)
  <文>
EndProc

Function <関数名>(<ローカル変数>,<ローカル変数>,・・)
  <文>
  <関数名>=<式:関数の戻り値>
EndFunction
プロシージャ、関数を宣言する時、()内に変数を宣言するとローカル変数となる
呼び出しはプロシージャ名、関数名で行うが引数は省略できる
関数は引数を()で囲う
ローカル変数は引数を値渡しで受け取る
関数は内部で値を関数名に代入することで外部に返す
//In5(RB5)とIn3(RB6)の状態をブサーの回数で知らせる
Do
  BZ PBMASK()
  Wait 10
Loop
Proc BZ(C)
  Do While C
    Buzzer 1
    Wait 1
    --C
  Loop
EndProc
Function PBMASK()
  PBMASK=(PB AND B'1100000')/32
EndFunction
ExitProc プロシージャから抜け出し呼ばれた場所に戻る
ExitFunction 関数から抜け出し呼ばれた場所に戻る
※myubasic.iniを編集(例えば、'前進'を'FF'に変える)すると命令をカスタマイズすることができます。
※モーター制御命令などの出力命令は、出力命令以外の命令の間も出力状態を維持します。前進の後、Buzzerを実行するとブザーを鳴らしながら前進します。
※Servo命令の詳しい使い方はこちら