スタジオ ミュウ

LED制御

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)命令一覧 | ドリトル命令一覧

●LEDを使った計測と制御
■MYU-532 LED計測制御キット(LEDハンダ付けタイプ)2,052円(8%税込)
■MYU-533 LED計測制御基板(LEDハンダ付け済み) 2,160円(8%税込)

■MYU-535 LED計測制御グループ学習セット(ハンダ付け済み) 2,538円(8%税込)

LED計測制御は、計測と制御の学習に最適です。簡単な操作(マウスと数字キー)だけでプログラムできます。日本語を使った命令や解りやすい制御文、簡単な操作による入力条件の設定など複雑な動作も簡単で解りやすいプログラムを作ることができます。
・光センサー(CDS)、USB転送ケーブル付き、メロディのプログラム可能

●LEDの制御ソフト
※LED用の制御ソフトは(myuledusb.zip) ここからダウンロード(V1.17 2017/3/1)できます。(64bitOS対応)
ダウンロードしたmyuledusb.zipを展開しmyuledホルダをCD-ROM・ハードディスク・サーバー・USBメモリなどにコピーしてください。

●起動方法
ホルダ中のMYULED.EXE(青いアイコン)を実行するとMYU-LED転送ソフトが起動します。(初心者向)
ホルダ中のMYULEDBASIC.EXE(赤いアイコン)を実行するとMYU USB BASICが起動します。(上級者向)

●LEDのリモート制御やリアルタイム計測(右図参照)
MYULED.EXEまたはMYULEDBASIC.EXEを立ち上げ、基板とPCを転送ケーブルで接続するとリモート制御やリアルタイム計測が出来ます。

ソフト右下のC7からC0までにチェックを入れると対応したLEDを光らすことができます。(ポート出力)

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

下のようにドライバなどで基板のIn2やIn3と-Vを接触してください。デジタル入力表示のIn2やIn3が変化します。
※In2やIn3にスイッチなどを接続して制御に利用できます。




●MYU-LED転送ソフト (myuled.exe)
MYULED.EXE(青いアイコン)を使ってLEDのプログラムを説明します。MYULED.EXEを立ち上げ、開くボタンを押してLEDサンプル1.txtを読み込んでください。PCと基板とを転送ケーブルで接続し転送ボタンを押し、転送しますか?<はい>で転送され'ピピ'と鳴り転送終了です。転送ケーブルを抜きタクトスイッチを押すとプログラムが実行されます。
プログラムは、マウスを使って命令を編集ボックスに部品を配置するようにして作ります。

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

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

●アナログ値自動計測(計測値をエクセルで表やグラフ表示)
右上ダイヤログの右下にある記録開始ボタンを押すとアナログ値の自動計測が始まります。
計測中はダイヤログが現れ記録停止のOKボタンを押すことで計測結果がファイル(myu.txt)に保存され終了します。
右は計測間隔を300秒(5分ごと)として夕方6時から8時ごろまでの明るさを記録したファイル(myu.txt)をエクセルで読み込み、表とグラフにしたものです。
時間とともにアナログ値が変化しているのが解ります。
※ファイル(myu.txt)はmyuledホルダー内にできます。
※ファイル(myu.txt)はテキストファイルなのでメモ帳でも見ることができます。
※エクセルでファイル(myu.txt)を読み込むには、ファイルの種類をすべてのファイル(*.*)にして読み込みます。
※A列のセル書式設定を時刻にすると右の表のようになります。
※myu.txtを別の名前にして保存できます。


●LEDの制御プログラム
myuled.exe(青いアイコン)を立ち上げ命令ボックス内の"ポート出力"をクリックしてください。下の解説ボックスに説明が表示されます。
続けて"ポート出力"をドラッグして編集ボックスにドロップしてください。右の引数入力用ダイアログが現れます。
引数1に"10"と入力し改行キーを押し、引数2に B'01010101' と入力し改行キーを押します。編集ボックスには以下のように表示されます。
※命令をダブルクリックしても同じことができます。

ポート出力,10,B'01010101'

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

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

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

●ポート出力命令
LEDのプログラムはポート出力命令を使います。ICのポートCにデータを出力することによってLEDを点灯させます。
ポート出力命令は使うソフトよって命令が違います。また、命令の引数は2進数を使うと便利です

