MYUROBO-2制御基板
メロディのプログラム | センサープログラム | RCサーボの制御 | 入出力プログラム | モーターのPWM制御 | LEDの制御 | 計測と制御
MYU-USB転送ソフト | MYU BASIC | MYUROBO転送ソフト | 構造化ドリトル | エクセルで制御 | エクセルで計測 | ミュウアセンブラ | 688基盤
| MYUROBO2基板 ミュウロボ命令一覧 | ミュウアセンブラ一覧 | 構造化ドリトル制御命令一覧


プログラムサイズが2Kとなり、I/Oも増えたので複雑で実用的な制御が可能!

<MYUROBO-2制御基板の特徴>
・単3電池2本(3V)だけで4個のモーターを制御できます。
・制御ソフトはMYU BASICMYUROBO転送ソフトドリトルの3種類の中から選んでプログラミング。
・転送ケーブル付き。パソコンから直接転送されるのでインターフェース回路や書込み装置が不要。
・制御プログラムは2KByteまで保存可能。PIC16F88のフラッシュメモリに書き込まれので電源を切っても覚えている。
・ラジコン用サーボモーター7個まで制御可能。またメロディのプログラムも可能。
・標準で6BITのデジタル入力、5チャンネルの8/10BITアナログ入力、8BITの出力ポートを持ちシリアルポートの入出力可能
・16BIT符号付四則演算やタイマー・ポート命令など細かい制御が可能。
・ICSP(PICkit2などを使いPICのオンボード書込)可能。

<主な仕様>
動作電圧: 2.5V-5.5V
内部クロック:8MHz タイマー1:250KHz
ユーザープログラムサイズ:2047bytes 変数エリア:80bytes サブルーチンの深さ:10
各モータードライバー最大負荷:1W(電圧×電流)以内
デジタルポート:入力6BIT + 出力8BIT
アナログ入力:5チャンネル(8/10BIT)
シリアルポート:9600bps StopBit=1 ノンパリティ フロー制御無

<PIC16F88ピンの説明>
1:RA2(出力) M1R(モーター1R),S7(サーボ7),AN2(アナログ入力2)
2:RA3(出力) M1L(モーター1L),S6(サーボ6),AN3(アナログ入力3)
3:RA4(出力) M2L(モーター2L),S4(サーボ5),AN4(アナログ入力4)
4:RA5(入力) シリアル信号入力用
5:-V
6:RB0(出力) LEDと圧電ブザー、シリアル信号出力用
7:RB1(入力) In1(入力1・タクトスイッチ)
8:RB2(入力) In2(入力2)
9:RB3(入力) In3(入力3)
10:RB4(入力) In4(入力4)
11:RB5(入力) In5(入力5)
12:RB6(入力) In6(入力6)
13:RB7(出力) M4H(モーター4H)
14:+V
15:RA6(出力) M2R(モーター2R)
16:RA7(出力) M3L(モーター3L)
17:RA0(出力) M3R(モーター3R),S2(サーボ2),AN0(アナログ入力0)
18:RA1(出力) M4L(モーター4L),S1(サーボ1),AN1(アナログ入力1)
※RA0-7はポートA、RB0-7はポートB、プログラム中では、PA,PB として使う。
※ポートBのRB1-6は入力にセットされプルアップ(High)されています。
※TRISA,TRISB命令を使うとポートの入出力をビットごとに設定することができる。
※モーターとRCサーボ制御、アナログ入力は同じポートAを使っているので同時使用には制限があります。

■MYU-508 ミュウロボ2制御基板(2モーター用) 2,835円(税込)
■MYU-509 ミュウロボ2制御基板(3モーター用) 3,045円(税込)
■MYU-510 ミュウロボ2制御基板(4モーター用) 3,255円(税込)

※2P転送ケーブルを使っている基板の場合、PCと双方向通信するには下のように2P転送ケーブルにICクリップ付ケーブルを追加し基板の抵抗線に引っ掛けて使います。

構造化ドリトルとMYUROBO転送ソフトの使い方はこちら
PIC16F88で追加した命令


MYUROBO-2(60x49mm)

MYU BASIC V1.2

