ROBOBASIC講座

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) | トラックバック (0)

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)

ROBOBASIC講座(解りやすく?修正しやすく?カッコ良く?スマートに書くためには)

コードを書く時は、後で見て解りやすい様に、修正しやすい様に、書けるといいですよね。言語ごとで、書き方の基本、決まりみたいなものはあるかと思いますが、自分なりにルールを作って、そのルールに則って書く癖を付けるといいですね。

書式のルール(例)

  • (グローバルな)変数は小文字のgを付ける
    flairROBOBASICでは、グローバルな変数しかない
    (以下のコードではgは付けてないimpact
  • 定数には小文字のkを付ける
    flair名前はその数値が意味する名前にする。
    flair長過ぎる名称も逆に解りにくくなるので注意
    flairとはいいつつ、数値のままの方が解りやすい場合もあったりする
    flairCONSTは、プログラムのサイズに影響しないので、気兼ねなく使ってOKsign01
  • サブルーチンの仕切り線
    flairgoto, gosubで仕切り線を変えてもいいかも
    flairラベル名にもルールを決めて、gotoのラベルはtを、gosubのラベルにはsを付けるとかしてもいいかも
  • IF文、FOR...NEXT文のタブの入れ方
    flairダブを上手に使って、スッキリさせましょうsign01
    flair長いIF〜ENDIFや、FOR〜NEXTの場合、同じコメントの線で囲むといい

それから、なかなかできないことなんですが、
コメントは

  • 説明はできるだけ書込む
    後から見ると必ず、コメント書いておけば良かったと後悔する時がよくあります。
  • 修正した箇所には、修正日を入れておくといい
    flair修正前のコードも消さずに、しばらくはコメントにして残しておく。バグは思わぬ所に潜んでいるものです。修正したコードがちゃんと動くことを確認してから消去する。flairいつも上書き保存するのでなく、コードを大きく書き換えた場合は、別名(バージョン名、日付)で保存する。
  • ざっと見て、パットわかることが大切なので、日本語で書いておくといい
    flairフォントを日本語フォントに設定しておく必要がある

など、兎に角、面倒くさがらずに、できるだけ書く癖を付けるといいかなぁ

サンプルとして、夢現工房さんのページにある
Template Plogram For GameCon(Version1.09 20070515).bas

'*************************************************
ADGET:
....
....
....
RETURN
'*************************************************

の間を、解りやすく?修正しやすく?カッコ良く?スマートになるように、以下のように書き換えてみました。ご興味のある方は、この部分を入れ替えて試してみて下さい。なお、※斜めに倒した時の感度にも、少し手を加えています。※日本語のコメントを使っているので、フォントの変更が必要になるかもしれません。※既存のコードを元に、このサブルーチン部分だけを書き換えたので、根本的に書き換えれば、もっと良いコードが書けるかもしれません。

なお、以下のプログラムをRZ1Basicを使って、コンパイル、または、シミュレーションする場合は、最新のver 0.3.1をご使用下さい説明)。

'*************************************************
'感度
CONST kMIN_A=20
CONST kMAX_A=235
CONST kMIN_B=60
CONST kMAX_B=195
'解析番号
CONST kRightStick=0
CONST kLeftStick=1
'傾けた向き
CONST kNONE=0
CONST kStk_Up=1
CONST kStk_Left=1
CONST kStk_Down=2
CONST kStk_Right=2
'通信
CONST kRightStkLR=&H43'="C" 
CONST kRightStkUD=&H44'="D" 
CONST kLeftStkLR=&H45'="E"
CONST kLeftStkUD=&H46'="F"
'結果
CONST kUp=1
CONST kDown=2 
CONST kRight=3
CONST kLeft=4 
CONST kRightUp=5
CONST kRightDown=6
CONST kLeftUp=7
CONST kLeftDown=8
'通信速度
CONST kExSpeed=19200

DIM ADV1 AS BYTE
DIM ADV2 AS BYTE
DIM ADTV AS BYTE
DIM
CASV AS BYTE