ポート出力,m,n   //第1引数m(0-255)x0.1秒だけ 第2引数のデータn(0-255)をポートに出力する (MYU-LED転送ソフト)
PortOut m,n    //第1引数m(0-255)x0.1秒だけ 第2引数のデータn(0-255)をポートに出力する (MYU USB BASIC)

◆2進数を使う
右図は、10進数と2進数の比較表です。2進数の'1'はLEDの点灯、'0'は消灯となります。
LEDを制御するには2進数を使った方が便利です。LEDは8個あり、2進数を使うには、 B'01010101' のように書きます。
※B' 'は、ビットを表します。ビットはデータの最小単位で8ビットで1バイト(0-255)となります。

ポート出力,10,B'01010101' //LEDを1個おきに1秒光らせる。 LEDは、○●○●○●○● のように光ます。

下は応用例です。LEDの光が左に流れるプログラムです。

//LEDの光が0.1秒間隔で左に流れる
ポート出力,1,B'00000001'
ポート出力,1,B'00000010'
ポート出力,1,B'00000100'
ポート出力,1,B'00001000'
ポート出力,1,B'00010000'
ポート出力,1,B'00100000'
ポート出力,1,B'01000000'
ポート出力,1,B'10000000'

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

以下、交互にLEDを0.1秒間隔で点滅させるプログラムです。基板に転送しタクトスイッチを押すと動作します。

アンカー,10    //アンカー番号10
ポート出力,1,B'01010101'
ポート出力,1,B'10101010'
ジャンプ,10    //アンカー番号10へジャンプ

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

アンカー,n  //アンカー番号(1から127) n を宣言する(MYU-LED転送ソフト)
ジャンプ,n  //アンカー番号 n にジャンプする(MYU-LED転送ソフト)

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

◆制御命令(MYU-LED転送ソフト)
ジャンプ命令は番号を使うので複雑なプログラムでは解りにくくなってしまいます。
制御命令を使うと複雑な動作も簡単で解りやすいプログラムを書く事ができます。下は上のプログラムを制御命令を使って書いた例です。

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

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

//制御命令を使った例
繰り返す{
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
}
//ジャンプ命令を使った例
アンカー,10    //アンカー番号10
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
ジャンプ,10    //アンカー番号10へジャンプ


上のプログラムは下のように1行で書くこともできます。1行で書く場合は"ポート出力,1,B'01010101'"と"ポート出力,1,B'10101010'"の間に空白を入れます。

繰り返す{ポート出力,1,B'01010101' ポート出力,1,B'10101010'}

MYU USB BASIC(myuledbasic.exe)を使っても同じ動作をするプログラムを作れます。

//LEDを1つおき0.1秒間隔で交互に光らせる(MYU USB BASIC)
Do
  PortOut 1,B'01010101'
  PortOut 1,B'10101010'力
Loop

応用例でLEDの光が左に流れるプログラムです。他のシフトパターンも試してください。

//LEDの光が0.1秒間隔で左に流れる(MYU-LED転送ソフト)
繰り返す{
  ポート出力,1,B'00000001'
  ポート出力,1,B'00000010'
  ポート出力,1,B'00000100'
  ポート出力,1,B'00001000'
  ポート出力,1,B'00010000'
  ポート出力,1,B'00100000'
  ポート出力,1,B'01000000'
  ポート出力,1,B'10000000'
}
//LEDの光が0.1秒間隔で左に流れる(MYU USB BASIC)
Do
  PortOut 1,B'00000001'
  PortOut 1,B'00000010'
  PortOut 1,B'00000100'
  PortOut 1,B'00001000'
  PortOut 1,B'00010000'
  PortOut 1,B'00100000'
  PortOut 1,B'01000000'
  PortOut 1,B'10000000'
Loop

◆PC(ポートC)命令を使う (LEDを光らせながら音を出す)
PC命令を使ってもLEDを光らせることができます。PC命令を使うとLEDとブザーやメロディのプログラムが可能になります。

//MYU-LED転送ソフト
PC,n   //ポートCにn(0-255)を出力
ブザー,n //n x0.1秒の間 ブザーを鳴らす
//MYU USB BASIC
PC=n   //ポートCにn(0-255)を出力
Buzzer n //n x0.1秒の間 ブザーを鳴らす

PC命令は時間が設定できません。PC命令の後にブザー命令で時間を設定するとLEDを光らせながらブザーを鳴らすことができます。
下はPC命令とブザー命令を使って警告音を鳴らすプログラム例です。電子音命令を使うとメロディを鳴らすことができます