MYU BASIC V1.2は、PIC16F88の機能を効率よく使うことができます。
※CPUを16F88を選択してコンパイルします。→

<PIC16F88およびMYU BASIC V1.2の新機能>
■16BIT符号付四則演算
変数宣言に Int を使うことにより16BIT符号整数(-32768 〜 32767)が使える。また四則演算、演算子による優先順位も可能となった。
※Int型の変数を使うことにより負の比較式やFor Next文が可能になります。

Int A,B,C(10)
For A=0 To 10
  B=T1H MOD 128*256+T1L   //タイマー1の下位15BITをBに保存
  C(A)=B
Next

※演算子の優先順位について
単項演算子(++ -- << >>) > 算術演算子(* / MOD) > 算術演算子(+ -) > 関係演算子 > 論理演算子 の順で計算する

■5チャンネルの8/10BITアナログ入力
基板のAN0-AN4がアナログ入力ポートです。アナログ入力は電圧を基盤の供給電圧に対しの比率として8BIT(0-255)と10BIT(0-1023)の値として返します。距離センサーを接続したり各種の計測などに利用できます。
下のプログラムはIn2に右図のボリュームを接続、S1に接続したRCサーボの角度をコントロールします。
※PIC16F630ではServo命令の後、電子音・ブザー以外の時間設定可能な命令を実行する必要がありましたがPIC16F688ではServo命令だけで動作します。

Byte A
Do
  A=AN(2)    //In2のアナログ値を8BIT(0-255)で取得
  Servo A,1   //S1のサーボを制御
Loop

※アナログ値取得関数
AN(ポート番号)
    入力ポート In1-In4の値を8BIT(0-255)の値で返す
AN10(ポート番号)  入力ポート In1-In4の値を10BIT(0-1023)の値で返す

■シリアルポートとの通信
ハイパーターミナルを使って計測データをリアルタイムに表示したり、データを保存したりできます。またパソコン側からの制御なども可能となります。

//In1-In4のアナログ値を0.25秒ごとにシリアル送信
Int C,AD
For C=1 To 4
  AD=AN10(C)  //In1-4のアナログ値を10BIT(0-1023)で取得
  RS="A"     //文字を送信
  RS="N"
  RS="0"+C
  RS="="
  DEC16RS=AD //値を10進右詰め(符号付)で送信
  RS=13      //改行
  RS=10
  Delay 250    //0.25秒のDelay
Next

◆ハイパーターミナルを使って計測データ表示
ハイパーターミナルの設定方法はこちら!
※ハイパーターミナルは、WindoewsXP標準の通信ソフトです。VistaやWindows7の場合はフリーの通信ソフトを入手してください。
※ハイパーターミナルを立ち上げたまま転送するとエラーになります。
※転送ケーブルは接続したままでプログラムを実行すると右図のように結果が表示されます。

※下のプログラムを実行すると、パソコン側からハイパーターミナルなどの通信ソフトを使いロボットをリモコン制御できます。

//転送ケーブルをつないだままロボットをリモート操作
Do
  REMOTE GETRS    //GETRSで1バイトシリアル信号を受取る
Loop
Proc REMOTE(S)
  If S="1" Then
    左回り      //パソコンキーボードの"1"を押すと左回り
  ElseIf S="2" Then
    前進      //パソコンキーボードの"2"を押すと前進
  ElseIf S="3" Then
    右回り     //パソコンキーボードの"3"を押すと右回り
  ElseIf S="4" Then
    停止       //パソコンキーボードの"4"を押すと停止
  EndIf
EndProc

※左回りなど引数を省略した場合、引数は 0 にセットされます。


各種センサーをアナログポートに接続

パイパーターミナルを使って結果を表示

※シリアル通信用システム変数
RS=<式>     設定専用:シリアルポートに8BIT キャラクタデータを出力する
DECRS=<式>  設定専用:シリアルポートに8BIT 10進データを出力する
DEC16RS=<式> 設定専用:シリアルポートに16BIT 符号付10進データを出力する
HEXRS=<式>  設定専用:シリアルポートに8BIT HEXデータを出力する
HEX16RS=<式> 設定専用:シリアルポートに16BIT HEXデータを出力する
READRS     取得専用:シリアルポートのデータがある場合はその値が返され無い場合は0が返される
GETRS       取得専用:シリアルポートから1バイトデータを読み込むまで待ち、値を返す

