LED計測制御 | LED双方向通信 | LEDグループ学習 | メロディのプログラム | RCサーボの制御 | モーターのPWM制御 MYUロボ-II | MYU-USB転送ソフト | MYU USB BASIC | USBドリトル | C アセンブラ|MYUUSB-1基板 | MYUUSB命令一覧 ■MYU-520 MYU-USB基本セット 4,675円(10%税込) ■MYU-521 MYU-USBベルト基本セット 4,675円(10%税込) ■MYU-522 3軸MYU-USB基本セット 5,830円(10%税込) ■MYU-524 MYU-USB制御基板(2モーター用) 3,1400円(10%税込) ■MYU-526 MYU-USB制御基板(4モーター用) 3,410円(10%税込) ●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の整数値です
<式>のなかで使用できるもの 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 Loopは間にはさまれた<文>を繰返し実行します。 プログラムは命令を順に実行しますが、制御文はその流れを変えることができます。またプログラムはSaveボタンを押してファイル名を指定し保存するようにしてください。 ※繰返し実行する制御文をループ文といいます。他にFor Nextループなどがある。 ※Do...Loopは無限ループとなりプログラムは永遠に終了しません。ループから抜けるにはDo...Loop内で ExitDo 命令を使います。 ※また Do WHile <式>...Loop や Do...Loop While <式> など条件を付けたループ文を使うとループから抜けられます。 ◆制御文一覧
◆制御文のフローチャート 次はFor Next文の説明です。ここではTIMEという名前の変数を使っています。変数は値(テータ)を入れる入れ物です。 変数は使う前にはByte TIMEと変数名を宣言しなければなりません。ここではTIMEとしましたが変数名は自由につけられます。 ※MYU BASICで扱う値は、Byte型の整数(0 〜 255)とInt型の整数(-32768 〜 32767)が扱える <変数名、プロシージャ名、関数名について> 半角の英文字で始まり英文字、数字、'_'が使用できる。大文字、小文字の区別はしない。また、文字数の制限はない。 ※'TIME' も 'time' もMYU BASICでは同じと判断されます。
上の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)
下は関数 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>の音を鳴らす 下は音階を表にしたものです。(※パルス幅が大きいほど低い音になります)
下の例は、電子音命令を使って「ドレミ」を繰り返し演奏するプログラムです。 //「ドレミ」を繰り返し演奏 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)
◆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秒だけ待つ
※引数の入力に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になることを理解してください。
ポート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進数
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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、関数(<式>,<式>,・・) 演算子の優先順位について 単項演算子(++ -- << >>) > 算術演算子(* / 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)までの配列が使える <プロシージャと関数> プログラムで何回も同じ処理をすることがあります。この部分をプロシージャや関数としてまとめ呼び出すように するとプログラムが見やすくコンパクトになります。 また引数を設定して値を変えて呼び出すことで複雑な処理も可能になります。 関数は値を返すことができ<式>の中で使うことができます。 プロシージャはProc <プロシージャ名>() EndProc、関数はFunction <関数名>() EndFunctionの間に 処理を書きますが、そのままではなにも動作しません。呼び出しによって動作し処理の終わりとともに 呼ばれた場所に戻ります。また()内に変数を宣言するとローカル変数となります。 呼び出しはプロシージャ名、関数名で行いますが引数は省略できます。関数は引数を()で囲う。 ローカル変数は引数を値渡しで受け取ります。 関数は内部で値を関数名に代入することで外部に返します。 ※呼び出し側の引数よりローカル変数を多く宣言した場合、多い部分は受け渡しの無いローカル変数として使えます。 ※プロシージャ、関数内からプロシージャや関数の呼び出しは深さ16レベルまで可能。 ※ローカル変数や関数は内部スタックを使うため、深い呼び出しはスタックエラーとなります。 ※ローカル変数は局所変数ともいい宣言したプロシージャ、関数内のみ有効な変数です。 呼び出し: <プロシージャ名> <式>,<式>,・・・ A=<関数名>(<式>,<式>,・・・)+1 If <関数名>(<式>,<式>,・・・)=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 リファレンス> ※<式>のなかで使用できるものは、こちら!
※モーター制御命令などの出力命令は、出力命令以外の命令の間も出力状態を維持します。前進の後、Buzzerを実行するとブザーを鳴らしながら前進します。 ※Servo命令の詳しい使い方はこちら |