//LEDを1つおき0.1秒間隔で交互に光らせ警告音を鳴らす(MYU-LED転送ソフト)
繰り返す{
  PC,B'01010101'
  ブザー,1           //ブザーを0.1秒ならす
  ポート出力,1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
}
//LEDを1つおき0.1秒間隔で交互に光らせ警告音を鳴らす(MYU USB BASIC)
Do
  PC=B'01010101'     //ポートCにB'01010101'を出力
  Buzzer 1         //ブザーを0.1秒ならす
  PortOut 1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
Loop

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

電子音,m,n    //第1引数m(0-255)x0.1秒だけ 第2引数n(1-255)パルス幅の音を鳴らす (転送ソフト)
PulsOut m,n   //第1引数m(0-255)x0.1秒だけ 第2引数n(1-255)パルス幅の音を鳴らす (MYU BASIC)

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

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

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

//「ドレミ」を繰り返し演奏(転送ソフト)
繰り返す{
  PC,B'00000001'       //ポートCにB'00000001'を出力
  電子音,5,80         //「ド」の音をを0.5秒ならす
  PC,B'00000011'       //ポートCにB'00000011'を出力
  電子音,5,71         //「レ」の音をを0.5秒ならす
  PC,B'00000111'       //ポートCにB'00000111'を出力
  電子音,5,63         //「ミ」の音をを0.5秒ならす
  ポート出力,5,B'00001111' //ポートCにB'0000111'を出力
}
//「ドレミ」を繰り返し演奏(MYU BASIC)
Do
  PC=B'00000001'  //ポートCにB'00000001'を出力
  PulsOut 5,80   //「ド」の音をを0.5秒ならす
  PC=B'00000011'  //ポートCにB'00000011'を出力
  PulsOut 5,71   //「レ」の音をを0.5秒ならす
  PC=B'00000111'  //ポートCにB'00000111'を出力
  PulsOut 5,63   //「ミ」の音をを0.5秒ならす
  PortOut 5,B'00001111' //ポートCにB'0000111'を出力
Loop

◆サブプログラム
プログラムで何回も同じ処理をすることがあります。この部分をサブプログラムとしてメインプログラムとは別に作っておくとプログラムが見やすくコンパクトになります。
MYU-LED転送ソフトでは"サブプログラム サブプログラム名"に続き{..}内にプログラムを書きます。
サブプログラムはそのままではなにも動作しません。メインプログラムやサブプログラム内でサブプログラム名を使うことで呼び出され処理の終わりとともに呼ばれた場所に戻ります。

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

//サブプログラム使用例(MYU-LED転送ソフト)
繰り返す{
  警告音
  警告音
  左シフト
  警告音
  警告音
  右シフト
}         //ここまでがメインプログラム
サブプログラム 左シフト{
  ポート出力,1,B'00000001'
  ポート出力,1,B'00000010'
  ポート出力,1,B'00000100'
  ポート出力,1,B'00001000'
  ポート出力,1,B'00010000'
  ポート出力,1,B'00100000'
  ポート出力,1,B'01000000'
  ポート出力,1,B'10000000'
}
サブプログラム 右シフト{
  ポート出力,1,B'10000000'
  ポート出力,1,B'01000000'
  ポート出力,1,B'00100000'
  ポート出力,1,B'00010000'
  ポート出力,1,B'00001000'
  ポート出力,1,B'00000100'
  ポート出力,1,B'00000010'
  ポート出力,1,B'00000001'
}
サブプログラム 警告音{
  PC,B'01010101'       //ポートCにB'01010101'を出力
  ブザー,1           //ブザーを0.1秒ならす
  ポート出力,1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
}

※サブプログラム名は数字以外で始まり半角アルファベット、全角文字、数字が使えます。
※サブプログラムはどこに在ってかまいませんがプログラムの見やすさを考えるとメインプログラムの後ろに置いた方が良いでしょう。
※戻る命令を使うとサブプログラムの途中から戻れます。

●キッチンタイマー
一定時間の後、警告音を鳴らすプログラムです。

編集ボックスをクリア、"繰り返す(){}"をドラックすると右のダイヤログが現れ繰り返すの回数を入力します。