■デバッグモードおよびトレース動作
ハイパーターミナルと接続した状態でパソコンのキーボードからSTEPIN命令CODE(188)半角の'シ'を送信するとデバッグモードになります。 MYUロボのプログラムポインタ、コマンドコード、レジスタの内容がHEX(16進表記)で送られてきます。(AH.A.ARG2.ARG1.IXP.IX.IXM.FSR.INDFレジスタ)
続けて半角のスペースなどを送信するとステップ動作となりレジスタの変化などがわかります。

※STEPIN命令とBREAKP命令
プログラム中に以下の命令をセットしておくとレジスタの値をシリアル送信してプログラムが中断します。
STEPIN  デバッグモードとなりレジスタの値をシリアルポートに出力。任意のシリアル入力でステップ動作となる。
BREAKP  レジスタの内容をシリアルポートに出力し停止。任意のシリアル入力で次の命令から再実行する。

■ポートの入出力をビット単位で変更可能
初期設定では入力4BIT、出力6BITですが、用途によって入力ポートや出力ポートを増やすことが可能です。
TRISA=<定数>  ポートAの入出力をビットごと(0:出力 1:入力)に設定する
TRISB=<定数>  ポートBの入出力をビットごと(0:出力 1:入力)に設定する
※ポートを入力に設定した場合、ポートAはプルアップされますがポートCはされません。
INIT  ポートを初期設定に戻す

構造化ドリトルとMYUROBO転送ソフト
※構造化ドリトルやMYUROBO転送ソフトは最新のものを使ってください。

■5チャンネルの8/10BITアナログ入力
基板のAN0-AN4がアナログ入力ポートです。アナログ入力は電圧を基盤の供給電圧に対しの比率として8BIT(0-255)と10BIT(0-1023)の値として返します。距離センサーを接続したり各種の計測などに利用できます。
下のプログラムはIn2に右図のボリュームを接続、S1に接続したRCサーボの角度をコントロールします。

//S1サーボをコントロール(ドリトル)
ロボ太=MYU!"com1"作る。
ロボ太:転送命令=「!はじめロボット
 「!2 AN  //In2の8bitアナログ値をAレジスタに
   AARG1 //Aレジスタの値をARG1にセット
   1 ARG2 //ARG2レジスタに1をセット
   107 CMD //サーボ命令を実行
 」繰り返す
おわりロボット」。
ロボ太!転送命令。
//S1サーボをコントロール(MYUROBO転送ソフト)
アンカー,10  //アンカー番号10
 AN,2  //In2の8bitアナログ値をAレジスタに
 AARG1 //Aレジスタの値をARG1にセット
 ARG2,1 //ARG2レジスタに1をセット
 CMD,107 //サーボ命令を実行
ジャンプ,10 //アンカー番号10にジャンプ


■シリアルポートとの通信
ハイパーターミナルを使って計測データをリアルタイムに表示したり、データを保存したりできます。またパソコン側からの制御なども可能となります。

//In2-In3のアナログ値を1秒ごとにシリアル送信(ドリトル)
ロボ太=MYU!"com1"作る。
ロボ太:シリアル出力=「!
  32 RS   //" "をシリアル出力
  65 RS   //"A"をシリアル出力
  78 RS   //"N"をシリアル出力
  61 RS   //"="をシリアル出力
  DECRS   //Aレジスタの値を10進3桁右詰めシリアル出力
  」。
ロボ太:アナログ入力=「|ポート番号|!(ポート番号)AN」。//8ビットアナログ入力
ロボ太:転送命令=「!はじめロボット
 「!2 アナログ入力  //In2の8bitアナログ入力をAレジスタにセット
  シリアル出力    //Aレジスタの値を10進シリアル出力
  3 アナログ入力   //In3の8bitアナログ入力をAレジスタにセット
  シリアル出力    //Aレジスタの値を10進シリアル出力
  13 RS       //改行コードをシリアル出力
  10 RS
  10 時間      //1秒のWAIT
 」繰り返す
