ROBOBASIC講座

IF文の中のIF文

roboBASIC v2.5の頃は、下記のような、IF文の中にIF文を書くことができなかったんですが、いつの間にやら、v2.72では、それが可能になったんですねsweat01

one入れ子あり

IF A=0 THEN
 IF B=1 THEN
         MUSIC "C"
   
ENDIF
ENDIF

使えないもんだと思い込んでいるので、全然気が付きませんでしたが、ヒロビさんのブログ記事を見て知りましたsweat01

RZ1BasicもroboBASICと同じ仕様にしているので、同じように、IF文の中にIF文を書けるようにはしてませんsweat01最初からIF文の入れ子ができるようになっていれば良かったのに、今からじゃ、入れ子ありで動くように直すのすっげ〜〜大変だぁbearingdownRZ1Basic v0.5.0で対応しましたpaper

と言ってるだけじゃ、あれなので、簡単ですが、IF文の入れ子ありを入れ子なしに書き換える場合の例を書いておきます。

oneの入れ子なし

IF A=0 AND B=1 THEN
   
MUSIC "C"
ENDIF

two入れ子あり

IF A=0 THEN
    IF B=1 THEN
        MUSIC "C"
    ELSEIF C=2 THEN
        MUSIC "D" 
    ENDIF
    MUSIC "E"
ENDIF

twoの入れ子なしの1

IF A=0 AND B=1 THEN
    MUSIC "C"
ELSEIF A=0 AND C=2 THEN
    MUSIC "D"
ENDIF
IF A=0 THEN
    MUSIC "E"
ENDIF

twoの入れ子なしの2

HOGE:
    IF
B=1 THEN
       
MUSIC "C"
    ELSEIF C=2 THEN
        MUSIC "D" 
    ENDIF
    RETURN

IF
A=0 THEN
    GOSUB HOGE
    MUSIC "E"
ENDIF

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (2) | トラックバック (0)

制限の勧め

またまた、ダイエット(食事制限)の話sign02
では、ないですよhappy01paper

先日公開したRZ1Basic/RZ1Actionでサーボモーターの回転範囲のLimit(制限)の機能を付けました。
Rz1basicdebugscreensnapz002

「サーボモーターから煙がsweat01」なんて話もよく聞きますが、これまで使っていたテンプレートプログラムを最新のRZ1Basicでコンパイルしてみるとわかると思いますが、Limitに引っかかるモーションが沢山あります。

実際、個体差があると思いますので、各自で実際にロボットの関節を曲げて何度まで動かすことができるか調べて、設定してやる必要はあると思いますが、兎に角、まず間違いなくサーボモータに負荷をかけてしまっているモーションが何個かあるはずです。

RZ1Basicでは、環境設定であらかじめ設定しておけば、コンパイル時にチェックしてくれるようになりましたが、roboBASICをお使いの方は、そうはいきません。サーボモーターを長持ちさせる為にも、roboBASICをお使いの方は、'$LIMITコマンドを、プログラムごとに書き加えておくことをお勧めします。

'$LIMITコマンドの書き方は、以前、ROBOBASIC講座で'$LIMITについて書いたので、参考にして下さい。

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

ROBOBASIC講座(GYROSET, GYRODIR, GYROSENSE)

【GYROSET(ジャイロ・セット)】
 ジャイロセンサーを反映させるサーボモータを設定する。
 構文:GYROSET [グループ指定], [モーターnジャイロ番号],……
  例:GYROSET G6A, 1, 2, 2, 2, 1, 0

【GYRODIR(ジャイロ・ディ・アイ・アール)】
 ジャイロセンサー処理のサーボモーターの動作方向を設定する。
 構文:GYRODIR [グループ指定], [モーターn動作方向],……
  例:GYRODIR G6A, 1, 1, 0, 0, 1, 0

【GYROSENSE(ジャイロ・センス)】
 サーボモータに反映させるジャイロセンサー感度を設定する。
 構文:GYROSENSE [グループ指定], [モーターnジャイロ感度],……
  例:GYROSENSE G6A, 100, 100, 255, 255, 50, 0

oneロボザック80号のジャイロセンサーの接続と中位調整

