スタジオ ミュウ

MYU-USB転送ソフト (myuusb.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転送ソフト (myuusb.exe)
 MYU-USBプログラム | リアルタイム計測 | 入出力プログラム | LEDの制御
myuusb.exeは、簡単な操作(マウスと数字キー)だけでプログラムできます。解りやすい制御文、簡単な操作による入力条件の設定など複雑な動作も簡単で解りやすいプログラムを作ることができます。
また、パソコンにつないだままアナログ/デジタル計測・リモート操作など便利な機能もあります。

MYU-USB転送ソフト (myurobousb.zip) はここからダウンロード(V1.17 2017/3/1)できます。(64bitOS対応)

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

●プログラム
MYUUSB.EXE(青いアイコン)を立ち上げてください。開くボタンを押してMYU-USBサンプル1.txtを読み込んでください。下の画面になります。
PCとMYU-USB制御基板とを転送ケーブルで接続、転送ボタンを押し、転送しますか?<はい>で転送され'ピピ'と鳴り転送終了です。転送ケーブルを抜きタクトスイッチを押すとプログラムが実行されます。
ソフト右下は、触覚の状態(デジタル入力)やCDSの明るさ(アナログ計測)などが表示されます。

編集ボックス
MYU-USBプログラムを編集する場所です。命令リストから命令をドロップしたり行をドラックして入替えたりできます。
命令タブ(MYUロボ命令と制御命令)
MYU-USBで使われる命令リストです。命令はMYUロボ命令と制御命令に分かれています。タブをクリックして切り替えます。
命令をクリックすると解説ボックスにその命令の説明が表示されます。
命令をダブルクリックやドラッグすると編集ボックスに反映されMYU-USBプログラムを作っていくことができます。
よく使う命令を上にドラッグして移動することや右クリックで新しい命令を追加するなどの機能もあります。
解説ボックス
命令リスト内の命令をクリックすると命令の解説が表示されます。
USB-●
  基板と接続されているか表示します。
読込ボタン
  基板に書き込まれている制御プログラムを読み込み編集ボックスに表示します。
開くボタン
  保存された制御プログラムを読み込み編集ボックスに表示します。拡張子は.txt
保存ボタン
  編集ボックスの制御プログラムを保存します。拡張子は.txt
クリアボタン
  編集ボックス内をクリアします。
転送ボタン
  編集ボックス内の制御プログラムを基板に転送します。
計測/R実行ボタン(右のダイヤログが表れ、転送ケーブルを繋いだまま各種操作可能)
  ◆RC0-RC7のチェックボックス
    ポートCの出力をビットごと設定できます。(LED制御に便利)
  ◆入力ポート
    デジタル計測が始まりIn2-In4の状態がリアルタイムで見ることができる
  ◆アナログ計測(AN10-AN4)
    アナログセンサーの計測値を見ることができる
  ◆サーボスライダ
   接続されているサーボモータを操作できる

  ◆記録開始ボタン
    記録停止までの間、計測間隔ごとにアナログ計測値をファイル(myu.txt)に保存する。Excelなどで結果を表やグラフにできる。
  ◆R実行ボタン
    編集ボックスに書いてあるプログラムを転送しないで実行できる
  ◆R逐次実行ボタン
    編集ボックスに書いてあるプログラムを1行づつ実行できる
  ◆ステップインボタン
    基板のプログラムを1行づつ実行しレジスタの変化を見ることができます
    (デバッグモード)
リモート
  ドロップダウンリストで選んだ命令を隣のボタンでリモート操作できる
※R実行やリモートでモータを動かすとモーターノイズの影響をうけますので注意してください。
◆命令のカスタマイズ
startupusb.iniやmyurobo.iniを編集すると命令をカスタマイズすることができます。


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

前進,10
右回り,5

プログラムはこのようにして作っていきます。MYU-USB転送ソフトは最初に命令、コンマ、引数の順で書いていきます。命令には引数のないもの、引数が1つのもの、引数が2つのものがあります。詳しくはこちらをご覧ください。

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

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

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

前進や右回りなどの命令を使い引数(動作時間)をセットすることでロボットを動かすことができます。
下のようなコースを作ってプログラムの練習をしてください。

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

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

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

下は、同じ動作を繰り返すプログラムです。基板に転送しタクトスイッチを押すと動作します。

アンカー,10    //アンカー番号10
前進,10
右回り,5
ジャンプ,10    //アンカー番号10へジャンプ


※//以下は次の行までコメントが書けます。コメントを残しておくと後からプログラムの内容が理解しやすくなります。

アンカー,n  //アンカー番号(1から127) n を宣言する
ジャンプ,n  //アンカー番号 n にジャンプする

◆アンカーとジャンプ
プログラムは命令を順に実行しますが、ジャンプ命令はその流れを変えることができます。ジャンプ命令は引数と同じアンカー番号の所へジャンプします。
上の例では前進と右回りを繰返し実行しますからロボットは多角形を描くように動きます。
※アンカーは番号(1から127)を宣言するだけでなにも実行しません。
※アンカー番号の重複(同じアンカー番号を付けること)は禁止です。
※上のように繰り返すプログラムをループプログラムと呼びます。またアンカーとジャンプの間の命令は段落をつけると見やすくなります。

※プログラムは保存ボタンを押してファイル名を指定し保存するようにしてください。
※MYUROBOファイルの拡張子は'.txt'ですのでWINDOWSのメモ帳でもプログラムを編集できます。

◆入力ポートによる条件ジャンプ:入力ありジャンプと入力なしジャンプ
MYUUSB-1基板は入力ポートを4個(In1-In4)持っています。入力ありジャンプと入力なしジャンプは、入力ポートの状態によって指定したアンカー番号にジャンプします。

入力ありジャンプ,m,n  //入力ポートn(1-4)が入力あり(ON)ならアンカー番号mにジャンプ
入力なしジャンプ,m,n  //入力ポートn(1-4)が入力なし(OFF)ならアンカー番号mにジャンプ

MYUUSB-1基板の触覚は、入力ポートのIn2(左)とIn3(右)に接続されています。下の例は入力ポートの状態を調べ、触覚が障害物を感知したら後退して向きを変えるプログラムです。
触覚は左右にあり、どちらかが壁を感知したら「後退して向きを変える」というプログラムとなっています。

アンカー,10       //アンカー番号10を宣言
  前進
  入力ありジャンプ,11,2 //In2が入力ありなら11へジャンプ
  入力ありジャンプ,11,3 //In3が入力ありなら11へジャンプ
ジャンプ,10       //アンカー番号10にジャンプ
アンカー,11       //アンカー番号11を宣言
  後退,10
  左回り,10
ジャンプ,10       //アンカー番号10にジャンプ

下は、'入力なしジャンプ'命令を使った例です。同じ動きをします。

アンカー,10       //アンカー番号10を宣言
  前進
  入力ありジャンプ,11,2 //In2が入力ありなら11へジャンプ
  入力なしジャンプ,10,3 //In3が入力なしなら10へジャンプ
アンカー,11       //アンカー番号11を宣言
  後退,10
  左回り,10
ジャンプ,10       //アンカー番号10にジャンプ

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

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

ブザー,n    //nx0.1秒の間 ブザー音を鳴らす

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

前進
ブザー,10

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

電子音,n,m    //nx0.1秒の間 パルス幅mの音を鳴らす

下は音階を表にしたものです。(※パルス幅が大きいほど低い音になります)
音階 ド# レ# ファ ファ# ソ# ラ#
パルス幅 80 75 71 67 63 60 56 53 50 47 44 42
パルス幅 39 37 35 33 31 29 27 26 24 23 22 20

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

//「ドレミ」を繰り返し演奏(転送ソフト)
アンカー,10        //アンカー番号10を宣言
  電子音,5,80      //「ド」の音をを0.5秒ならす
  電子音,5,71      //「レ」の音をを0.5秒ならす
  電子音,5,63      //「ミ」の音をを0.5秒ならす
  停止,5         //停止命令を使うと0.5秒間音を出ない
ジャンプ,10        //アンカー番号10にジャンプ

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

ポート出力,n,m   //n(0-255)x0.1秒だけ m(0-255)をポートCに出力する

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

ポート出力,10,69       //前進とモーター3左を1秒間行う

ポート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'

◆ブロックについて(サブルーチン)
プログラムで何回も同じ処理をすることがあります。この部分をサブルーチン(部品)化するとプログラムが見やすくコンパクトになります。
MYU−USB転送ソフトではブロックはじめからブロックおわりまでをブロックとよびサブルーチンとなります。

ブロックはじめ,n    //ブロック番号(1-127) n を宣言しブロックおわりまでの間にプログラムを書く
ブロックおわり     //ブロックが終わり呼ばれた場所に戻る
ブロック実行,n     //ブロック番号 n を呼び出し実行する
ブロック繰り返し,n,m //ブロック番号 nm 回実行する。 m が0の場合は無限に繰り返す
ブロック脱出      //ブロック内から抜け出し呼ばれた所に戻る

下は前のプログラムにメロディのブロックを追加したものです。最初と障害物を感知した時、動作します。

ブロック実行,10    //ブロック番号10の呼び出し
アンカー,10       //アンカー番号10を宣言
  前進
  入力ありジャンプ,11,2 //In2が入力ありなら11へジャンプ
  入力ありジャンプ,11,3 //In3が入力ありなら11へジャンプ
ジャンプ,10       //アンカー番号10にジャンプ
アンカー,11       //アンカー番号11を宣言
  ブロック実行,10    //ブロック番号10の呼び出し
  後退,10
  左回り,10
ジャンプ,10       //アンカー番号10にジャンプ
ブロックはじめ,10   //ブロック番号10、停止してメロディ
  停止
  電子音,2,48 電子音,2,46 電子音,2,44 電子音,2,42 //空白で区切れば複数の命令を1行で書けます
  電子音,2,40 電子音,2,38 電子音,2,36 電子音,2,34
ブロックおわり

※ブロックは1から127までのブロック番号をつけ他のブロックと区別します。
※ブロックはプログラム内のどこに在ってかまいませんが、そのままではなにも実行しません。ブロック実行やブロック繰り返し命令を使うことで動作し処理の終わりとともに呼ばれた場所に戻ります。
※ブロック番号の重複(同じブロック番号を付けること)は禁止ですがアンカー番号との重複は可能です。
※ブロック内から他のブロックの呼出しは深さ16レベルまで可能です。
※ブロック内のジャンプは可能ですが飛び出しジャンプは禁止です。ブロックの途中からの抜け出しはブロック脱出を使います。

◆制御命令
ジャンプやブロック命令は番号を使うので複雑なプログラムでは解りにくくなってしまいます。
制御命令を使うと複雑な動作も簡単で解りやすいプログラムを書く事ができます。

繰り返す{..}    //{..}内を無限に繰り返し実行する
繰り返す(n){..}  //{..}内を n 回繰り返す

制御命令を使うには、制御命令タブをクリック、制御命令に切り替えます。命令リスト内の"繰り返す{..}"をドラックして編集ボックスに配置します。
MYUロボ命令タブをクリック、{..}内に前進、右回りの命令をドロップ、下のようにします。

//制御命令を使った例
繰り返す{
  前進,10
  右回り,5
}
//ジャンプ命令を使った例
アンカー,10    //アンカー番号10
  前進,10
  右回り,5
ジャンプ,10    //アンカー番号10へジャンプ


※繰返し実行する制御文をループプログラムといいます。パソコンなど、ほどんどがループプログラムで動いています。
※ループプログラムは基板のスイッチOFFまで動き続けます。ループから抜けるには{..}内で"繰り返し脱出"命令を使うか"入力あり繰り返す(n){..}"か"入力なし繰り返す(n){..}"などの条件ループ文を使います。"繰り返す(2){..}"を使うとループの回数を指定できます。

上のプログラムは下のように1行で書くこともできます。1行で書く場合は"前進,10"と"右回り,5"の間に空白を入れます。

繰り返す{前進,10 右回り,5}

◆制御命令一覧
制御命令 説明
繰り返す{..} {..}内を繰り返し実行する。{..}内から脱出するには'繰り返し脱出'命令を使う
繰り返す(n){..} {..}内を n回繰り返す
繰り返す(A 比較 n){..} Aレジスタの値と n を比較して条件が成り立つ間、{..}内を繰り返す。比較式は(A = n)(A <> n)(A > n)(A < n)の4種類
入力あり(p){..} 入力ポート番号 p が入力ありなら{..}内を実行する。複数のポート番号指定の場合、'|'で区切るとOR条件、'&'ではAND条件となる
入力なし(p){..} 入力ポート番号 p が入力なしなら{..}内を実行する。複数のポート番号指定の場合、'|'で区切るとOR条件、'&'ではAND条件となる
そうでなければ{..} '入力あり'や'入力なし'の条件が成り立たない場合、{..}内を実行する
入力あり繰り返す(p){..} 入力ポート番号 p が入力ありの間、{..}内を繰り返し実行する。複数のポート番号指定の場合、'|'で区切るとOR条件、'&'ではAND条件となる
入力なし繰り返す(p){..} 入力ポート番号 p が入力なしの間、{..}内を繰り返し実行する。複数のポート番号指定の場合'|'で区切るとOR条件、'&'ではAND条件となる
繰り返し脱出 繰り返す命令の{..}内から抜け出し次の命令を実行する
もし(A 比較 n){..} Aレジスタの値と n を比較して条件が成り立てば{..}内を実行する。比較式は(A = n)(A <> n)(A > n)(A < n)の4種類
そうでなければ(A 比較 n){..} もし(A 比較 n)が成り立たない場合、別の条件を設定する
そうでなければ{..} すべての条件が成り立たない場合、{..}内を実行する
サブプログラム 名前{..} サブプログラム名を設定して{..}内にプログラムを書く。呼び出しは、サブプログラム名を使う
戻る サブプログラムの途中から呼ばれた場所に戻る
※nは、0〜255の整数値 ※入力ポート番号 p は、1〜4の整数値(In1-In4)

◆制御命令のフローチャート


◆入力ポートによる制御命令1:入力あり(p){..}と入力なし(p){..}
MYUロボ-II基板は入力ポートを4個(In1-In4)持っています。基板の触覚は、入力ポートのIn2(左)とIn3(右)に接続されています。
下の例は入力ポートの状態を調べ、触覚が障害物を感知したら後退して向きを変えるプログラムです。
触覚は左右にあり、どちらかが壁を感知したら「後退して向きを変える」というプログラムとなっています。

入力あり(p){..}  //入力ポート番号(1-4) p が入力ありなら{..}内を実行する
入力なし(p){..}  //入力ポート番号(1-4) p が入力なしなら{..}内を実行する
※複数の入力ポート番号を指定する場合は、(p1 | p2 ..) OR条件、どれか1つの入力で{..}内を実行
※複数の入力ポート番号を指定する場合は、(p1 & p2 ..) AND条件、全ての入力で{..}内を実行

編集ボックスをクリア、"繰り返す{}"をドラック、"前進"を入力し"入力あり(){}"をドラックすると右のダイヤログが現れます。
In2とIn3にチェックを入れ、ORにも入れOKボタンを押し以下のようにします。

繰り返す{    //{..}内を繰り返し実行
    前進
    入力あり(2 | 3){  //OR条件
        後退,10
        右回り,5
    }
}


※入力ポートの2と3のどちらかに入力がある場合、{..}内を実行します。(OR条件)、両方とも入力がなかった場合、{..}内は実行しないで次の命令を実行します。
※MYU-USB転送ソフトではMYUロボ命令の引数を省略すると引数が 0 にセットされます。
※上の例の前進のように引数を省略すると前進の信号を出した後、待ち時間なしで次の命令を実行できます。

◆ORとAND
入力ありと入力なし命令は (..) 内に複数の入力ポート番号を指定できます。'|'で区切るとOR条件、'&'ではAND条件となります。
OR:指定した入力番号のどれか1つの入力で{..}内を実行
AND:指定した入力番号全ての入力で{..}内を実行
※上のプログラムの(2 | 3)を(2 & 3)に変え動作の違いを理解してください。

下は"そうでなければ{..}"を使った例です。入力ありの条件が成り立たない場合、{..}内を実行します。

繰り返す{    //{..}内を繰り返し実行
    入力あり(2 | 3){  //OR条件
        後退,10
        右回り,5
    }
    そうでなければ{  //2と3とも入力がなかった場合、{..}内を実行
        前進
    }
}

◆入力ポートによる制御命令2:入力あり繰り返す(n){..}と入力なし繰り返す(n){..}
入力あり繰り返す(n){..}と入力なし繰り返す(n){..}は条件ループ文です。入力ポートの条件が成りたつ間、{..}内ループを繰り返し実行します。
下のプログラムも同じ動作をします。

入力あり繰り返す(p){..}  //入力ポート番号(1-4) p が入力ありの間、{..}内を繰り返し実行する
入力なし繰り返す(p){..}  //入力ポート番号(1-4) p が入力なしの間、{..}内を繰り返し実行する
※複数の入力ポート番号を指定する場合は、(p1 | p2 ..) OR条件、どれか1つの入力で{..}内を実行
※複数の入力ポート番号を指定する場合は、(p1 & p2 ..) AND条件、全ての入力で{..}内を実行

"入力なし繰り返す(){}"をドラックすると右のダイヤログが現れます。
In2とIn3にチェックを入れ、今度はANDに入れOKボタンを押します。

繰り返す{    //{..}内を繰り返し実行
    入力なし繰り返す(2 & 3){  //AND条件
        前進
    }
    後退,10
    右回り,5
}

※入力なし繰り返すは入力ポート 2と3の両方とも入力がない間、{..}内を繰り返し実行します。(AND条件)、どちらかの入力があると{..}内ループから抜け、次の命令を実行します。
※上のプログラムの(2 & 3)を(2 | 3)に変え動作の違いを理解してください。

◆繰り返し脱出命令
制御命令の繰り返す{..}は、無限ループです。"繰り返し脱出"命令を使うと繰り返す{..}から脱出して次の命令を実行できます。

繰り返し脱出   //繰り返す{..} から抜け出し次の命令を実行する

下は前進中、左右どちらかの触覚が入力を感知するとブザーが鳴りプログラムが終了します。

入力なし繰り返す(2 & 3){
    前進
}
ブザー,2

'繰り返し脱出'命令を使った場合は、以下のようになります。

繰り返す{
    前進
    入力あり(2 | 3){
        繰り返し脱出
    }
}
ブザー,2

◆{..}について
制御命令{..}は入れ子構造といって内部にいくつもの制御命令{..}を書くことができます。"{"と"}"はセットになっていて内側の制御命令{..}と区別します。
下の様に1行に書いたり行を変えたりできますが段落を付け{..}の範囲が解るように書いた方が良いでしょう。
{..}は全角文字の{..}、「..」、【..】なども使えます。

制御命令{
    制御命令
    {
        制御命令「..制御命令【..】..」
    }
}

◆定義
定義は複数の命令や引数を1つの言葉で定義することができます。第1引数で名前を定義して第2引数から次の行までの命令に置き換えます。
下はメロディを定義、最初と障害物を感知した時、動作をします。
※定義名は数字以外で始まり半角アルファベット、全角文字、数字が使えますが半角と全角の混在は禁止です。

定義,メロディ,停止 電子音,2,48 電子音,2,46 電子音,2,44 電子音,2,42 電子音,2,40 電子音,2,38 電子音,2,36 電子音,2,34
定義,方向転換,後退,10 右回り,5
メロディ
繰り返す{    //{..}内を繰り返し実行
    前進
    入力あり(2 | 3){  //OR条件
        メロディ
        方向転換
    }
}

◆サブプログラム
プログラムで何回も同じ処理をすることがあります。この部分をサブプログラムとしてメインプログラムとは別に作っておくとプログラムが見やすくコンパクトになります。
MYU-USB転送ソフトでは"サブプログラム サブプログラム名"に続き{..}内にプログラムを書きます。

サブプログラム サブプログラム名{..} //{..}内にサブプログラムを書く
サブプログラム名             //サブプログラムを実行する
戻る                    //サブプログラム内から抜け出し呼ばれた所に戻る
※サブプログラム名は数字以外で始まり半角アルファベット、全角文字、数字が使えます。

サブプログラムはそのままではなにも動作しません。メインプログラムやサブプログラム内でサブプログラム名を使うことで呼び出され処理の終わりとともに呼ばれた場所に戻ります。

命令ボックスの"サブプログラム{}"をドラックすると右のダイヤログが現れサブプログラム名を入力します。

メロディ
繰り返す{    //{..}内を繰り返し実行
    前進
    入力あり(2 | 3){    //OR条件
        メロディ    //サブプログラム メロディの呼び出し
        方向転換    //サブプログラム 方向転換の呼び出し
    }
}               //メロディからここまでがメインプログラム
サブプログラム メロディ{
    停止
    電子音,2,48 電子音,2,46 電子音,2,44 電子音,2,42
    電子音,2,40 電子音,2,38 電子音,2,36 電子音,2,34
}
サブプログラム 方向転換{
    後退,10
    右回り,5
}

※サブプログラムはどこに在ってかまいませんがプログラムの見やすさを考えるとメインプログラムの後ろに置いた方が良いでしょう。
※戻る命令を使うとサブプログラムの途中から戻れます。

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

繰り返す(n){..}  //{..}内を n 回繰り返す

下のプログラムは、制御命令の 繰り返す(n){..} を使いPWM制御を行っています。左右のモーターの回転差によってロボットは緩旋回します。

//右緩旋回
繰り返す{
  繰り返す(20){ //繰返し数を大きくすると大回りになる
    前進    //両モーターがON
  }
  繰り返す(10){ //繰返し数を大きくすると小回りになる
    左前    //右モーターだけOFF
  }
}

◆Aレジスタ
MYUUSB-1基板はマイクロコンピュターを搭載しています。この中のAレジスタは、1バイトの値(0-255)を記憶でき計算や数の比較などができます。
Aレジスタは命令の引数に使えます。Aレジスタの値によって動きを変えることができます。
また、アナログ計測の値をAレジスタに読み込むことができ応用範囲が広がります。

繰り返す(A 比較 n){..}  //Aレジスタと n を比較、条件が成り立つ間、{..}内を繰り返し実行
※比較式は以下の4つあります。
(A = n):Aレジスタの値とnが同じ場合、{..}内を実行
(A <> n):Aレジスタの値とnが異なる場合、{..}内を実行
(A > n):Aレジスタの値がnより大きい同じ場合、{..}内を実行
(A < n):Aレジスタの値がnより小さい同じ場合、{..}内を実行

下の例1は前進の引数にAレジスタを使っています。Aレジスタの値を1から2つづ増やし前進する時間が変化するプログラムとなっています。

命令ボックスの"繰り返す(){}"をドラックすると右のダイヤログが現れます。
(A < n)にチェックを入れ、Aレジスタと比較する数に16を入力、OKボタンを押し下のようにします。

//例1−1:多角形渦巻き旋回
A,1          //Aレジスタに1をセット
繰り返す(A < 16){  //Aレジスタが16より小さい間、{..}内を繰り返す
    前進,A    //前進の時間がAレジスタの値によって変化する
    右回り,5
    加える,2    //Aレジスタに2を加える
}
ブザー,2       //Aレジスタが16を超えると{..}から脱出、ブザーを鳴らして終了

下は、'もし(A 比較 n){..}'と'繰り返し脱出'命令を使った例です。同じ動作をします。

//例1−2:多角形渦巻き旋回
A,1                  //Aレジスタに1をセット
繰り返す{
    前進,A           //前進の時間がAレジスタの値によって変化する
    右回り,5
    加える,2            //Aレジスタに2を加える
    もし(A > 15){       //Aレジスタが15より大きくなったら、{..}内を実行
        繰り返し脱出
    }
}
ブザー,2

もし(A 比較 n){..}         //Aレジスタと n 比較して条件が成り立てば、{..}内を実行
そうでなければ(A 比較 n){..} //もし(A 比較 n)が成り立たない場合、別の条件を設定する
そうでなければ{..}        //すべての条件が成り立たない場合、{..}内を実行する

下の例2は距離センサーを使って壁までの距離を計測。Aレジスタに読み込まれた計測値によりロボットの動きを制御しています。

命令ボックスの"もし(){}"をドラック、下のようにします。

//例2:距離センサーを使って一定の距離で止まるロボット
繰り返す{    //{..}内を繰り返し実行
    AN,10           //AN10のアナログ値を計測、Aレジスタにセット
    もし(A < 60){       //壁が遠い場合(Aレジスタ値:0-59)
        前進
    }
    そうでなければ(A < 100){ //(Aレジスタ値:60-99)
        停止
    }
    そうでなければ{      //壁に近づきすぎたら(Aレジスタ値:100-255)
        後退
    }
}

◆Aレジスタを使うときの注意
Aレジスタで扱う値は0〜255までの整数値ですので以下の注意が必要です。
※(A < 0)や(A > 255)の比較式の条件は成り立ちません。
※Aレジスタの値が255の時、1加えると0になります。同様に0の時、1引くと255になります。

◆Aレジスタ以外のレジスタ
IXレジスタ:インデックスレジスタ 0-127までの値をセットし、IXMレジスタの位置を指定する
IXMレジスタ:インデックスメモリ IXの値(0-127)によって格納される128個のレジスタメモリ
PAレジスタ:ポートAの値がセットされる。
PBレジスタ:ポートBの値がセットされる。
PCレジスタ:ポートCの値がセットされる。
T0LとT0Hレジスタ:タイマー0(250KHz)の下位8ビットと上位8ビットがセットされる。
AHレジスタ:16ビット演算の時、Aレジスタが下位8ビット、AHレジスタが上位8ビットとなる。
ARG1とARG2レジスタ:16ビット演算時使う他、CMD命令の引数となる。
EEPROM:電源を切っても覚えている256バイトのメモリ
※16ビット演算は符号付き整数(+32,767〜-32,768)のかけ算、わり算ができます。

◆レジスタ命令
よく使うレジスタ命令です。※扱う値は、8bit幅です。(0〜255の整数値)
命令 説明
A,n Aレジスタにnをセットします A,10
加える,n Aレジスタの値とnを加え、Aレジスタの値とします 加える,10
引く,n Aレジスタの値からnを引き、Aレジスタの値とします 引く,10
クリアA Aレジスタの値を0にします クリアA
増やす1 Aレジスタの値を1増やします 増やす1
減らす1 Aレジスタの値を1減らします 減らす1
AND,n Aレジスタの値とnをAND演算し、Aレジスタの値とします AND,10
OR,n Aレジスタの値とnををOR演算し、Aレジスタの値とします OR,10
XOR,n Aレジスタの値とnををXOR演算し、Aレジスタの値とします XOR,10
AN,n ポート番号nのアナログ値をAレジスタにセットします AN,10
PC,n PC(ポートC)にnを出力します PC,B'10101010'
PBA PB(ポートB)の値をAレジスタにセットします PBA
APC Aレジスタの値をPC(ポートC)に出力します APC
左シフト Aレジスタの値をC(キャリー)ビットを含めて左シフト回転します(値が倍になる) 左シフト
右シフト Aレジスタの値をC(キャリー)ビットを含めて右シフト回転します(値が半分になる) 右シフト
IX,n IXレジスタにnをセットします IX,10
IXM,n IXMレジスタにnをセットします IXM,10
IXMA IXMレジスタの値をAレジスタにセットします IXMA
AIXM Aレジスタの値をIXMレジスタにセットします AIXM
ARG1,n ARG1レジスタにnをセットします ARG1,10
RDEEPROM ARG1にセットされたEPROMアドレスの値を読みAレジスタにセットする RDEEPROM
WTEEPROM Aレジスタの値をARG1にセットされたEPROMアドレスに書き込む WTEEPROM

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

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

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

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

※エラーの場合は一旦電源を切りプログラムを修正したり電池をかえたりして再転送してください。


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

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



リアルタイムアナログ計測値を参考に制御プログラムを作ってみます。
//一定の明るさで停止するロボット
繰り返す{    //{..}内を繰り返し実行
    AN,10           //AN10のアナログ値を計測、Aレジスタにセット
    もし(A < 100){       //明るい場合は前進(Aレジスタ値:0-99)
        前進
    }
    そうでなければ(A < 150){ //一定の明るさで停止(Aレジスタ値:100-149)
        停止
    }
    そうでなければ{      //暗い場合は後退(Aレジスタ値:150-255)
        後退
    }
}


●入出力プログラム  (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

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

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

レジスタ命令を使いポートCに直接、値を出力することもできます。待つ命令と組み合わせるとポート出力命令と同じ結果になります。

PC,n   //ポートCに値n(0-255)を出力する
待つ,m  //値(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秒ごとにAレジスタを1増やしポート出力(LED制御)
繰り返す{         //{..}内を繰り返す
    INCA       //Aレジスタの値を1増やす
    ポート出力,5,A //Aレジスタの値を0.5秒間ポートCに出力
}

◆デジタル入力
In1-In4はデジタル入力ポートです。これらはプルアップされていて入力が無い状態では'1'、入力があると'0'になります。
ポートAとポートBの値を読むことで入力ポート(in1-In4)の状態を判断できます。

  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'

//In2が押されたらブザーを鳴らす(ポートBの値を調べる例)
繰り返す{         //{..}内を繰り返す
    PBA        //ポートBの値をAレジスタにセット
    AND,B'1000000' //Aレジスタのビット6(In2部分)だけマスクする
    もし(A = 0){   //In2が押されたら{..}内を実行
        ブザー,1
    }
}

//In2が押されたらブザーを鳴らす(入力あり(){..}を使った例)
繰り返す{        //{..}内を繰り返す
    入力あり(2){  //In2が押されたら{..}内を実行
        ブザー,1
    }
}

◆アナログ入力
デジタル入力が有るか無いか'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を使って明るさを計測、暗くなったらブザーを鳴らす(デジタル入力例)
繰り返す{         //{..}内を繰り返す
    入力なし(4){   //In4に接続したCDSが暗くなったら{..}内を実行
        ブザー,1
    }
}

//CDSを使って明るさを計測、暗くなったらブザーを鳴らす(アナログ入力例)
繰り返す{         //{..}内を繰り返す
    AN,10      //AN10に接続したCDSを8ビットアナログ計測、計測値をAレジスタにセット
    もし(A > 100){   //アナログの場合、明るさのしきい値を変えることできる
        ブザー,1
    }
}



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

//LEDを1つおき交互に光らせる
繰り返す{         //{..}内を繰り返す
  ポート出力,1,B'01010101'   //ポートCにB'01010101'を0.1秒間出力
  ポート出力,1,B'10101010'   //ポートCにB'10101010'を0.1秒間出力
}

//0.1秒ごとにポートCの値を1づつ増やす
繰り返す{         //{..}内を繰り返す
  INCA     //Aレジスタの値を1増やす
  APC      //Aレジスタの値をポートCに出力
  待つ,1    //0.1秒の待ち時間
}

//LED Shift タクトスイッチ(In1)を押している間LEDが左へ離している間右へ移動点灯する
A,1         //最初にAレジスタに1をセット、値を変えるとシフトパターンが変わる
繰り返す{      //{..}内を繰り返す
  APC       //Aレジスタの値をポートCに出力
  待つ,1     //0.1秒のウエイト
  入力あり(1){  //In1を押したら
    左シフト   //Aレジスタを左シフト
  }
  そうでなければ{
    右シフト   //Aレジスタを右シフト
  }
}


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

◆16進数、2進数やリテラル入力例
前進,H'0A'    //16進入力 10進数の10と同じ
前進,B'1010'   //2進入力 10進数の10と同じ
前進,"@"     //リテラル入力 @の文字コードは64なので、前進,64 となる
※16進数や2進数を使うとビット単位の設定が解りやすくなります。