スタジオ ミュウ

MYUロボ-II (myurobo-II.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-536 MYUロボ-II              3,078円(8%税込)
●MYU-537 MYUロボ-II(CDS光センサー付) 3,186円(8%税込)
MYUロボ-IIは、日本語によるプログラム可能なロボットです。簡単な操作(マウスと数字キー)だけでプログラムできます。解りやすい制御文、簡単な操作による入力条件の設定など複雑な動作も簡単で解りやすいプログラムを作ることができます。
赤と緑のLEDのを使った信号機のプログラムなど最初にLED制御することで確実にロボット制御が理解できます。
・USB転送ケーブル付き
・配線はモーターケーブルのみ
・付属の触覚センサー他、MYU-537は、光(CDS)センサー付き

●MYUロボ-IIソフト (myurobo-II.exe) MYUロボ-IIプログラム
myurobo-II.exeは簡単な操作で制御プログラムを作っていくことができます。命令リストの命令をクリックすると解説ボックスに説明が表示されます。命令をドラッグして編集ボックスに配置するようにして制御プログラムを作っていくことができます。
また、パソコンにつないだままLEDの点灯、触覚やCDSの計測など便利な機能もあります。

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

●起動方法
ダウンロードしたmyurobo-II.zipを展開しmyurobo-IIホルダをCD-ROM・ハードディスク・サーバー・USBメモリなどにコピーしてください。ホルダ中のmyurobo-II.exeを実行するとMYUロボ-IIソフトが起動します。

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

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

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

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


●はじめてのMYUロボ-IIプログラミング
最初にLEDのプログラムを学習します。
myurobo-II.exeを立ち上げ命令リストの"左点灯"をクリックしてください。下の解説ボックスに説明が表示されます。
続けて同じ左点灯"をドラッグして編集ボックスにドロップしてください。右の引数入力用ダイアログが現れます。
"10"と入力しEnterキーを押します。
同様に"右点灯"をドラッグ、引数を10(1秒間)と入力します。
※命令をダブルクリックしても同じことができます。
※引数は、0-255 までの整数値を指定します。

左点灯,10
右点灯,10

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

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

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

◆LEDの命令
※引数 n は、0〜255の整数値です

命令 説明
右点灯,n 右LED(R)がnx0.1秒だけ点灯する 右点灯,10
左点灯,n 左LED(L)がnx0.1秒だけ点灯する 左点灯,10
両点灯,n 両方のLEDがnx0.1秒だけ点灯する 両点灯,10
消灯,n 両方のLEDがnx0.1秒だけ消灯する 消灯,10

次に上のプログラムの上下に次の命令を追加してください。
アンカー命令をドラッグして左点灯の上にドロップすると左点灯の前に挿入されます。

アンカー,10    //アンカー番号10
左点灯,10
右点灯,10
ジャンプ,10    //アンカー番号10へジャンプ

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

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

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

◆アンカーとジャンプ
プログラムは命令を順に実行しますが、ジャンプ命令はその流れを変えることができます。ジャンプ命令は引数と同じアンカー番号の所へジャンプします。
上の例では左右のLEDが交互に点滅します。
※アンカーは番号(1から127)を宣言するだけでなにも実行しません。
※アンカー番号の重複(同じアンカー番号を付けること)は禁止です。
※上のように繰り返すプログラムをループプログラムと呼びます。
※プログラムは保存ボタンを押してファイル名を指定し保存するようにしてください。
※MYUロボ-IIファイルの拡張子は'.txt'ですのでWINDOWSのメモ帳でもプログラムを編集できます。

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

入力ありジャンプ,n,p  //入力ポート番号(1-4)pが入力あり(ON)ならアンカー番号nにジャンプ
入力なしジャンプ,n,p  //入力ポート番号(1-4)pが入力なし(OFF)ならアンカー番号nにジャンプ
ブザー,n         //n x0.1秒の間 ブザーを鳴らす

MYUロボ-IIの触覚は、左がポート番号 2 (In2)、右がポート番号 3 (In3)に接続されています。下の例はIn2(左)の触覚が入力を感知したらブザーを鳴らし終了するプログラムです。
※タクトスイッチはポート番号 1 (In1)に接続されています

アンカー,10        //アンカー番号10を宣言
  左点灯,1
  右点灯,1
  入力ありジャンプ,11,2 //In2が入力ありならアンカー番号11へジャンプ
ジャンプ,10        //アンカー番号10にジャンプ
アンカー,11        //アンカー番号11を宣言
  ブザー,10       //ブザーを1秒鳴らす

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

アンカー,10       //アンカー番号10を宣言
  左点灯,1
  右点灯,1
  入力なしジャンプ,10,2 //In2が入力なしならアンカー番号10へジャンプ
  ブザー,10       //ブザーを1秒鳴らす

問題1:右の触覚(In3)で動作するように考えてください
問題2:両方の触覚(In2とIn3)、どちらでも動作するように考えてください

※ブザーや電子音は鳴っている間もLEDは点灯しています。

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

電子音,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        //両方のLEDを0.5秒間消す、音も出ない
ジャンプ,10        //アンカー番号10にジャンプ

※MYUロボ-IIソフトではMYUロボ命令の引数を省略することができます。省略すると待ち時間なしで次の命令を実行できます。

●歩行者用信号機プログラム
プログラムがスタートするとLEDの赤が点灯します。左の触覚(In2)が入力を感知するとLEDが3秒間、緑に変わりその後、赤信号に戻ります。

アンカー,10        //アンカー番号10を宣言
  右点灯        //右のLEDを(赤)点灯
  入力ありジャンプ,11,2 //In2が入力ありならアンカー番号11へジャンプ
ジャンプ,10        //アンカー番号10にジャンプ
アンカー,11        //アンカー番号11を宣言
  左点灯,30       //左のLEDを(緑)を3秒間点灯
ジャンプ,10        //アンカー番号10にジャンプ

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

アンカー,10        //アンカー番号10を宣言
  右点灯        //右のLEDを(赤)点灯
  入力なしジャンプ,10,2 //In2が入力なしならアンカー番号10へジャンプ
  左点灯,30       //左のLEDを(緑)を3秒間点灯
ジャンプ,10        //アンカー番号10にジャンプ

問題:緑信号の時、ブザーが同時に鳴るように考えてください。また、右の触覚(In3)で動作するようにしてください。

●ロボットのプログラム
下の命令を使ってプログラムします。※引数 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秒の間に右前の命令を入れ、左方向に修正した例です。前進と右前の時間の比率を変え調整します。

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

◆触覚を使ったプログラム
MYUロボ-IIの触覚は、入力ポートの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にジャンプ

※上の例の前進のように引数を省略すると前進の信号を出した後、待ち時間なしで次の命令を実行できます。

●ポート出力命令
ポート出力命令を使うと前進とLED点灯を同時に行うなど細かい制御ができます。

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

下の表から"前進"は130、"右点灯"は64、これを加えた値 194 をポートに出力すると前進と右点灯を同時に行えます。

ポート出力,10,194       //前進と右点灯を1秒間行う
ポート出力,10,B'11000010'  //同じ動作、2進数を使うとビット設定が楽にできます

ポートCの出力表(RC0-RC7)

命令 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 10進値 2進値
停止                 0 B'0'
左後               1 B'1'
右前               2 B'10'
右後               4 B'100'
左前               128 B'10000000'
前進             130 B'10000010'
後退             5 B'101'
右回り             129 B'10000001'
左回り             6 B'110'
右点灯               64 B'1000000'
左点灯               8 B'1000'
両点灯             72 B'1001000'

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

前進
ブザー,10

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

ブロックはじめ,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 回繰り返す

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


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

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

上の例では前進と右回りを繰返し実行しますからロボットは多角形を描くように動きます。
このプログラムは下のように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ロボ-IIソフトでは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)に変え動作の違いを理解してください。

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

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