※制御命令の"繰り返す(n){..}" は{..}内を n回繰り返かえします。繰り返かえしを終了すると次の命令を実行します。
※繰り返しの回数を指定することで大きな時間が設定できます。

//30秒後、警告音を鳴らす(MYU-LED転送ソフト)
繰り返す(30){  //( )内の数字x1秒待ち(30秒待ち)
  待つ,10    //1秒の待ち
}
繰り返す{            //警告音
  PC,B'01010101'      //ポートCにB'01010101'を出力
  ブザー,1           //ブザーを0.1秒ならす
  ポート出力,1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
}
//30秒後、警告音を鳴らす(MYU USB BASIC)
Byte S       //変数Sの宣言
For S=1 To 30 //30秒待ち
  Wait 10     //1秒の待ち
Next
Do               //警告音
  PC=B'01010101'    //ポートCにB'01010101'を出力
  Buzzer 1         //ブザーを0.1秒ならす
  PortOut 1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
Loop

●目覚ましタイマー
8時間15分後、警告音を鳴らすプログラムです。

//8時間15分後、警告音を鳴らす(MYU-LED転送ソフト)
繰り返す(8){      //()内の数字x時間タイマー(8時間待ち)
  繰り返す(180){  //20x180=3600秒=1時間待ち
    待つ,200   //20秒の待ち
  }
}
繰り返す(45){  //20x45=900秒=15分待ち
  待つ,200   //20秒の待ち
}
繰り返す{            //警告音
  PC,B'01010101'      //ポートCにB'01010101'を出力
  ブザー,1           //ブザーを0.1秒ならす
  ポート出力,1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
}
//8時間15分後、警告音を鳴らす(MYU USB BASIC)
Byte S,SS       //変数S,SSの宣言
For SS=1 To 8     //8時間待ち
  For S=1 To 180  //1時間待ち
    Wait 200   //20秒の待ち
  Next
Next
For S=1 To 45    //15分待ち
  Wait 200     //20秒の待ち
Next
Do               //警告音
  PC=B'01010101'    //ポートCにB'01010101'を出力
  Buzzer 1         //ブザーを0.1秒ならす
  PortOut 1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
Loop

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

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

◆Aレジスタ
MYULED-1基板はマイクロコンピュターを搭載しています。この中のAレジスタは、1バイトの値(0-255)を記憶でき計算や数の比較などができます。
Aレジスタは命令の引数に使えます。Aレジスタの値によって動きを変えることができます。
また、アナログ計測の値をAレジスタに読み込むことができ応用範囲が広がります。
下のプログラムは0.1秒ごとLEDの2進数を1づつ増やすというものです。Aレジスタの値を1づつ増やしポートCに出力しています。

//0.1秒ごとにポートCの値を1づつ増やす(MYU-LED転送ソフト)
繰り返す{
  加える,1     //Aレジスタの値に1を加える
  ポート出力,1,A //Aレジスタの値を0.1秒出力
}
//0.1秒ごとにポートCの値を1づつ増やす(MYU USB BASIC)
Byte C          //変数Cの宣言
Do
  C=C+1     //変数Cに1を加える
  PortOut 1,C //変数Cの値を0.1秒出力
Loop

※プログラム開始時、Aレジスタの値は 0 となっています。

//0.1秒ごと値を1づつ増し音の高さも変える(MYU-LED転送ソフト)
繰り返す{
  増やす1    //Aレジスタの値を1増やす
  PC,A     //Aレジスタの値を出力
  電子音,1,A //Aレジスタ幅の音を0.1秒出す
}
//0.1秒ごと値を1づつ増し音の高さも変える(MYU USB BASIC)
Byte C          //変数Cの宣言
Do
  ++C     //変数Cの値を1増やす
  PC=C     //変数Cの値を出力
  PulsOut,1,C //変数Cの幅の音を0.1秒出す
Loop

//左シフト回転(MYU-LED転送ソフト)
A,B'11'        //Aレジスタの値をB'11'(3)にする
繰り返す{
  ポート出力,1,A //Aレジスタの値を0.1秒出力
  左シフト       //Aレジスタの値を左シフト回転
}
//左シフト回転(MYU USB BASIC)
Byte C              //変数Cの宣言
C=B'11'             //変数Cの値をB'11'(3)にする
Do
  PortOut 1,C         //変数Cの値を0.1秒出力
  If C AND B'10000000' Then
    C=<<C + 1      //変数Cを左シフト回転
  Else
    C=<<C        //変数Cを左シフト
  EndIf