おわりロボット」。
ロボ太!転送命令。

//In2-In3のアナログ値を1秒ごとにシリアル送信(MYUROBO転送ソフト)
アンカー,10     //アンカー番号10
  AN,2       //In2の8bitアナログ入力をAレジスタにセット
  ブロック実行,10 //Aレジスタの値を10進シリアル出力
  AN,3       //In3の8bitアナログ入力をAレジスタにセット
  ブロック実行,10 //Aレジスタの値を10進シリアル出力
  RS,13      //改行コードをシリアル出力
  RS,10
  時間,10     //1秒のWAIT
ジャンプ,10     //アンカー番号10にジャンプ
ブロックはじめ,10
  RS," "   //" "をシリアル出力
  RS,"A"   //"A"をシリアル出力
  RS,"N"   //"N"をシリアル出力
  RS,"="   //"="をシリアル出力
  DECRS   //Aレジスタの値を10進3桁右詰めシリアル出力
ブロックおわり

※転送後、ハイパーターミナルを9600bps StopBit=1 ノンパリティ フロー制御なしに設定して立ち上げます。
※転送ケーブルは接続したままでプログラムを実行すると右図のように結果が表示されます。


各種センサーをアナログポートに接続

パイパーターミナルを使って結果を表示


■デバッグモードおよびトレース動作
ハイパーターミナルと接続した状態でパソコンのキーボードからSTEPIN命令CODE(188)半角の'シ'を送信するとデバッグモードになります。 MYUロボのプログラムポインタ、コマンドコード、レジスタの内容がHEX(16進表記)で送られてきます。(AH.A.ARG2.ARG1.IXP.IX.IXM.FSR.INDFレジスタ)
続けて半角のスペースなどを送信するとステップ動作となりレジスタの変化などがわかります。

※STEPIN命令とBREAKP命令
プログラム中に以下の命令をセットしておくとレジスタの値をシリアル送信してプログラムが中断します。
STEPIN  デバッグモードとなりレジスタの値をシリアルポートに出力。任意のシリアル入力でステップ動作となる。
BREAKP  レジスタの内容をシリアルポートに出力し停止。任意のシリアル入力で次の命令から再実行する。

■ポートの入出力をビット単位で変更可能
初期設定では入力4BIT、出力6BITですが、用途によって入力ポートや出力ポートを増やすことが可能です。
TRISA  ポートAの入出力をビットごと(0:出力 1:入力)に設定する
TRISB  ポートBの入出力をビットごと(0:出力 1:入力)に設定する
※ポートを入力に設定した場合、ポートAはプルアップされますがポートCはされません。
INIT  ポートを初期設定に戻す