【接続】ジャイロセンサーはMR-C3024のADポートに接続します。ADポートにはジャイロからの入出力の2本のコネクターを接続する必要があり、それぞれ接続するポートが決まっており、接続した場所に対応して、ジャイロセンサーの番号になります。HG-R01と書かれたラベルの貼ってある側のコネクターをAD4〜7のポートに接続し、貼ってない側をAD0〜3に接続します。

  1. AD0とAD4
  2. AD1とAD5
  3. AD2とAD6
  4. AD3とAD7

Omnigraffle_proscreensnapz011

【中位調整】ジャイロセンサーを接続したら、ジャイロが機能しない(MR-C3024に転送されているプログラムにジャイロ関連のコマンドが使われていない、もしくは、オフになっている)状態で

  1. MR-C3024の電源を入れる。
  2. ジャイロセンサーを水平な状態になるように置く。
  3. マイナスドライバーで中位調整ネジを回し、ジャイロのLEDが赤と青の2色が同時に点灯するように調整する。
  4. 現時点では、感度調整ネジは、少しマイナス側に回しておいた方が安全であり、感度調節を行うと、中位位置もズレるため、最終的に、感度調節を行った後に、中位調整を再度行う必要があります

Omnigraffle_proscreensnapz007

twoジャイロセンサーの装着方向とGYROSETコマンド

接続したジャイロセンサーはGYROSETコマンドで、サーボモーターごとにジャイロ番号を指定することによって、ジャイロの機能を反映させることができます。なお、GYROSETコマンドで、0(ゼロ)を指定することは、ジャイロセンサーをオフにする意味になります。

例: GYROSET G6A, 2, 1, 1, 1, 2, 0

の場合、

  • サーボ番号0←ジャイロ番号2を反映させる
  • サーボ番号1←ジャイロ番号1を反映させる
  • サーボ番号2←ジャイロ番号1を反映させる
  • サーボ番号3←ジャイロ番号1を反映させる
  • サーボ番号4←ジャイロ番号2を反映させる
  • サーボ番号5←ジャイロを機能させない

ということとなります。ロボザックの足の関節の作用を考えてみましょう。

  • サーボ番号0:外転/内転(左右方向)
  • サーボ番号1:屈曲/伸展(前後方向)
  • サーボ番号2:屈曲/伸展(前後方向)
  • サーボ番号3:屈曲/伸展(前後方向)
  • サーボ番号4:外転/内転(左右方向)
  • サーボ番号5:外旋/内旋(回旋)

ジャイロセンサーは、ロボットがどちらへ動いたかを認識するもので、ジャイロセンサーを反映させるサーボモーター番号は、ジャイロセンサーが感知している運動方向に一致したサーボモーターに反映させることになる。装着したジャイロセンサーが感知している方向が、前後方向なのか、左右方向なのかに対応して、適応させるモーター番号が決まるとうことになります。

threeジャイロセンサーの装着方向とGYRODIRコマンド

ジャイロセンサーが緑LEDの方向へ回転すると、GYROSETで適応させたサーボモータの角度を加算し、逆に、赤LEDの方向へ回転すると、減算します。

Omnigraffle_proscreensnapz007

GYRODIRは、実際にサーボモーターに適応させる方向を1と0で指定します。0を指定すると逆回転させる意味になり、サーボモーターを回転させる角度の式は、以下の様な式になるかと思います。

  • 1の場合:回転角度=加算または減算角度 x 1
  • 0の場合:回転角度=加算または減算角度 x -1

具体的に見てみましょうsign01
図の場合、足首は120になっています。バランスを崩さないようにする為には、赤LED方向へ力が加わった時には角度を減らすことが、緑LED方向へ力が加わった時には角度を増やすことが、バランスを崩さないようにすることになるので、GYRODIRの値は

赤LED方向へ力が加わった時(→角度を減らす)

  • の場合:回転角度= x 負の数
  • の場合:回転角度= x -1=正の数

緑LED方向へ力が加わった時(→角度を増やす)

  • の場合:回転角度=α x 正の数
  • の場合:回転角度=α x -1=負の数

なので、GYRODIRの設定は「1」を指定すればいいということになりますねpaper

Rz1actionscreensnapz002

もし、ジャイロセンサの取り付けが上の図と逆向きに付けた場合、赤と緑の方向が逆を向くため下の図のようになり、緑LED方向へ力が加わった時を例に考えてみると、角度を減少させればいいので、GYRODIRの値は「0」に設定すればいいことがわかります。

緑LED方向へ力が加わった時(角度を減らす)

  • の場合:回転角度=α x =正の数
  • の場合:回転角度=α x -1負の数