Loop

※Aレジスタや変数で扱う値は0〜255までの整数値です。値が255の時、1加えると0になります。同様に0の時、1引くと255になります。

◆レジスタ命令
よく使うレジスタ命令です。※扱う値は、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(キャリー)ビットを含めて右シフト回転します(値が半分になる) 右シフト

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

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

◆MYULED-1基板のエラーについて
MYULED-1基板は深さ16レベル以上のサブプログラム呼び出しやIXを128以上にセットしIXMを使うとエラーとなり警告音を鳴らし続けます。

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


◆制御命令一覧
制御命令 説明
繰り返す{..} {..}内を繰り返し実行する。{..}内から脱出するには'繰り返し脱出'命令を使う
繰り返す(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)

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


【入力ポートを使った計測と制御プログラム】
今までのプログラムは出力ポートの制御でした。ここからは入力ポートを使った計測と制御を学習します。
入力ポートにはデジタル入力とアナログ入力の2種類があります。
※この基板のデジタル入力ポートにはタクトスイッチ(In1)とCDS光センサー(In4)、出力ポートにはLEDが接続されています。

●デジタル入力
基板にはデジタル入力ポートを4個(In1,In2,In3,In4)持っています。入力ポートは番号によって区別されます。
※タクトスイッチはポート番号 1 (In1)、CDSはポート番号 4 (In4)に接続されています。

◆入力ポートによる条件ジャンプ:入力ありジャンプと入力なしジャンプ(MYU-LED転送ソフト)
入力ありジャンプと入力なしジャンプは、入力ポートの状態によって指定したアンカー番号にジャンプします。

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

下の例はタクトスイッチ(In1)を押す間、LEDを点滅、離すとブザー鳴らしプログラムが終了します。

アンカー,10
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
入力ありジャンプ,10,1     //タクトスイッチ(In1)が入力ありならアンカー番号10へジャンプ
  ブザー,1

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

アンカー,10
  入力なしジャンプ,11,1   //タクトスイッチ(In1)が入力なしならアンカー番号11へジャンプ
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
ジャンプ,10           //アンカー番号10にジャンプ
アンカー,11
  ブザー,1

◆光センサー(CDS)
光センサー(CDS)はIn4に接続されています。下の例は、CDS(In4)にあたる光が明るいとLEDを点滅、暗いとブザー鳴らしプログラムが終了します。
※光センサー(CDS)は、明るいと入力あり、暗いと入力なしとなります。

アンカー,10
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
入力ありジャンプ,10,4     //CDS(In4)が入力ありならアンカー番号10へジャンプ
  ブザー,1

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

アンカー,10
  入力なしジャンプ,11,4   //CDS(In4)が入力なしならアンカー番号11へジャンプ
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
ジャンプ,10           //アンカー番号10にジャンプ
アンカー,11
  ブザー,1

●制御命令
ジャンプ命令は番号を使うので複雑なプログラムでは解りにくくなってしまいます。
下は制御命令を使ってデジタル入力ポートを調べる例です。

◆入力ポートによる制御命令1:入力あり(n){..}と入力なし(n){..} (MYU-LED転送ソフト)

入力あり(p){..}   //デジタル入力ポート番号(1-4) p が入力ありなら{..}内を実行する
入力なし(p){..}   //デジタル入力ポート番号(1-4) p が入力なしなら{..}内を実行する
そうでなければ{..} //入力ありや入力なしの条件が成立たない場合、{..}内を実行する
繰り返し脱出   //繰り返す{..} から抜け出し次の命令を実行する

制御命令用命令ボックス内の"入力なし(){}"をドラックすると右のダイヤログが現れます。
In4(CDS光センサー)にチェックを入れOKボタンを押し下のようにします。

上の例と同じ動作します。CDS(In4)にあたる光が明るいとLEDを点滅、暗いとブザー鳴らしプログラムが終了します。

//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU-LED転送ソフト)
繰り返す{
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
  入力なし(4){     //In4が暗くなったら繰り返し脱出
    繰り返し脱出
  }
}
ブザー,1
//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU USB BASIC)
Do
  PortOut 1,B'01010101'
  PortOut 1,B'10101010'
  If In(4)=0 Then    //In4が暗くなったらThen End内を実行
    ExitDo
  EndIf
Loop
Buzzer 1