下のプログラムは、左右のLEDにが点滅、左の触覚(In2)が入力を感知するとブザーが鳴り終了します。

入力なし繰り返す(2){
    左点灯,1
    右点灯,1
}
ブザー,2

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

繰り返す{
    左点灯,1
    右点灯,1
    入力あり(2){
        繰り返し脱出
    }
}
ブザー,2

●歩行者用信号機プログラム(制御命令を使った例)
プログラムがスタートするとLEDの赤が点灯します。左の触覚(In2)が入力を感知するとLEDが3秒間、緑に変わりその後、赤信号に戻ります。

繰り返す{
    右点灯        //右のLEDを(赤)点灯
    入力あり(2){
        左点灯,30  //左のLEDを(緑)を3秒間点灯
    }
}

下は、'入力なし繰り返す(n){..}' を使った例です。同じ動きをします。

繰り返す{
    入力なし繰り返す(2){
        右点灯     //右のLEDを(赤)点灯
    }
    左点灯,30        //左のLEDを(緑)を3秒間点灯
}

問題:緑信号の時、ブザーが同時に鳴るように考えてください。また、右の触覚(In3)でも動作するようにしてください。

◆{..}について
制御命令{..}は入れ子構造といって内部にいくつもの制御命令{..}を書くことができます。"{"と"}"はセットになっていて内側の制御命令{..}と区別します。
下の様に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ロボ-IIソフトでは"サブプログラム サブプログラム名"に続き{..}内にプログラムを書きます。

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

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

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

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

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

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

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

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

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

//LEDの明るさを3段階に変える
繰り返す(250){     //デューティ比10%の明るさ
  繰り返す(20){
    両点灯
  }
  繰り返す(180){
    消灯
  }
}
繰り返す(250){     //デューティ比50%の明るさ
  繰り返す(100){
    両点灯
  }
  繰り返す(100){
    消灯
  }
}
繰り返す(250){     //デューティ比90%の明るさ
  繰り返す(180){
    両点灯
  }
  繰り返す(20){
    消灯
  }
}