Rz1actionscreensnapz002x

同じように、左足首のGYRODIRの設定を考えてみると、GYRODIRの設定は、「0」にすればいいことがわかります。

緑LED方向へ力が加わった時(角度を減らす)

  • の場合:回転角度=α x=正の数
  • の場合:回転角度=α x -1負の数

Rz1actionscreensnapz007

次に、前後方向のサーボのGYRODIRの設定について考えてみます。前後方向は、右も左も、足首、膝、股関節ともに、角度が大きくなると前に、角度が小さくなると後ろに体幹が回転します。

もし、ジャイロセンサーのLEDの赤色が前になるように付けた場合
Rz1actionscreensnapz008

赤LED方向へ力が加わった時(→角度を減らす)

  • の場合:回転角度= x 負の数
  • の場合:回転角度= x -1=正の数

なので、GYRODIRは「1」を指定すればいいことになりますねhappy01

fourジャイロセンサーの感度調節とGYROSENSEコマンド

ジャイロセンサーの感度(α)は、ジャイロ本体の感度調節ネジと、GYROSENSEコマンドの値で決定されます。

α=K x (感度調節ネジ) x (GYROSENSE値)

感度調節ネジをプラスなほど、GYROSENSE値がより大きな値ほど、感度が高いことになりますし、もし、どちらかが0(ゼロ)であれば、αも0になり、ジャイロをオフにしたことと同じ意味になります。

GYROSENSE値は、0から255の範囲で設定します。
よく使われてるGYROSENSE値は

GYROSENSE G6A, 250, 250, 200, 250, 250, 0
GYROSENSE G6D, 250, 250, 200, 250, 250, 0

になります。GYROSETでオンになっているサーボモーターにしかGYROSENSE値は適応されないので、適応させないモーターのGYROSENSE値をわざわざ0にする必要もありません。

fiveジャイロ設定コマンドの適応と最終調節

GYROSET, GYRODIR, GYROSENSEのジャイロ設定コマンドは、MAINルーチンに入る前に書込んでおくと良いでしょう。なおジャイロセンサーが機能していると、上手く動作しないモーションがある場合は、GYROSETまたはGYROSENSEコマンドで、ジャイロ機能をオン/オフできるルーチンを作っておく必要があるかもしれません。

【最終調節】

  • 絞っておいた感度調整ネジをプラス方向へ回して、感度を調整する。感度を上げすぎると揺れが止まらなくなってしまうので注意して下さい。
  • 感度調節ネジを動かすと、中位調整がズレるので、もし赤緑両方のLEDが点灯しなくなった場合は再度調節して下さい。
  • ジャイロ設定コマンドを適応させたプログラムを転送すると、ゼロ点そのものがズレてしまう場合があるかもしれません。ジャイロセンサーのLEDによる中位調整は、動作保証されていないそうなので、ジャイロ設定コマンド適応後、ゼロ点をしなおす必要があるかもしれません。

と、書いてきましたが、これも机上のことだけで、私のロボザックさんは、ゼロ点設定の時点で殆どプラスマイナス20度の上限近くのモーターがいくつかあるので、最初上手いこと動いていたんですが、今は、ジャイロセンサーをオンにすると無茶苦茶な角度をとってしまいます。ゼロ点設定の調整ではもうどうしようもないし、GYRODIRの向きもいろいろ試してみましたが、書いた通りにはなかなかうまくいきませんね。。。sweat01

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

ROBOBASIC講座(MOVEPOS、POS)

【MOVEPOS/POS】
 モーターに特定の姿勢を指定して動作させる。
 構文:MOVEPOS  [グループ指定], [行ラベル]
     [行ラベル]: POS [グループ指定], [モーターn角度],……
  例:
     MOVEPOS  G6A,POS01
     MOVEPOS  G8B,POS02
     MOVEPOS  G12,POS03
     MOVEPOS  G24,POS04

     POS01:  POS G6A,10,32,15,120,78,93
     POS02:  POS G8B,67,47,32,153,23,33,26,54
     POS03:  POS G12,34,37,122,162,84,28,58,100,120,....
     POS04:  POS G24,34,37,122,162,84,28,....

《解説》

「ROBOBASIC ロボベーシック コマンド説明書 v2.10」を見ると、MOVEPOSコマンドは、
Screensnapz021
となっています。
また、roboBASICのヘルプタグも
Parallels_desktopscreensnapz122
と表示されますが、この通り書いてコンパイルしても、以下の様にエラーが出てしまいます。
Parallels_desktopscreensnapz121