'#############################
'斜め具合を調べる
CHECK_DIAGONAL:
IF CASV<kMIN_B THEN
        CASV=1
ELSEIF kMAX_B<CASV THEN
        CASV=2
ELSE
        CASV=kNONE
ENDIF
RETURN

'#############################
'結果を割り当てる
ASSIGNED_STICK_RESULT:
IF ADV1=kStk_Up AND ADV2=kNONE THEN
   
ADTV=kUp
ELSEIF
ADV1=kStk_Down AND ADV2=kNONE THEN
   
ADTV=kDown
ELSEIF
ADV1=kNONE AND ADV2=kStk_Right THEN
   
ADTV=kRight
ELSEIF
ADV1=kNONE AND ADV2=kStk_Left THEN
   
ADTV=kLeft
ELSEIF
ADV1=kStk_Up AND ADV2=kStk_Right THEN
   
ADTV=kRightUp
ELSEIF
ADV1=kStk_Down AND ADV2=kStk_Right THEN
   
ADTV=kRightDown
ELSEIF
ADV1=kStk_Up AND ADV2=kStk_Left THEN
   
ADTV=kLeftUp
ELSEIF
ADV1=kStk_Down AND ADV2=kStk_Left THEN
   
ADTV=kLeftDown
ENDIF
 
RETURN

'############################################
'ゲームパッドのアナログスティックの状態を取得
ADGET:

'<<シグナルを取得する>>
ADSET=kRightStkLR '"C"
ETX kExSpeed,ADSET
ADGET1:
ERX
kExSpeed,ADR2,ADGET1

ADSET=kRightStkUD '"D"
ETX kExSpeed,ADSET
ADGET2:
ERX kExSpeed,ADR1,ADGET2

ADSET=kLeftStkLR '"E"
ETX kExSpeed,ADSET
ADGET3:
ERX kExSpeed,ADL2,ADGET3

ADSET=kLeftStkUD '"F"
ETX kExSpeed,ADSET
ADGET4:
ERX kExSpeed,ADL1,ADGET4

'<<シグナルを解析する>>
' I=0
右スティックの解析
' I=1 左スティックの解析

'右スティックの値をセットする 
ADV1=ADR1
ADV2=ADR2
FOR I=kRightStick to kLeftStick
    '傾き具合を調べる 
    IF ADV1<kMIN_A THEN
        ADV1=kStk_Up
        CASV=ADV2
        GOSUB CHECK_DIAGONAL
        ADV2=CASV
        GOSUB ASSIGNED_STICK_RESULT
    ELSEIF kMAX_A<ADV1 THEN
        ADV1=kStk_Down
        CASV=ADV2
        GOSUB CHECK_DIAGONAL
        ADV2=CASV
        GOSUB ASSIGNED_STICK_RESULT
    ELSEIF ADV2<kMIN_A THEN
        ADV2=kStk_Left
        CASV=ADV1
        GOSUB CHECK_DIAGONAL
        ADV1=CASV
        GOSUB ASSIGNED_STICK_RESULT
    ELSEIF kMAX_A<ADV2 THEN
        ADV2=kStk_Right
        CASV=ADV1
        GOSUB CHECK_DIAGONAL
        ADV1=CASV
        GOSUB ASSIGNED_STICK_RESULT
    ELSE
        ADV1=kNONE
        ADV2=kNONE
        ADTV=kNONE 'ここで0にしちゃう!
    ENDIF

    '結果を整理
    IF I=kRightStick THEN
        '右
スティック結果は10の位
        PSDT=ADTV*10
        '左スティックの値をセットする
        ADV1=ADL1
        ADV2=ADL2
    ENDIF
 
NEXT I

'最終結果:右左の結果を足す
PSDT=PSDT+ADTV

RETURN

'*************************************************

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

ROBOBASIC講座(IN, OUT, BYTEIN, BYTEOUT)

【IN (イン)】
 指定ポートからデジタル信号の値を読みこむ。
 構文:IN([ポート番号])
  例:A = IN(33)