下は、'入力あり{..}'と'そうでなければ{..}'の制御命令を使った例です。同じ動作をします。

//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU-LED転送ソフト)
繰り返す{
  入力あり(4){     //In4が明るい場合、{..}内を実行
    ポート出力,1,B'01010101'
    ポート出力,1,B'10101010'
  }
  そうでなければ{
    繰り返し脱出
  }
}
ブザー,1
//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU USB BASIC)
Do
  If In(4)=1 Then    //In4が明るい場合、Then End内を実行
    PortOut 1,B'01010101'
    PortOut 1,B'10101010'
  Else
    ExitDo
  EndIf
Loop
Buzzer 1

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

入力あり繰り返す(p){..}  //デジタル入力ポート番号(1-4) p が入力ありの間、{..}内を繰り返し実行、入力なしになると次の命令を実行
入力なし繰り返す(p){..}  //デジタル入力ポート番号(1-4) p が入力なしの間、{..}内を繰り返し実行、入力ありになると次の命令を実行


制御命令用命令ボックス内の"入力あり繰り返す(){}"をドラックすると右のダイヤログが現れます。
In4(CDS光センサー)にチェックを入れOKボタンを押します。

条件ループ文を使っても上と同じ動作をするプログラムが作れます。
In4が入力あり(CDSが明るい)の間、{..}内を繰り返し実行、暗くなったら{..}を抜け次のブザー命令を実行します。

//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU-LED転送ソフト)
入力あり繰り返す(4){ //CDS(In4)が明るい間{・・}内を繰り返し実行
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
}
ブザー,1
//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU USB BASIC)
Do While In(4)=1   //CDS(In4)が明るい間Do・・Loop内を繰り返し実行
  PortOut 1,B'01010101'
  PortOut 1,B'10101010'
Loop
Buzzer 1


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

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

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

AN,p  //アナログポート番号pの計測値をAレジスタにセット(MYU-LED転送ソフト)
AN(p) //アナログポート番号pの計測値を返す関数(MYU USB BASIC)

アナログ計測値は、制御命令の"もし(A 比較 n){..}" を使ってしきい値を設定します。(MYU-LED転送ソフト)
アナログ入力の場合、しきい値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を点滅、暗いとブザー鳴らし終了(MYU-LED転送ソフト)
繰り返す{
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
  AN,10       //AN10の計測値をAレジスタにセット
  もし(A > 100){  //暗くなると{・・}内を実行
    繰り返し脱出
  }
}
ブザー,1
//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU USB BASIC)
Do
  PortOut 1,B'01010101'
  PortOut 1,B'10101010'
  If AN(10) > 100 Then //暗くなるとThen End内を実行
    ExitDo
  EndIf
Loop
Buzzer 1

繰り返す(A 比較 n){..} //Aレジスタの値と n を比較して条件が成り立つ間、{..}内を繰り返し実行、成り立たない場合、次の命令を実行

"繰り返す(A 比較 n){..}"は、条件ループ文です。Aレジスタの値と n を比較して条件が成り立つ間、{..}内のプログラムを繰り返し実行します。
条件が成りたたなくなると{..}内から抜け次のプログラムを実行します。

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

下は"繰り返す(A 比較 n){..}"を使った例です。上と同じ動作をします。

//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU-LED転送ソフト)
AN,10
繰り返す(A < 100){       //明るい間{・・}内を繰り返し実行
  ポート出力,1,B'01010101'
  ポート出力,1,B'10101010'
  AN,10             //{・・}内でAN命令を行う
}
ブザー,1
//明るいとLEDを点滅、暗いとブザー鳴らし終了(MYU USB BASIC)
Do While AN(10) < 100 //明るい間Do Loop間を繰り返し実行
  PortOut 1,B'01010101'
  PortOut 1,B'10101010'
Loop
Buzzer 1

●アナログ計測値の2進数表示
下はアナログ計測値をポートCに出力したものです。アナログ計測値が2進数で表示されます。
※明るさによってLEDの光り方が変わります。

//CDSのアナログ計測値を2進数で表示(MYU-LED転送ソフト)
繰り返す{
  AN,10
  ポート出力,1,A //Aレジスタの値をポートCに0.1秒出力
}
//CDSのアナログ計測値を2進数で表示(MYU USB BASIC)
Do
  PC=AN(10)     //AN10の計測値をポートCに出力