実際には、MOVEPOSには、[グループ指定]が必要ですので、以下のことに注意してプログラミングをして下さい。

roboBASICでは、MOVEPOSの[グループ指定]がないとエラーが出ます。RZ1Basicでは、[グループ指定]がなくてもエラーが出ません
MOVEPOSの[グループ指定]と、POSの[グループ指定]が同じでないとroboBASICではエラーが出ます。RZ1Basicでは異なっていてもエラーが出ませんので、ご注意下さい

参考資料

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (1)

ROBOBASIC講座(TIPS: FILL文)

以前、「通信ができないエラーの場合」というタイトルで、プログラム転送中のエラーや電池切れ、コンパイルミスのあるプログラムを転送してしまった、などが原因で、プログラムが暴走してしまうようになった場合。

MR-C3024のスイッチオンと同時に、「プログラムの停止」ボタンを何度かクリック

して、暴走する前に、プログラムを停止させる方法を書きましたが、今日、ロボザックの掲示板で、加藤さんから、とても良い方法を教わりました

メモリーの「255は無視して進む」とのことらしいです。だからFILL文で255で埋めておくと時間稼ぎになるということです。目から鱗でした。

試しに、以下のプログラムを転送してみました。

FILL 255,5000
MUSIC
 "C"

ちゃんと「ドnote」の音が鳴りましたhappy01私は、てっきり、255で止まってしまうのかと思ってましたsweat01sweat01

ちなみに、5000で音が鳴るまで、約1秒くらい、10000で、約2秒くらいでした。

転送されたプログラムに不具合があったとしても(FILL文はちゃんと転送されていると仮定して)、スイッチを入れて、1〜2秒時間があれば、余裕をもって、停止ボタンをクリックでしますね。素晴らしいflairflairflair

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

ROBOBASIC講座(DIR, SPEED, HIGHSPEED)

【DIR (ディ・アイ・アール)】
 サーボモーターの回転方向を設定する。
 構文:DIR [グループ指定], [モーターn方向], .....
  例:DIR G8A, 0, 1, 0, 0, 1, 0, 0, 0
    DIR G8B, 1, 0, 1, 1, 0, 1, 1, 1

【SPEED (スピード)】
 サーボモーターの動作速度を設定する。
 構文:SPEED [モーター速度]
  例:SPEED 15

【HIGHSPEED (ハイスピード)】
 サーボモーターの動作を高速モードに設定する。
 構文:HIGHSPEED [SETON/SETOFF]
  例:HIGHSPEED SETON


DIRに関して、以前、「プログラミング・シミュレータの注意点」で書きましたし、もう皆さん周知なことだと思いますが、ロボザックに付いてくるプログラミング・シミュレータのモータ回転方向の設定と、roboBASICでデフォルトで使われているモータの回転方向は異なっています。

roboBASICでは、以下のようなDIR設定が基本になっています。

DIR G6A 1,0,0,1,0,0
DIR G6B 1,1,1,1,1,1
DIR G6C 0,0,0,0,0,0
DIR G6D 0,1,1,0,1,0

DIRは、1を指定した時、数値が大きくなると右回転(時計方向)で、0を指定した時、その逆の、数値が大きくなると左回転(反時計方向)に回転します。

左右の上肢下肢の対応するモータが1なら0、0なら1に設定されており、屈曲と伸展、外転の内転の動きが同じ数値になるようになっています。

DIR値は一度走らせれば、記憶されているため、プログラムに毎回各必要はないのです。また、モーターコントロールパネルで設定しておくと、その設定になるようですが、ま、安心の為に、プログラムに書込んでおくのがいいのではないかと思います。

SPEEDに関しても、以前、「続・プログラミング・シミュレータの注意点」で、プログラミング・シミュレータとの違いを書きましたが、

SPEED値は、1から15の数値で指定することが可能で、数値が大きいほど速く動きます。私のロボザックで実測したら、だいたいスピード値と回転速度には、以下の式のような関係がなりたちました:r: スピード値, y: 角度/秒

  • y=17r

程度になります。

HIGHSPEEDコマンドを使うと、その時点で設定されている速度のおよそ 3倍で動作するようになるそうですが、兎に角、モータの能力以上の回転速度にはならないのは確かでしょうね。

Hitecさんの、ロボット専用サーボのページを見ると

