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-527 ミュウロボ基本セット(RS-232C) 3,456円(8%税込) ■MYU-528 ミュウロボベルト基本セット(RS-232C) 3,456円(8%税込) ■MYU-529 3軸ミュウロボ基本セット(RS-232C) 4,212円(8%税込) ■MYU-530 ミュウロボ制御基板(RS-232C・2モーター用) 2,376円(8%税込) ■MYU-531 ミュウロボ制御基板(RS-232C・3モーター用) 2,592円(8%税込)
●MYU BASIC プログラム | 言語仕様 | リファレンス | 入出力プログラム | LEDの制御 | サンプルプログラム
※MYU BASIC COMPILER (myubasic12.zip) はここからダウンロード(1.1M V1.25 2011/9/30版)できます。
●起動方法
●よくある質問
●プログラム
◆命令のカスタマイズ
※TABキーを使うと段落をつけるのに便利です。 これをコンパイルして転送/実行してみます。ロボットは多角形を描くような動きを繰返すはずです。Do Loopは間にはさまれた<文>を繰返し実行します。 プログラムは命令を順に実行しますが、制御文はその流れを変えることができます。またプログラムは保存ボタンを押してファイル名を指定し保存するようにしてください。 ※繰返し実行する制御文をループ文といいます。他にFor Nextループなどがある。 ※Do...Loopは無限ループとなりプログラムは永遠に終了しません。ループから抜けるにはDo...Loop内で ExitDo 命令を使います。 ※また Do WHile <式>...Loop や Do...Loop While <式> など条件を付けたループ文を使うとループから抜けられます。
◆制御文一覧
<式>のなかで使用できるもの 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) > 算術演算子(+ -) > 関係演算子 > 論理演算子 の順で計算する◆制御文のフローチャート 次はFor Next文です。ここではTIMEという名前の変数を使っています。変数は値(テータ)を入れる入れ物です。変数は使う前にはByte TIMEと変数名を宣言しなければなりません。ここではTIMEとしましたが変数名は自由につけられます。 ※MYU BASICで扱う値は、Byte型の整数(0 〜 255)です。688タイプやミュウロボ2基板では、Int型の整数(-32768 〜 32767)が扱える
<変数名、プロシージャ名、関数名について>
上のFor Nextでは変数TIMEの値を1から10まで1づつ増やしFor Nextの間の<文>(命令)を繰返し実行します。
Byte TIME,V
下は関数 In() を使った例です。In2とIn3のどちらかがLowの場合ThenからEndIfの間を実行:OR(論理和)条件 ※In(ポート番号)は、入力ポートの状態をHigh=1、Low=0として返す
Do 下は Else を使った例です。Elseは、If文の条件が成り立たなかった場合、ElseからEndIfまでの<文>(命令)を実行します。
Do
条件ループ文を使った例です。In2とIn3がHigh(両方押されていない状態)の間、Do Loop間を繰り返し実行:AND(論理積)条件
Do
PA(ポートA)、PC(ポートC)の値を直接読んだり出力することでも同じことが出来ます。詳しくはこちらをご覧ください。
Do
MYU BASICでは命令の引数を省略すると引数が 0 にセットされます。
DEFINEは第1引数の名前を定義して第2引数から次の行までの<文>に置き換えます。解かりやすい命令や定数を定義したりします。
DEFINE ARG,10
プログラムで何回も同じ処理をすることがあります。この部分をサブルーチン(部品)化するとプログラムが見やすくコンパクトになります。MYU BASICではプロシージャと関数にあたりますが両者の違いは関数は値を返しますがプロシージャは返しません。
MELODY //MELODYの呼び出し 引数は省略
プロシージャや関数はそのままではなにも動作しません。呼び出しによって動作し処理の終わりとともに呼ばれた場所に戻ります。どこに在ってかまいませんがプログラムの見やすさを考えると後半に置いた方が良いでしょう。 MYU BASICでは変数を使った演算ができます。下のプログラムは触覚が障害物を感知した回数をカウントし、3回ごとにメロディを2回鳴らすというものです。
Byte C //変数Cを宣言
プロシージャと違い関数は値を返します。下の例は、PAMASK() という関数の値(戻り値という)を プロシージャ BZ の引数として使っています。このように関数は引数など<式>の中で使うことができます。
//プロシージャと関数の使用例:ポートAの0,1ビット(In2とIn3)の状態をブサーの回数で知らせる
※myubasic.iniを編集(例えば、'前進'を'FF'に変える)すると命令をカスタマイズすることができます。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MYU BASIC言語仕様(V1.2) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
【コメント】 // 以下は次の行までなにも実行しない。注釈などを書く 【定義】 DEFINE 定義名,<文> 第1引数の名前を定義して第2引数から次の行までの命令に置き換える ※定義名は数字以外で始まり半角アルファベット、全角文字、数字が使えるが半角と全角の混在は禁止 【変数宣言】 Byte 変数,変数,配列(定数)・・・ Int 変数,変数,配列(定数)・・・ Int(-32768 〜 32767)型の変数宣言(16F688 88専用) 【代入文】 変数=<式> 【ステートメント】 命令 <式>,<式> 引数の数は命令によって異なる 引数を省略すると 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型になる <文> ※Int(16F688 88専用) EndProc ExitProc プロシージャからの抜け出し 【関数】 Function <関数名>(Int <ローカル変数>,Int <ローカル変数>,・・) Intを省略するとByte型になる <文> ※Int(16F688 88専用) <関数名>=<式> 関数の戻り値 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(ポートC)、T1H、T1L(タイマ1(0.008mSec)の上位・下位8ビット) PB(ポートB) (16F88専用) 例 A=PA PC=&h1f T1H=0 A=T1L TRISA=<定数> 設定専用:ポートAの入出力をビットごと(0:出力 1:入力)に設定する(16F688 88専用) TRISB=<定数> 設定専用:ポートBの入出力をビットごと(0:出力 1:入力)に設定する(16F88専用) TRISC=<定数> 設定専用:ポートCの入出力をビットごと(0:出力 1:入力)に設定する(16F688専用) READRS 取得専用:シリアルポートのデータがある場合はその値が返され無い場合は0が返される GETRS 取得専用:シリアルポートから1バイトデータを読み込むまで待ち、値を返す(16F688 88専用) RS=<式> 設定専用:シリアルポートに8BIT キャラクタデータを出力する(16F688 88専用) DECRS=<式> 設定専用:シリアルポートに8BIT 10進データを出力する(16F688 88専用) DEC16RS=<式> 設定専用:シリアルポートに16BIT 符号付10進データを出力する(16F688 88専用) HEXRS=<式> 設定専用:シリアルポートに8BIT HEXデータを出力する(16F688 88専用) HEX16RS=<式> 設定専用:シリアルポートに16BIT HEXデータを出力する(16F688 88専用) 7、算術演算子 + - * / MOD(剰余) A=A+1 A=B*(A+1) A=1+B/3 A=10 MOD 3 ※* / MOD (16F688 88専用) 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)の値で返す(16F688 88専用) 19、AN10(定数) アナログ入力ポート AN10(ポート番号)の値を10BIT(0-1023)の値で返す(16F688 88専用) 20、関数(<式>,<式>,・・) 演算子の優先順位について 単項演算子(++ -- << >>) > 算術演算子(* / MOD) > 算術演算子(+ -) > 関係演算子 > 論理演算子 の順で計算する ※* / MOD はCPUが16F630の場合、使えません。 関係演算子を使った計算:真なら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型変数(16F688 88専用)を使わないかぎり値は全て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型変数(16F688 88専用)の場合、この問題はありません。 ※T1L,T1Hは連動して動く125KHzの16ビットタイマです。T1Lは0.008mSec,T1Hは0.008x256=2.048mSecで動作し 524.288mSecで一周します。 ※CPUがPIC16F688 88の場合、T1Lは0.004mSec,T1Hは0.004x256=1.024mSecで動作し262.144mSecで一周します。 <変数名、プロシージャ名、関数名について> 半角の英文字で始まり英文字、数字、'_'が使用できる。大文字、小文字の区別はしない。 文字数の制限はない。また文字数によってコンパイルされるプログラムサイズは変化しない。 <変数> 変数はByte型またはInt型(16F688 88専用)で宣言してから使う。Byte型またはInt型で宣言した変数はグローバル変数となり プログラム中どこでも有効です。変数は','コンマで区切って複数宣言できる。配列は()内に数を指定する。 ただし使える変数、配列、内部スタックの合計はCPUが16F630の場合は、9バイト以下。プログラムサイズは127バイトまで。 ※CPUが16F688の場合は、80バイト以下。プログラムサイズは255バイトまで。 ※CPUが16F88の場合は、80バイト以下。プログラムサイズは2047バイトまで。 ※プロシージャ、関数を呼出すとローカル変数の数だけ関数はさらに戻り値の1バイト分内部スタックを使います。 なおプロシージャ、関数から戻ると内部スタックは開放されます。 例: Byte Abc,DD(3) //変数AbcとDD(0)からDD(3)までの配列が使える <プロシージャと関数> プログラムで何回も同じ処理をすることがあります。この部分をプロシージャや関数としてまとめ 呼び出すようにするとプログラムが見やすくコンパクトになります。 また引数を設定して値を変えて呼び出すことで複雑な処理も可能になります。 関数は値を返すことができ<式>の中で使うことができます。 プロシージャはProc <プロシージャ名>() EndProc、関数はFunction <関数名>() EndFunctionの間に 処理を書きますが、そのままではなにも動作しません。呼び出しによって動作し処理の終わりとともに 呼ばれた場所に戻ります。また()内に変数を宣言するとローカル変数となります。 呼び出しはプロシージャ名、関数名で行いますが引数は省略できます。関数は引数を()で囲う。 ローカル変数は引数を値渡しで受け取ります。 関数は内部で値を関数名に代入することで外部に返します。 ※呼び出し側の引数よりローカル変数を多く宣言した場合、多い部分は受け渡しの無いローカル変数として使えます。 ※プロシージャ、関数内からプロシージャや関数の呼び出しはCPUが16F630の場合、深さ8レベルまで可能。 ※CPUが16F688の場合、深さ20レベルまで可能。 ※CPUが16F88の場合、深さ10レベルまで可能。 ※ローカル変数や関数は内部スタックを使うため、深い呼び出しはスタックエラーとなります。 ※ローカル変数は局所変数ともいい宣言したプロシージャ、関数内のみ有効な変数です。 呼び出し: <プロシージャ名> <式>,<式>,・・・ A=<関数名>(<式>,<式>,・・・)+1 If <関数名>(<式>,<式>,・・・)=1 Then //プロシージャと関数の使用例:ポートAの0,1ビット(In2とIn3)の状態をブサーの回数で知らせる Do BZ PAMASK() //プロシージャ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 PAMASK() //プロシージャや関数は、引数の無い場合でも()で囲う PAMASK=PA AND 3 //ポートAの0,1ビットをマスクして戻り値とする EndFunction ◆16進数、2進数やリテラル入力例 前進 &h0A //16進入力 10進数の10と同じ 前進 B'1010' //2進入力 10進数の10と同じ 前進 "@" //リテラル入力 @の文字コードは64なので、前進 64 となる <MYU BASICエラーについて> MYU BASICでは転送ボタン(V1.26)を押した時、コンパイルと同時にエラーチェックを行います。 文法エラーがあった場合、ダイヤログが現れエラー部分が表示されコンパイルは中止されます。 正しくコンパイルされた場合、右下のボックスにコンパイルサイズやミュウロボ命令が表示されます。 ◆PwerOnStartについて PwerOnStart命令がプログラムの先頭に入っていると基板のスイッチONとともにプログラムがスタートします。 この状態で新しいプログラムを転送するには、一旦スイッチを切り、転送ケーブルを接続してから基盤のスイッチを 入れれば新しいプログラムを転送できます。 ところがパソコンの中には、この方法で転送できないものがあります。この対応についてはこちら <ミュウロボ制御基板のエラーについて> ミュウロボ制御基板では以下の場合、エラーとなり警告音を鳴らし続けます。 1、127バイト以上の転送。CPUがPIC16F688の場合は255バイト 2、深さ8レベル以上のプロシージャ、関数の呼び出し。CPUがPIC16F688の場合は20レベル 3、変数、配列、内部スタックの合計が9バイトを越えた場合。CPUがPIC16F688 88の場合は80バイト 4、16F630以外ででコンパイルしたものをPIC16F630に転送したとき。 ※MYU BASIC側で正しくコンパイルされても127バイトを越えた転送はエラーとなります。 ※エラーの場合は一旦電源を切りプログラムを修正してから再転送してください。<MYU BASIC リファレンス> ※<式>のなかで使用できるものは、こちら!
※モーター制御命令などの出力命令は、出力命令以外の命令の間も出力状態を維持します。前進の後、Buzzerを実行するとブザーを鳴らしながら前進します。 ※Servo命令の詳しい使い方はこちら
In1からIn4はセンサーなどを接続する入力ポートです。In1にはタクトスイッチが標準で接続されています。これらの入力ポートはプルアップされていて入力が無い状態ではHighとなっています。 入力の有無はPA(ポートA)を見ることで可能ですが、MYU BASICにはIn(1-4)やIfHi(1-4) Then、IfLo(1-4) Thenなどの命令が用意されています。下はタクトスイッチ(In1)が押されたときブザーを鳴らすプログラム例です。上の回路図からスイッチが押されるとIn1(RA4)がLowになることを理解してください。
これらのプログラムはどれも同じ動作をしますがコンパイルサイズは異なります。 ポートAのビット4(RA4)だけを調べる方法ですがビット4は16進表記で&h10、10進表記で16です。これとポートAとAND演算を行うことで可能です。このようにAND演算して特定のビットだけを選別することをマスクするといいます。
<基板の出力ポート:S1-S6> PortOut <式>,<式> 第1引数(0-255)x0.1秒だけ第2引数のデータ(0-255)をポートに出力する
PortOut命令は、出力する時間とPIC16F630のポートCの下位6ビットとポートAの5ビット目を組み合わせた値を指定します。前進(5)とモーター左(16)を同時実行するには、それそれの値を加えた値(21)をポートに出力します。
PA=<式> PC=<式> PA(ポートA)やPC(ポートC)に直接値を代入する
上の表を参考に PC=5 を実行すると前進します。次に Wait 10 と続けると 前進 10 と同じ動作となります。
上の回路図を見るとポートAのビット5は出力に設定され基板のLEDと圧電ブザーに繋がっています。これを0.1秒ごとに反転するプログラムを作ってみました。ビットを反転するにはXORを使います。
●ブレッドボードを使ったLEDの制御 基板で使われているPIC16F630はポートCが出力にセットされていて抵抗を介してLEDを直接点灯させることができます。
<PortOut命令を使ってLEDを光らせる> PortOut m,n //第1引数m(0-255)x0.1秒だけ 第2引数のデータn(0-255)をポートに出力する
◆2進数を理解する
//LEDを1つおき交互に光らせる
◆2進数・16進数の表記方法 ※上のプログラムはLED4個を交互に光らせているものです。値を変えることでLED6個の制御ができます。
<ポートCに直接値をセットしてLEDを光らせる>
PC=n //ポートCにn(0-255)を出力、m(0-255)x0.1秒だけ待つ 下のプログラムは0.1秒ごとLEDの2進数を1づつ増やすというものです。ポートCの値を1づつ増やしています。
//0.1秒ごとにポートCの値を1づつ増やす MYUROBO-1基板には入力ポートを4個持っています。In1には標準でタクトスイッチが接続されています。下のプログラムはタクトスイッチを押した時、ポートCの値を1減らし離すと1増やすよう上のプログラムを改良したものです。
//タクトスイッチを押した時、ポートCの値を1減らし離すと1増やす 下のプログラムはシフト命令を利用してタクトスイッチを押している間LEDが下か上へ、離している間上から下へ点灯するようにしてあります。
//LED Shift タクトスイッチを押している間LEDが下か上へ離している間上から下へ点灯する
|