PIC16F688/88で追加した命令、レジスタ
<ミュウアセンブラで使用するレジスタ(8ビット)>
A:アキュームレーター 演算用レジスタ
AH:アキュームレーターの上位8BIT
IX:インデックスレジスター
IXM:インデックスメモリ IXの値(0-79)によって格納されるレジスタメモリ。80個の配列として使える。
T1L:タイマー1(4nSecサイクル)の下位8ビット
T1H:タイマー1の上位8ビット 約0.25秒周期で1周します。
PA:PIC16F688のポートAレジスタ 主に入力として使う。
PC:ポートCレジスタ モーターやサーボ制御用の出力ポート。
ARG1:CMD命令用第1引数 CMD命令によって使用される引数をセットする。CMD命令は引数にCodeをセットすることで命令を実行。
ARG2:CMD命令用第2引数
IXP:インデックスポインタレジスタ プロシージャや関数の位置を示すレジスタ
Z(ゼロ)フラグ:演算命令(ADD,SUB,CMP,AND,OR,XOR,INC,DEC)を実行して結果がゼロならセットするフラグ。
C(キャリー)フラグ:演算命令(SUB,CMP)を実行して結果が負の場合や加算命令(ADD)を実行してオーバーフローした場合セットするフラグ。RLA,RRA,CLC,STC命令でもフラグが変化します。
タイマー1はサーボ命令実行中、20msecごとにクリアされます。
命令 引数 解説 Code
RS 1 引数(0-255)の値をシリアルポートに出力。(16F688/88専用) 70
AH 1 AHレジスタに引数(0-255)をセット。(16F688/88専用) 71
PUTAX 1 16ビット命令 IX = IXP - 引数(1-255)を実行後、AX(AH/A)レジスタの値をIXM2にセット(16F688/88専用) 72
GETAX 1 16ビット命令 IX = IXP - 引数(1-255)を実行後、IXM2レジスタの値をAX(AH/A)にセット(16F688/88専用) 73
AN 1 引数(入力ポート)を10ピットA/D変換して上位8ビットをAレジスタにセット(16F688/88専用) 74
TRISA 1 ポートAの入出力をビットごと(0:出力 1:入力)に設定する(16F688/88専用) 75
TRISC 1 ポートCの入出力をビットごと(0:出力 1:入力)に設定する(16F688/88専用) 76
PUTA 1 IX = IXP - 引数(1-255)を実行後、Aレジスタの値をIXMにセット(16F688/88専用) 77
GETA 1 IX = IXP - 引数(1-255)を実行後、IXMの値をAレジスタにセット(16F688/88専用) 78
IXP 1 IXPレジスタに引数(0-255)をセット(16F688/88専用) 79
PUSHA 0 スタックにAレジスタの値を保存(16F688/88専用) 176
POPA 0 スタックから値を取り出しAレジスタにセット(16F688/88専用) 177
INCIXP 0 IXPレジスタ = IXPレジスタ + 1(16F688/88専用) 178
DECIXP 0 IXPレジスタ = IXPレジスタ - 1(16F688/88専用) 179
AIXPM 0 IX = IXPを実行後、Aレジスタの値をIXMにセット。IXP = IXP + 1する(16F688/88専用) 180
IXPMA 0 IXP = IXP - 1した後、IX = IXPを実行。IXMの値をAレジスタにセット(16F688/88専用) 181
EXARG1 0 AレジスタとARG1レジスタの値交換(16F688/88専用) 182
ANDARG1 0 Aレジスタ = Aレジスタ AND ARG1(16F688/88専用) 183
ORARG1 0 Aレジスタ = Aレジスタ OR ARG1(16F688/88専用) 184
XORARG1 0 Aレジスタ = Aレジスタ XOR ARG1(16F688/88専用) 185
READRS 0 シリアルポートのデータがある場合、キャリーフラグがセットされ値がAレジスタに保存される
データがない場合、キャリーフラグとAレジスタがクリアされる(16F688/88専用)
186
INIT 0 ポートを初期化する(16F688/88専用) 187
STEPIN 0 デバッグモードとなりレジスタの値をシリアルポートに出力。任意のシリアル入力でステップ動作となる(16F688/88専用) 188
ANDA 0 Aレジスタ = Aレジスタ AND Aレジスタ(16F688/88専用) 189
ANAX 0 直前のAN命令で取得した10BITアナログ値を下位8ビットをAレジスタに、上位2ビットをAHレジスタにセットする(16F688/88専用) 190
AXIXM2 0 16ビット命令 AX(AH/A)レジスタの値をIXMにセット(16F688/88専用) 191
IXM2AX 0 16ビット命令 IXMレジスタの値をAX(AH/A)にセット(16F688/88専用) 192
AXARG 0 16ビット命令 AX(AH/A)レジスタの値をIXMにセット(16F688/88専用) 193
ARGAX 0 16ビット命令 IXMレジスタの値をAX(AH/A)にセット(16F688/88専用) 194
CLAH 0 AHレジスタをゼロにする(16F688/88専用) 195
CLAX 0 16ビット命令 AX(AH/A)レジスタをゼロにする(16F688/88専用) 196
INCAX 0 16ビット演算 AX(AH/A) = AX(AH/A) + 1(16F688/88専用) 197
INCIXM2 0 16ビット演算 IXM2 = IXM2 + 1(16F688/88専用) 198
DECAX 0 16ビット演算 AX(AH/A) = AX(AH/A) - 1(16F688/88専用) 199
DECIXM2 0 16ビット演算 IXM2 = IXM2 - 1(16F688/88専用) 200
ADDARG 0 16ビット符号付演算 AX(AH/A) = AX(AH/A) + ARG(ARG2/ARG1)(16F688/88専用) 201
SUBARG 0 16ビット符号付演算 AX(AH/A) = AX(AH/A) - ARG(ARG2/ARG1)(16F688/88専用) 202
ANDAX 0 16ビット演算 AX(AH/A) = AX(AH/A) AND AX(AH/A)(16F688/88専用) 203
ANDARG 0 16ビット演算 AX(AH/A) = AX(AH/A) AND ARG(ARG2/ARG1)(16F688/88専用) 204
ORARG 0 16ビット演算 AX(AH/A) = AX(AH/A) OR ARG(ARG2/ARG1)(16F688/88専用) 205
XORARG 0 16ビット演算 AX(AH/A) = AX(AH/A) XOR ARG(ARG2/ARG1)(16F688/88専用) 206
CMPIXM2 0 16ビット命令 AX(AH/A) - IXM2 の結果が'0'ならZ(ゼロ)フラグを、負ならC(チャリー)フラグ をセットする。各レジスタ値は変化しない(16F688/88専用) 207
CMPARG 0 16ビット命令 AX(AH/A) - ARG(ARG1/ARG2) の結果が'0'ならZ(ゼロ)フラグを、負ならC(チャリー)フラグ をセットする。各レジスタ値は変化しない(16F688/88専用) 208
RLAX 0 16ビット命令 AX(AH/A)レジスタをC(キャリー)フラグを通して1 ビット左に回転します(16F688/88専用) 209
RRAX 0 16ビット命令 AX(AH/A)レジスタをC(キャリー)フラグを通して1 ビット右に回転します(16F688/88専用) 210
MULARG 0 16ビット符号付演算 AX(AH/A) = AX(AH/A) x ARG(ARG2/ARG1)(16F688/88専用) 211
DIVARG 0 16ビット符号付演算 AX(AH/A) = AX(AH/A) ÷ ARG(ARG2/ARG1) 余りはARG(ARG2/ARG1)にセット(16F688/88専用) 212
PUSHAX 0 16ビット命令 スタックにAX(AH/A)レジスタの値を保存(16F688/88専用) 213
POPAX 0 16ビット命令 スタックから値を取り出しAX(AH/A)レジスタにセット(16F688/88専用) 214
AXIXPM2 0 16ビット命令 AX(AH/A)レジスタの値をIXM2レジスタにセット。IXP = IXP + 2する(16F688/88専用) 215
IXPM2AX 0 16ビット命令 IXM2レジスタの値をAX(AH/A)レジスタにセット(16F688/88専用) 216
EXAH 0 AレジスタとAHレジスタの値交換。(16F688/88専用) 217
EXARG 0 AX(AH/A)レジスタとARG(ARG2/ARG1)レジスタの値交換(16F688/88専用) 218
COMAX 0 AX(AH/A)レジスタの補数をセットする(16F688/88専用) 219
ARS 0 Aレジスタの値をシリアルポートに出力(16F688/88専用) 220
DECRS 0 Aレジスタの値を10進表記右詰め3文字でシリアルポートに出力(16F688/88専用) 221
HEXRS 0 Aレジスタの値を16進表記でシリアルポートに出力(16F688/88専用) 222
AXDECRS 0 16ビット命令 AX(AH/A)レジスタの値を符号付10進表記右詰め6文字でシリアルポートに出力(16F688/88専用) 223
AXHEXRS 0 16ビット命令 16進表記でAHレジスタAレジスタの順で値をシリアルポートに出力(16F688/88専用) 224
DELAYAX 0 16ビット命令 AX(AH/A)レジスタ x 1mSECの遅延(16F688/88専用) 225
BREAKP 0 プログラムポインタ:コマンドコード:AH.A.ARG2.ARG1.IXP.IX.IXM.FSR.INDFレジスタの内容をシリアルポートに出力し停止。任意のシリアル入力で次の命令から再実行(16F688/88専用) 226