HSR-5498SG: 6.0v=0.22sec・60°/ 7.4v=0.19sec・60°
HSR-5980SG: 6.0v=0.17sec・60°/ 7.4v=0.14sec・60°
HSR-5990TG: 6.0v=0.17sec・60°/ 7.4v=0.14sec・60°
HSR-8498HB: 6.0v=0.20sec・60°

ロボザックのは、HSR-8498HB相当と考えればいいのかな??
そうすると、1秒間に300度(=60/0.2)が最大速度なので、y=17r程度という式を元にすると、ロボザックの場合、最大SPEED値は、17から18(=300/17)程度になっているということかな??

なんか適当な話ですいません。

ぷちさんのページのSPEEDの話
ROBOBASIC 【SPEED】の疑問

で、SPEED値は25程度まで設定できるとHitecの方に言われたそうですが、
もし、どのモータでもSPEED値の係数が17程度なら、

60/(25*17)=0.14sec・60°

なので、HSR-5980SGや、HSR-5990TGのモータで7.4vで動かしたときの最大速度のことなんだろうか?

これまた適当で、申し訳ありません。。。sweat01

----------------
にほんブログ村 科学ブログ 
ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

ROBOBASIC講座(PTP, WAIT)

【PTP(ピー・ティー・ピー】
 サーボモーターの同時の動作制御機能を ON/OFFする。
 構文:PTP [SETON/SETOFF/ALLON/ALLOFF]
 例:

  • PTP SETON(通常使用設定) : PTP機能をグループ別に設定する。
  • PTP SETOFF(通常使用解除) :グループ別に設定された PTP機能を解除する。
  • PTP ALLON(全体設定) :すべてのサーボモーターの PTP機能を設定する。
  • PTP ALLOFF(全体解除) :すべてのサーボモーターの PTP機能を解除する。

【WAIT(ウエイト】
 命令語の処理が終わるまで待つ。
 構文:WAIT
 例:MOVE 120, 100, 140, 90, 70, 150
   WAIT

《PTP制御とは》
PTPは、Point To Pointの略です。PTP制御はロボットのモータ制御において、より自然な動きにさせるための最も単純な方法です。飛び飛びの点(ポーズ)をモータの角度で指定して制御するため、このような名称が付けられています。

ロボザックでは、MOVEコマンドを使って、各関節の角度を指定して動きを制御しています。また、モータのスピードは各モータごとに設定できるわけではないので、基本的にPTP制御をしてやらないと不自然な動きになってしまうはずです。

つまり、次の点(ポーズ)へ動く為に動かさなくてはいけない角度は、各モータごとに異なっているはずです(ま、同じ場合もあるかもしれません)。それなのに、どのモータも同じスピードで動いたら、各モータごとに、ポーズをとるまでの時間が異なってしまうからです。

PTPコマンドを使うと、グループごとのモータ、もしくは全部のモータのスピードを、多く動かさなくてはいけないモータはより速く、少しだけ動かせばよいモータはより遅く動かすことで、指定したポーズの角度に、できるだけ同時に到達するように、自動的に調整してくれます。

ということで、PTPコマンドは、MOVEコマンドを使う限り、基本的にオンにしておく必要がありますが、他にMOVEコマンドとペアにしてよく使うのが、WAITコマンドです。WAITコマンド自体は前のコマンドの処理が終了するまで待たせるためのコマンドです。基本的にはMOVEコマンドによりモータが動いている最中に、次のコマンドが実行されては困ると思いますので、要所にはWAITコマンドを入れておくのが無難だと思います。

《その他の制御用語》

  • CP制御(Continious path control):ロボザックにはできない制御です。この方法は軌道を指定し、それに沿う様に動かさせる方法です。軌道を指定する。例えば、手を水平に左右に動かすといった感じです。軌道に沿った各点における各関節の角度は、軌道からの逆算して求めることになるのでコンピュータの処理能力が必要になります。
  • 感覚制御(Sensory control):ロボザック50号以降、いくつかのセンサーが付いてきています。この制御方法はそういったセンサーから得られた値をもとに、ロボットを動作させる制御方法をいいます。
  • 適応制御(Adaptive control):環境の変化などに応じて制御系の特性を、所要の条件を満たすように変化させる制御方法をいいます。転倒した状態から起き上がる為の制御が、これになるのかな??例えば、ぷちさんが、ロボザックで転倒から起き上がるプログラミングみたいなの。。。
  • 学習制御(Learning control):過去に得られた制御過程をもとに、制御パラメタ、又はアルゴリズムを、逐次所要の条件を満たすように変更していく制御のことをいいます。やろうと思えば、ロボザックでも学習能力を持たせたプログラミングもできるんじゃないかなぁと思います。

----------------
にほんブログ村 科学ブログ 
ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

ROBOBASIC講座(MOTORIN, SERVO, MOTOR, MOTOROFF)

【MOTORIN(モーターイン)】
 サーボモーターの現在値を読み込む。
 構文:MOTORIN ([モーター番号])
  例:S0 = MOTORIN(0)

【SERVO(サーボ)】
 サーボモーターを指定した角度に動作する。
 構文:SERVO [モーター番号],[モーター角度]
  例:SERVO 1,130

【MOTOR(モーター)】
 サーボモーターをオンにする。
 構文:MOTOR [モーター番号] または [グループ指定]
  例:MOTOR G6A

【MOTOROFF(モーターオフ)】
 サーボモーターをオフにする。
 構文:MOTOROFF [モーター番号] 又は [グループ指定]
  例:MOTOROFF G6A


久しぶりにROBOBAIC講座ですhappy01
今回は、サーボモーターのオン/オフと、角度の読み書き関連のコマンドです。

《MOTORIN/SERVOの利用例1》
MR-C3024のスイッチをオンにすると転送されているプログラミングが実行されます。最初MOTORコマンドを使って使用するモータをオンにするのですが、何もしないままモータをオンにすると、モータはZERO点に動こうとします。しかし、モータをオンにする前に、

FOR I=0 TO 23
A= MOTORIN(I)
SERVO I,A
NEXT I

のようなプログラムで、MOTORINコマンドで現在の角度を取得して、SERVOコマンドでその取得した角度に動いたことにしてしまうことが可能です。こうすることで、オンにした時のポーズからZERO点に動くのではなく、オンにした時のポーズから、次に実行されるポーズに動くということになります。

ただ、今は、このような使い方はしないで、以前、TEA TIME#1で書きましたが、GETMOTORSETコマンドを使えばいいように思います。

《MOTORIN/SERVOの利用例2》
多くは語りません。MOTORINで状況を判断させています。
半自動起き上がり(ぷちさん)
Push forward.(wingasyaさん)

のページをご覧下さい。

MOTORIN/SERVOの話ではないのですが、wingasyaさんの「ロボに道具を」。。素敵heart04

----------------
にほんブログ村 科学ブログ 
ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

ROBOBASIC講座(低電圧検出ルーチン)

今回は電源電圧の検出についてです。前回出てきたADポートの6番がそれに割り当ててあります。電圧が下がると暴走を始めるので、組み込んでおきたいルーチンですよね。しかし私は、この辺り全然試していないので、以下に上げた参考資料をもとにまとめたものです。

《参考資料》

  1. ロボットのいる生活。
    ROBOZAK(ROBONOVA-I)用低電圧検知回路を作りました。 しかし・・・
  2. RoboZak奮戦記
    電源検出電圧の実測値と計算値
  3. 週刊ロボザックお助け掲示板
    低電圧とプログラム暴走の関係
  4. Overall Template Program (コード下記:1)
  5. action_auto.bas (コード下記:
  6. HERO'S Download
    ATmega128/128L日本語翻訳データシート
  7. ROBONOVA-I 日本語マニュアル

《ROBONOVA-Iのマニュアルでは》
ハイテックのサイトからダウンロードできるROBONOVA-I 日本語マニュアルのP95に「(7) LOW-VOLTAGE WARNING設定方法」という項目があります。ここには以下のように書いてあります。

Screensnapz006

《個体差がある》
avalonさんは151くらい
(1、3)、fkさんは155くらい(3) 、Overall Template Programでは148、action_auto.basでは160でチェックしていて、個体差があるようです。あと、ADアダプタと、バッテリでも値が異なるようです(2)。


《電圧を求める式は》

ATmega128/128Lのデータシート(6)のA/D変換器の項目(p153〜)を読んでみたけど難しいですねsweat01avalonさんが(1)と(3)の中で、電圧とAD(6)の値の関係は「Overall Template Program」のrobot_voltageに式が書いてありますが、少し間違っており、以下のようにおっしゃられています。

----------------------------------
式は恐らくこうだと思います。
Value = (Voltage/基準電圧 × 1/2) × 256 - 1
→ 5.8V / 5 × 1/2 × 256 - 1 ≒ 147
※256はADポートの分解能
※-1は0〜255までなので
※1/2は分圧回路・・・精度はここまでないと思います。
※基準電圧は約5Vですが、これが下がるとValueが大きくなってしまいます。

----------------------------------

《robo_voltageを使う場合は》
one以前、ハイテックにあったテンプレートについて(1)で書きましたが、Overall Template Programにあるrobo_voltageのルーチン(以下)はENDIFがないので、このままでは変なことが起きてしまうかもしれませんので、このルーチンを使う場合は、ENDIFを書き加えて下さいね。

twoそれから毎回呼ぶ必要もないなぁという場合は、例えば以下のように動かす前だけチェックするようにしてもいいのかもしれません。

IF RR<>0 THEN GOSUB robot_voltage
ON RR GOTO MAIN,K1......
.....

IF A<>0 THEN GOSUB robot_voltage
ON A GOTO MAIN,K1......
.....

threeあと、好みですが、例えば以下の様にアレンジすると、電圧が下がると点減回数が増えるようにできますね。

CONST kLED=52
CONST
kLowVolt=155
CONST kStopVolt=151
A=AD(6)
IF A<kStopVolt THEN
    END

ELSEIF A<kLowVolt THEN
    FOR v=A TO kLowVolt
        OUT kLED, 1
         DELAY 200
        OUT kLED, 0
        DELAY 200
    NEXT v
ENDIF
RETURN

《電圧検出用ルーチン》

いちおうハイテックさんのページにあったコードの中にあった、電圧検出用ルーチンを書いておきます。

1, Overall Template Programより
'================================================
robot_voltage: ' [ 10 x Value / 256 = Voltage]
    DIM v AS BYTE

    A
= AD(6)

    IF A < 148 THEN ' 5.8v

    FOR v = 0 TO 2
        OUT 52,1
        DELAY 200
        OUT 52,0
        DELAY 200
    NEXT v

    RETURN

2, action_auto.basより
'================================================
robot_voltage: ' [ 10 x Value / 256 = Voltage]
    A
= AD(6)
    TEMPO 230
    IF A < 160 THEN MUSIC "G" ' 6.25 Volt
    RETURN

----------------
にほんブログ村 科学ブログ 
ロボットへ
にほんブログ村

| | コメント (2) | トラックバック (0)

ROBOBASIC講座(AD, RCIN)

【AD(n)】
 ADポートを使いアナログ信号をデジタルに変換する。
 構文:AD ([ADポート])
  例:a = AD(1)

【RCIN(n)】
 RC用操縦機と受信機から入力されるパルス値を入力する。
 構文:RCIN ([RC受信ポート])
  例:a = RCIN(2)


《解説》

MR-C3024のピンとポート番号(左上のピンとポート番号の対応は不明)
Mr3024

MR-C3000系コントローラー右上には 0番から7番までの計8個の AD変換ポートで、デジタル入出力ポート(IN/OUT)では32番から39番までに割り当てが装備されています。外部センサーまたは機器からのアナログ信号をデジタルで変換して読み込む 為に使用します。ADコマンドの[ADポート]には 0から7までの数字、常数またはバイト型変数を使用する事ができますが、この内、6番ポートは電源電圧検出用に、7番は赤外線リモコン用になっていますので、センサー類を繋げてカスタマイズできるポートは6個になりますね。

もうひとつ上げたRCINは、ラジコン受信機の信号を受けるコマンドです。同じくADポートを利用しますので、[RC受信ポート]には0から7までの数値が入ります。夢現工房さんのページにあったラジコン用のテンプレートをみると、RCIN(0)〜RCIN(3)の4つのポートを使っています。6個しか空きがないのに4つ使ったら、あとジャイロのINとOUTで1個でいっぱいになってしまいますね。ロボザックではラジコン用のユニットとジャイロが1つ付くことになると思いますが、というか、それを楽しみに購読を続けているのですが、ADポートが埋まってしまうことを考えると、ETX/ERXを使うゲームパッドを使う方向で考えていった方がいい気もしますね。

どうでもいい余談ですが、RCIN(n)のコンパイル結果は、AD(n+100)になっていますので、AD(100), AD(101)といった感じに書いても機能すると思います。

----------------
にほんブログ村 科学ブログ 
ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)