【OUT (アウト)】
 ポートにデジタル信号を出力する。
 構文:OUT [ポート番号], [出力値]
  例:OUT 52, 1

【BYTEIN (バイトイン)】
 バイト単位でポートから信号を読み込む。
 構文:BYTEIN([バイトポート番号])
  例:A = BYTEIN(0)

【BYTEOUT (バイトアウト)】
 バイト単位でポートに信号を出力する。
 構文:BYTEOUT [バイトポート番号], [出力値]
  例:BYTEOUT 0, 255

《解説》
今回のコマンドは、デジタル入出力の為のコマンドになります。MR-C3024のポートを通して信号を入力します。以下の写真にポート番号を示しましたので参考にして下さい。

(※左上のピンが24-31番のポートかな?右が若い番号なのか、左が若い番号なのかどちらかな?)

●デジタルなので、これらの命令で扱う入出力の値は、0または1になります。

●32から39番の8つのポートはAD変換ポートの0から7に対応します。従って、例えばIN(33)で得られる値は、0または1なんですが、AD(1)とした場合、0から255の値が得られます。

●BYTEIN/BYTEOUTでは、ポートをバイトポート番号として扱います。8個分のポートの入出力を一度に行えます。若いポート番号がバイトの下位に対応することになります。

  • 0番から7番ポート= バイトポート0番
  • 8番から15番ポート= バイトポート1番
  • 16番から23番ポート= バイトポート2番
  • 24番から31番ポート= バイトポート3番
  • 32番から39番ポート= バイトポート4番

●52番ポートがLEDです。ハイテックにあるOverall Template Programにある「robot_voltage」のルーチンに、OUT 52,1 OUT 52,0と書かれており、これを実行すると、LEDが点減します。

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

ATmega128ピン番号との対応(赤枠の部分のポートとの対応は不明)
Atmega28l_mrc3024

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