Loop

●アナログ計測値のLED表示
2進数表示では解りにくいので改良したものです。しきい値を多数設定しLEDの光り方を変えています。
※制御命令の"そうでなければ(A 比較 n){..}"や"そうでなければ{..}"を使った例です。

//CDSのアナログ計測値をLEDの点灯数で表示(MYU-LED転送ソフト)
繰り返す{
  AN,10
  もし(A < 28){        //Aレジスタの値が28より小さい場合
    PC,B'1111111'
  }
  そうでなければ(A < 57){ //Aレジスタの値が28-56の場合
    PC,B'01111111'
  }
  そうでなければ(A < 85){ //Aレジスタの値が57-84の場合
    PC,B'00111111'
  }
  そうでなければ(A < 114){ //Aレジスタの値が85-113の場合
    PC,B'00011111'
  }
  そうでなければ(A < 142){ //Aレジスタの値が113-141の場合
    PC,B'00001111'
  }
  そうでなければ(A < 171){ //Aレジスタの値が142-170の場合
    PC,B'00000111'
  }
  そうでなければ(A < 199){ //Aレジスタの値が171-198の場合
    PC,B'000000011'
  }
  そうでなければ(A < 228){ //Aレジスタの値が199-227の場合
    PC,B'000000001'
  }
  そうでなければ{      //Aレジスタの値が228-255の場合
    PC,B'00000000'
  }
}
//CDSのアナログ計測値をLEDの点灯数で表示(MYU USB BASIC)
Byte A          //変数Aの宣言
Do
  A=AN(10)       //AN10の計測値を変数Aにセット
  If A < 28 Then    //変数Aの値が28より小さい場合
    PC=B'1111111'
  ElseIf A< 57 Then //変数Aの値が28-56の場合
    PC=B'01111111'
  ElseIf A < 85 Then //変数Aの値が57-84の場合
    PC=B'00111111'
  ElseIf A < 114 Then //変数Aの値が85-113の場合
    PC=B'00011111'
  ElseIf A < 142 Then //変数Aの値が113-141の場合
    PC=B'00001111'
  ElseIf A < 171 Then //変数Aの値が142-170の場合
    PC=B'00000111'
  ElseIf A < 199 Then //変数Aの値が171-198の場合
    PC=B'000000011'
  ElseIf A < 228 Then //変数Aの値が199-227の場合
    PC=B'000000001'
  Else          //変数Aの値が228-255の場合
    PC=B'00000000'
  EndIf
Loop


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

//CDSのアナログ計測値によってLEDの明るさを変える(MYU-LED転送ソフト)
繰り返す{
  AN,10         //AN10の計測値をAレジスタにセット
  繰り返す(A > 40){  //Aレジスタの値により繰返す回数を変える
    PC,B'11111111' //LEDを8個点灯
    DECA       //Aレジスタの値を1減らす
  }         //繰返す回数が多いと明るい時間が長くなる
  AN,10         //AN10の計測値をAレジスタにセット
  繰り返す(A < 250){  //Aレジスタの値により繰返す回数を変える
    PC,B'00000000' //LEDを8個消灯
    INCA       //Aレジスタの値を1増やす
  }         //繰返す回数が多いと暗い時間が長くなる
}
//CDSのアナログ計測値をLEDの明るさを変える(MYU USB BASIC)
Byte A,B          //変数AとBの宣言
Do
  A=AN(10)      //AN10の計測値を変数Aにセット
  For B=40 To A    //繰返す回数が多いと明るい時間が長くなる
    PC=B'11111111' //LEDを8個点灯
  Next
  For B=A To 250   //繰返す回数が多いと暗い時間が長くなる
    PC=B'00000000' //LEDを8個消灯
  Next
Loop

//LEDの明るさを3段階に変える(MYU-LED転送ソフト)
繰り返す(250){     //デューティ比10%の明るさ
  繰り返す(20){
    PC,B'11111111'
  }
  繰り返す(180){
    PC,B'00000000'
  }
}
繰り返す(250){     //デューティ比50%の明るさ
  繰り返す(100){
    PC,B'11111111'
  }
  繰り返す(100){
    PC,B'00000000'
  }
}
繰り返す(250){     //デューティ比90%の明るさ
  繰り返す(180){
    PC,B'11111111'
  }
  繰り返す(20){
    PC,B'00000000'
  }
}
//LEDの明るさを3段階に変える(MYU USB BASIC)
Byte A,B         //変数AとBの宣言
For A=0 To 100     //デューティ比10%の明るさ
  For B=1 To 10
    PC=B'11111111'
  Next
  For B=1 To 90
    PC=B'00000000'
  Next