◆Aレジスタ
MYUロボ-II基板はマイクロコンピュターを搭載しています。この中の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 比較 n){..} //Aレジスタと n 比較して条件が成り立てば、{..}内を実行
繰り返し脱出   //繰り返す{..} から抜け出し次の命令を実行する

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

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

◆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
AND,n Aレジスタの値とnをAND演算し、Aレジスタの値とします AND,10
OR,n Aレジスタの値とnををOR演算し、Aレジスタの値とします OR,10
XOR,n Aレジスタの値とnををXOR演算し、Aレジスタの値とします XOR,10
クリアA Aレジスタの値を0にします クリアA
増やす1 Aレジスタの値を1増やします 増やす1
減らす1 Aレジスタの値を1減らします 減らす1
AN,n AN番号nのアナログ値をAレジスタにセットします AN,10
PC,n PC(ポートC)にnを出力します PC,B'10101010'
PBA PB(ポートB)の値をAレジスタにセットします PBA
APC Aレジスタの値をPC(ポートC)に出力します APC
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

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

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

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

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

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


【計測と制御】
触覚は入力がある、ないというデジタル入力ですが、MYU-536 MYUロボ-II基板に光センサー(CDS)と抵抗(両方で100円程度)をハンダ付けするとアナログ計測が可能になります。
アナログ入力は明るさを 0-255 の値で判断するので計測と制御がより理解できるようになります。

●MYU-537 MYUロボ-II(CDS光センサー付) 3,186円(8%税込) は、最初からCDSがハンダ付けされています。

《デジタル入力表示とアナログ計測値》
基板とPCを転送ケーブルで接続、MYUロボ-II転送ソフトの右下に計測結果が表示されます。光センサー(CDS)にあたる光を遮ってみてください。アナログ計測値(0-255)が変化します。デジタル入力ではIn4部分が○から●となります。アナログ計測値は、制御プログラムのしきい値の参考にできます。



◆デジタル入力とアナログ入力の違い
デジタル入力のプログラムでは、入力あり、入力なしで判断しますので、光センサー(CDS)の場合、明るさのしきい値をプログラム側で設定できません。
アナログ入力を使えば、計測したアナログ値(Aレジスタ)によってしきい値を判断し、細かい制御が可能になります。
※光センサー(CDS)は、デジタルポート番号は 4 (In4) に、アナログポート番号は 10 (AN10) に接続されます。

●アナログ入力
アナログ入力はAN命令を使います。CDSはアナログポート番号 10 (AN10)に接続されています。
※光センサー(CDS)をアナログ計測した場合、値は明るいと小さく、暗くなると大きくなります。

AN , p  //アナログポート番号 p (10)のアナログ計測値をAレジスタにセットします

アナログ計測値は、制御命令の"もし(A 比較 n){..}" を使ってしきい値を設定します。
※しきい値とは、その値を境に判定などが変わる値のことです。

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

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

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

下は、CDS(In4)が暗くなるとLED消灯&ブザーが鳴り、明るいとLED点灯するプログラムです。

基板とPCを転送ケーブルで接続しアナログ値を計測します。アナログ入力の場合、その計測値を参考にしきい値nを変えることによって明るい部屋でも暗い部屋でも反応するプログラムが作れます。

//アナログ入力を使った例
繰り返す{
  AN,10         //AN10のアナログ値(明るさ)を、Aレジスタにセット
  もし(A > 100){    //CDS(In4)が暗くなると{・・}内を実行
    消灯
    ブザー,1     //ブザーを0.1秒鳴らす
  }
  そうでなければ{
    両点灯
  }
}
//デジタル入力を使った例を使った例
繰り返す{
  入力なし(4){     //CDS(In4)が暗くなると{・・}内を実行
    消灯
    ブザー,1     //ブザーを0.1秒鳴らす
  }
  そうでなければ{
    両点灯
  }
}

下は制御命令の"そうでなければ(A 比較 n){..}"や"そうでなければ{..}"を使った例です。
明るい場所では前進、CDSに手をかざすと停止、更に暗くすると後退します。

//一定の明るさで停止するロボット
繰り返す{
    AN,10           //AN10のアナログ値(明るさ)を、Aレジスタにセット
    もし(A < 100){       //明るい場合は前進(Aレジスタ値:0-99)
        前進
    }
    そうでなければ(A < 150){ //一定の明るさで停止(Aレジスタ値:100-149)
        停止
    }
    そうでなければ{      //暗い場合は後退(Aレジスタ値:150-255)
        後退
    }
}

アナログ計測値を電子音命令の引数に使った例です。
CDSに手をかざすと音の高さが変化します。

//明るさによって音の高さを変える
繰り返す{
    AN,10     //AN10のアナログ値(明るさ)を計測、Aレジスタにセット
    電子音,1,A  //Aレジスタの音を0.1秒ならす
}