ROBOBASIC講座(TEA TIME #2)

ロボザック60号に付いてきたRZ-1プログラムCD-ROM 2のタッチセンサー1、2のプログラムをRZ1Basicでシミュレーションしてみた。

また、
GOSUB REMGET
になっているので、スタックオーバーフローのエラーが。。。
Rz1basicscreensnapz001
※RZ1Basic v0.2.9では、IN, ADなどの値を制御できないので、この場合コメントにしています。今後のバージョンでそれ用のインターフェイスも考えてはいます。

ちなみに、私はまだセンサー類をひとつも付けていないのですが、これをロボザックに転送して(GOSUB REMGETの部分は、GOTOにしました)、動かしてみました。

k1が繰り返されないから、センサーなしで、TSは0以外の数値になっているようですね。。。
センサー取り付けの部分まったく読んでないのですが、IN(33)は、AD(1)かな?

【追記】
タッチセンサーがAD(1)に付くんですね。センサーを繋げないでもう一度やってみたら、お辞儀を繰り返しました。マニュアル的には、何も繋げていないと、読込むたびに異なった数値になるそうです。

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

ROBOBASIC講座(TEA TIME #1)

ふと思ったことを、「TEA TIME」として書いて行くことにしようshine

何回か出てきていますが、
Template Plogram For GameCon(Version1.09 20070515).bas
の最初の辺り

  • DIRはいちおう設定しておいた方が安全でしょうsign01
  • GOSUB MOTOR_CALLは脱力したあと、HIGHSPEEDで立ち上がらせる為に使っているのだろうか?A=MOTORIN(n), SERVO 0,Aの処理って、GETMOTORSETってことじゃないsign02
  • GOSUB MOTOR_ONは、MOTOR G24ではいけないのだろうかsign02

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

PTP SETON
PTP ALLON

'********************************************
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

'SPEED 15
'HIGHSPEED SETON
'GOSUB MOTOR_CALL
'HIGHSPEED SETOFF
'DELAY 1000
GETMOTORSET G24,1,1,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,0

SPEED
 5
MOTOR G24 'GOSUB MOTOR_ON

TEMPO 250
MUSIC "O4AA"

GOSUB STDUP
GOTO MAIN

'************************************************

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

ROBOBASIC講座(ZERO, INIT/GETMOTORSET)

【ZERO (ゼロ)】
 サーボモーターの基準角度(零点)を設定する。
 構文;ZERO [グループ指定], [モータn基準角度], .....
  例:ZERO G8B, 80, 120, 115, 80, 117, 88, 95, 120

【INIT (イニット)】
 ロボットの初期の動作姿勢を設定する。
 構文:INIT [グループ指定], [モーターn角度],……
  例:INIT G8A, 100, 45, 67, 44, 132, 122, 76, 81

【GETMOTORSET (ゲットモーターセット)】
 現在のサーボモーターの位置を読み込み、現在の状態を維持する。
 構文:GETMOTORSET [グループ指定], [モーターn入力設定指定],…
  例:GETMOTORSET G8A, 1, 1, 1, 1, 0, 0, 0, 0

《ZEROコマンドとゼロ点設定について》

今週の日曜日にやっと49号まで、つまりロボザックが完成しましたので、ゼロ点設定を行いました。上半身ができた時に一度roboBASICを使ってやったことがあるので、簡単に行くだろうと思っていましたが、結構苦労しましたsweat01

ZEROコマンドは、モータの個体差などにより、それぞれ異なっている基準角度を補正する命令です。ですからロボットが組み上がったらまず一番最初に設定する必要があるコマンドと言えますよね。

ZEROコマンドの決まり事としては、   MR-C3000系コントローラーでは

 
    • 必ずグループ宣言で行うこと。
    • 設定範囲は、80~120まで

となっているようです。

マニュアルに、現在のroboBASICには、 "零点設定"メニューが別途に用意されているので、この過程が必要なく簡単に処理できるようになっています。とあります。以前はこのような機能がなく、このコマンドを使ってゼロ点を設定したんですねflair

さて、私がこのゼロ点設定に苦労したかといいますと、私のロボザックのゼロ点は以下だったからです。

ZERO G6A,116,  99, 100,  84, 114
ZERO G6B,102,  98, 102
ZERO G6C, 98,  99,  95
ZERO G6D, 83, 104, 100,  96, 103

(※DIR G24,1,0,0,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,0で設定した場合の値)

上肢だけで設定した時は、100前後そんなにズレていなかったのですが、下肢は結構ズレがあって、ゼロ点設定の「設定読込み」ボタンを押すと、左右の下肢がぶつかり合って、安全装置?が働いて、モーターがオフになってデータを読込めない状態だったんですわsweat01

そのままではroboBASICのゼロ点設定が使えなかったので以下の手順で行いました。

oneマニュアルにはDIRは全部1でやる的な感じで書いてありますが、普段は、DIR G24,1,0,0,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,0で使うことになるんでしょうから、それで設定することにしました。two私の場合は左右の下肢がぶつかってしまうことが一番の問題点だったので、足がぶつからないように股関節を外転させた状態(股を開いた状態)をゼロ点にするということで、#4と#23の股関節のモータの値をZEROコマンドの許容範囲最大の120に設定するようなコードを書き、これをコンパイルして、転送しました。

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

ZERO G6A, 100, 100, 100, 100, 120
ZERO G6B, 100, 100, 100
ZERO G6C, 100, 100, 100
ZERO G6D, 100, 100, 100, 100, 120

threeこうした後、"ゼロ設定"メニューを起動、「設定読込み」ボタンをクリックsign01今度はモータがぶつかり、安全装置?が働いてしまうことなく、無事最後まで読み取ってくれましたscissors


もし同様な問題でroboBASICのゼロ点設定機能が使えない方は、このZEROコマンドを使ってrやってみて下さいねhappy01paper

※RZ1Basicのゼロ点設定を使った感想sweat01

  • #5, #9,...など、上肢下肢で使ってないモータのZERO点の設定もできます。
  • それぞれのモータ値を動かすと、その場でモーターが動くので設定しやすいです。
  • 読込みボタンをクリックすると、roboBASICと同じく、最初に全部のゼロ点データを読込んでしまうので、私のトラブルと同じ様な状況の場合に対応できるようにしなくては(次のバージョンかな)

Parallels_desktopscreensnapz005_2

《INITとGETMOTORSETコマンドについて》

この2つのコマンドはマイコンの電源を入れた時に急激な動きにならないように、最初にどうするかを設定するコマンドであり、アナログサーボモーター (HITEC社の HS-シリーズ)の場合 INIT命令を使用し、ロボット専用のデジタルサーボモーター (HITEC社の HSR-シリーズ最新バージョン)の場合 GETMOTORSET命令を使用するとのことなので、ロボザックの場合は、GETMOTORSET命令を使えばいいということになりますねflair

GETMOTORSET命令は、例にあるように、"0"と"1"で設定し、それぞれ、"1"の場合には指定されたサーボモーターの現在値を読み込んで現在の状態を維持するようになり、"0"の場合にはコントローラーの初期値の100に移動します。

なので、使っているモータ番号を1として、以下のように書いて、プログラムの最初の方(初めてMOVEコマンドが実行される前)に書込んでおけばいいということになりますねflair

GETMOTORSET G24,1,1,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,0


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

ROBOBASIC講座(どっちが速い?)

ROBOBASICで、処理速度を気にしなくてはいけないほどのプログラムを組むことはないと思うので、どっちでもいいんですが、考えてみたことありますか?

mobaqone同じ動作を繰り返す時、どっちが速いsign02

FOR i=1 TO 4
    GOSUB hogehoge
 
NEXT i

VS

GOSUB hogehoge 
GOSUB hogehoge 
GOSUB hogehoge 
GOSUB hogehoge

mobaqtwoIF文、条件に合う場合と、合わない場合、どっちが速いsign02 

a=1
if a>0 then
    GOSUB hogehoge 
else
    GOSUB hogehoge 
endif

VS

a=0
if a>0 then
    GOSUB hogehoge
else
    GOSUB hogehoge
endif


mobaqthreeある数を4で割る場合と、2シフトする場合、どっちが速いsign02

b=a/4

VS

b=a>>2



答えは、またの機会にねwinkpaper

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

ROBOBASIC講座(New基本モーション)

以前、「ROBOBASIC講座(テンプレートMAINループ)」で、ロボザックに付いてきた基本モーションのMAINループのフローチャート図を示しましたが、このテンプレートは痙攣してしまう不具合があるようですが、その修正版がデアゴスティーニの新着情報のページにアップロードされていましたので、そのMAINループ部分のフローチャート作りましたので載せておきます。

変更されている所は、GOSUB REMGETだったのが、GOTO REMGETになった所です。これでRETURNなしでMAINへ戻ってしまう問題点は解消されたかな。

New基本モーション1.basとNew基本モーション2.basの
MAINループのフローチャート
New1

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

ROBOBASIC講座(ETX, ERX)

【ETX】
 ETXポートを利用して RS232信号を送信する。
 構文:ETX [ポート速度], [送信データ]

【ERX】
    ERXポートを利用して RS232信号を受信する。
 構文:ERX [ポート速度], [受信変数], [受信エラー処理ラベル]


ADSET="C"
ETX 19200,ADSET
ADGET1:
ERX 19200,ADR2,ADGET1


ROBONOVA−1を簡単無線操縦!
ワイヤレスコントローラ対応改造パーツセット

というのが販売されていますが、

夢現工房さんの
ダウンロードのページに、

Template Plogram For GameCon(Version1.09 20070515).bas

という名前の、そのワイヤレスコントローラの為のテンプレートがあります。以前、このテンプレートのMAINループをフローチャートにしてみましたが、今回は、このテンプレートの、ETX,ERXを見てみることにしましょう。

このワイヤレスコントローラーのシステムでは、キーパッドやアナログスティッ