Next
For A=0 To 100     //デューティ比50%の明るさ
  For B=1 To 50
    PC=B'11111111'
  Next
  For B=1 To 50
    PC=B'00000000'
  Next
Next
For A=0 To 100     //デューティ比90%の明るさ
  For B=1 To 90
    PC=B'11111111'
  Next
  For B=1 To 10
    PC=B'00000000'
  Next
Next

サンプルプログラム1 (LEDサンプル2)
タクトスイッチ(In1)を押すと左、離すと右へ移動点灯する。

//タクトスイッチ(In1)を押すと左へ離すと右へ移動
A,1         //Aレジスタに1をセット、値を変えるとシフトパターンが変わる
繰り返す{      //{..}内を繰り返す
  APC       //Aレジスタの値をポートCに出力
  電子音,1,A    //Aレジスタ幅の音を0.1秒鳴らす
  入力あり(1){  //In1を押したら
    RLA     //Aレジスタを左シフト
  }
  そうでなければ{
    RRA     //Aレジスタを右シフト
  }
}
//タクトスイッチ(In1)を押すと左へ離すと右へ移動
PC=1        //ポートCに1を出力
Do
  PulsOut 1,PC     //PC幅の音を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 (LEDサンプル4)
//タクトスイッチを1回押すことに30秒づつキッチンタイマーの時間が増える
//0.5秒以上押すことでキッチンタイマーの時間をセット
//再度タクトスイッチを押すことで作動

//30秒ごとのキッチンタイマー(MYU-LED転送ソフト)
A,0              //Aレジストの値を0にする
入力あり繰り返す(1){    //タクトスッイチを離すのを待つ
}
繰り返す{
  ブザー,1        //1回押すことに0.1秒ブザー
  INCA          //Aレジスタの値を1増やす
  APC           //Aレジスタの値をLEDに表示
  入力なし繰り返す(1){  //タクトスッイチを押すのを待つ
  }
  待つ,5          //0.5秒待つ
  入力あり(1){      //0.5秒以上押すと繰り返す脱出
    繰り返し脱出
  }
}
ブザー,10          //セットされると1秒ブザー
入力なし繰り返す(1){    //タクトスイッチを押すのを待つ
}
ブザー,1          //タイマー作動、0.1秒ブザー
繰り返す(A > 0){      //Aレジスタの値x30秒待ち
  繰り返す(30){      //30秒のタイマー
    待つ,10       //1秒の待ち
  }
  DECA          //Aレジスタを1減らす
  APC           //Aレジスタの値をLEDに表示
}
繰り返す{         //警告音作動
  PC,B'01010101'      //ポートCにB'01010101'を出力
  ブザー,1           //ブザーを0.1秒ならす
  ポート出力,1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
}






//30秒ごとのキッチンタイマー(MYU USB BASIC)
Byte C,CC         //変数CとCCの宣言
C=0             //変数Cを0にする
Do While In(1)=0      //タクトスッイチを離すのを待つ
Loop
Do
  Buzzer 1        //1回押すことに0.1秒ブザー
  ++C          //変数Cの値を1増やす
  PC=C           //変数Cの値をLEDに表示
  Do While In(1)     //タクトスッイチを押のを待つ
  Loop
  Wait 5          //0.5秒待つ
  If In(1)=0 Then     //0.5秒以上押すとDo Loop脱出
    ExitDo
  EndIf
Loop
Buzzer 10          //セットされると1秒ブザー
Do While In(1)       //タクトスイッチを押すのを待つ
Loop
Buzzer 1          //タイマー作動、0.1秒ブザー//
Do While C > 0      //変数Cの値x30秒待ち
  For CC=1 To 30    //30秒のタイマー
    Wait 10       //1秒の待ち
  Next
  --C          //変数Cを1減らす
  PC=C           //変数Cの値をLEDに表示
Loop
Do             //警告音作動
  PC=B'01010101'    //ポートCにB'01010101'を出力
  Buzzer 1       //ブザーを0.1秒ならす
  PortOut 1,B'10101010' //0.1秒間ポートCにB'10101010'を出力
Loop