roboBASIC_v272J(20080509) が公開されていますね
| 固定リンク
| コメント (2)
| トラックバック (0)
|
今日はなんだか沢山ブログを書いてますねぇけど、カレンダー通りのお仕事なので、ゴールデンウィークでお休みで、沢山な訳ではないのですよ。。。
さて、前回、完成したBlueSMiRFモジュールを使って、以下のソフトで無線通信でできることとできないことを試してみましたので、まとめておきます早速、SimROBOTでも試しましたよ
roboBASIC
roboRemocon
SimROBOT
RZ1Action
RZ1Basic
ゼロ点設定が、私のロボットでは、roboBASICも、RZ1Basicも、途中で止まってしまいます。RZ1Basicでデバグしたところ、4番目のモーターのデータを取得の際です。原因究明中です。
モーターコントロールパネル(roboBASIC)は、途中で変なことが起こって回線が途切れて、roboBASICがハングアップします。
オブジェクトコードの転送は、途中Baudrateの変更に対応したRZ1Basicのみ可能で、その他、roboBASIC, roboRemocon, SimROBOTは当然、不可です。削除も結局、空のオブジェクトコードを転送しているので、Baudrate変更に対応していなければ不可
ついでに、RZ1Basicで、ポート設定する時に、BlueSMiRFにチェックを入れるんですが、これがv0.3.3では保存できていませんでした。従って、v0.3.3では、毎回、起動した際、最初に、ポート設定を開いて、BlueSMiRFにチェックを入れる必要があります(オブジェクトコードの転送をしないのであれば、このチェックは必要ありません)。直しましたので、次のバージョンからは平気です。
----------------
にほんブログ村
| 固定リンク
| コメント (8)
| トラックバック (0)
|
【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: 角度/秒
程度になります。
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で動かしたときの最大速度のことなんだろうか?
これまた適当で、申し訳ありません。。。
----------------
にほんブログ村
| 固定リンク
| コメント (0)
| トラックバック (0)
|
【PTP(ピー・ティー・ピー】
サーボモーターの同時の動作制御機能を ON/OFFする。
構文:PTP [SETON/SETOFF/ALLON/ALLOFF]
例:
【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コマンドを入れておくのが無難だと思います。
《その他の制御用語》
----------------
にほんブログ村
| 固定リンク
| コメント (0)
| トラックバック (0)
|
【MOTORIN(モーターイン)】
サーボモーターの現在値を読み込む。
構文:MOTORIN ([モーター番号])
例:S0 = MOTORIN(0)
【SERVO(サーボ)】
サーボモーターを指定した角度に動作する。
構文:SERVO [モーター番号],[モーター角度]
例:SERVO 1,130
【MOTOR(モーター)】
サーボモーターをオンにする。
構文:MOTOR [モーター番号] または [グループ指定]
例:MOTOR G6A
【MOTOROFF(モーターオフ)】
サーボモーターをオフにする。
構文:MOTOROFF [モーター番号] 又は [グループ指定]
例:MOTOROFF G6A
久しぶりにROBOBAIC講座です
今回は、サーボモーターのオン/オフと、角度の読み書き関連のコマンドです。
《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さんの「ロボに道具を」。。素敵
----------------
にほんブログ村
| 固定リンク
| コメント (0)
| トラックバック (0)
|
今回は電源電圧の検出についてです。前回出てきたADポートの6番がそれに割り当ててあります。電圧が下がると暴走を始めるので、組み込んでおきたいルーチンですよね。しかし私は、この辺り全然試していないので、以下に上げた参考資料をもとにまとめたものです。
《参考資料》
《ROBONOVA-Iのマニュアルでは》
ハイテックのサイトからダウンロードできるROBONOVA-I 日本語マニュアルのP95に「(7) LOW-VOLTAGE WARNING設定方法」という項目があります。ここには以下のように書いてあります。
《個体差がある》
avalonさんは151くらい(1、3)、fkさんは155くらい(3) 、Overall Template Programでは148、action_auto.basでは160でチェックしていて、個体差があるようです。あと、ADアダプタと、バッテリでも値が異なるようです(2)。
《電圧を求める式は》
ATmega128/128Lのデータシート(6)のA/D変換器の項目(p153〜)を読んでみたけど難しいですねavalonさんが(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を使う場合は》以前、ハイテックにあったテンプレートについて(1)で書きましたが、Overall Template Programにあるrobo_voltageのルーチン(以下)はENDIFがないので、このままでは変なことが起きてしまうかもしれませんので、このルーチンを使う場合は、ENDIFを書き加えて下さいね。
それから毎回呼ぶ必要もないなぁという場合は、例えば以下のように動かす前だけチェックするようにしてもいいのかもしれません。
IF RR<>0 THEN GOSUB robot_voltage
ON RR GOTO MAIN,K1......
.....
IF A<>0 THEN GOSUB robot_voltage
ON A GOTO MAIN,K1......
.....
あと、好みですが、例えば以下の様にアレンジすると、電圧が下がると点減回数が増えるようにできますね。
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)
|
【AD(n)】
ADポートを使いアナログ信号をデジタルに変換する。
構文:AD ([ADポート])
例:a = AD(1)
【RCIN(n)】
RC用操縦機と受信機から入力されるパルス値を入力する。
構文:RCIN ([RC受信ポート])
例:a = RCIN(2)
《解説》
MR-C3024のピンとポート番号(左上のピンとポート番号の対応は不明)
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)
|
コードを書く時は、後で見て解りやすい様に、修正しやすい様に、書けるといいですよね。言語ごとで、書き方の基本、決まりみたいなものはあるかと思いますが、自分なりにルールを作って、そのルールに則って書く癖を付けるといいですね。
書式のルール(例)
それから、なかなかできないことなんですが、
コメントは
など、兎に角、面倒くさがらずに、できるだけ書く癖を付けるといいかなぁ
サンプルとして、夢現工房さんのページにある
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)
|
【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個分のポートの入出力を一度に行えます。若いポート番号がバイトの下位に対応することになります。
●52番ポートがLEDです。ハイテックにあるOverall Template Programにある「robot_voltage」のルーチンに、OUT 52,1 OUT 52,0と書かれており、これを実行すると、LEDが点減します。
MR-C3024のピンとポート番号(左上のピンとポート番号の対応は不明)
ATmega128ピン番号との対応(赤枠の部分のポートとの対応は不明)
----------------
にほんブログ村
| 固定リンク
| コメント (5)
| トラックバック (0)
|
ロボザック60号に付いてきたRZ-1プログラムCD-ROM 2のタッチセンサー1、2のプログラムをRZ1Basicでシミュレーションしてみた。
また、
GOSUB REMGET
になっているので、スタックオーバーフローのエラーが。。。
※RZ1Basic v0.2.9では、IN, ADなどの値を制御できないので、この場合コメントにしています。今後のバージョンでそれ用のインターフェイスも考えてはいます。
ちなみに、私はまだセンサー類をひとつも付けていないのですが、これをロボザックに転送して(GOSUB REMGETの部分は、GOTOにしました)、動かしてみました。
k1が繰り返されないから、センサーなしで、TSは0以外の数値になっているようですね。。。
センサー取り付けの部分まったく読んでないのですが、IN(33)は、AD(1)かな?
【追記】
タッチセンサーがAD(1)に付くんですね。センサーを繋げないでもう一度やってみたら、お辞儀を繰り返しました。マニュアル的には、何も繋げていないと、読込むたびに異なった数値になるそうです。
| 固定リンク
| コメント (2)
| トラックバック (0)
|
AR / OpenCV | Arduino / Processing | FON (フォン) | Hackintosh | HTML / CSS / JavaScript | ipaBacklist | ipaPNGviewer | iPhone / iPad 関連 | lecca | MA-VIN(マービン) | Pastebot Mimic | RemoteKey Mimic | roboBASIC | ROBOBASIC講座 | RZ1Action | RZ1Basic | RZ1シリーズ | SimROBOT | Softmodem | WiiRemote関連 | その他 | シリアル通信 | ソフトウエア | プレゼント | マック | マック DE ロボ | マニュアル(RZ1Basic) | ロボ DE 解剖学 | ロボット大会/競技会 | ロボット関連 | 工作・改造・解析 | 映画・テレビ | 無線化 | 無線化(BlueSMiRF) | 無線化(RBT-001) | 無線化(VRbot) | 無線化(WRL-08869) | 無線化(音声認識) | 赤外線リモコン | 週刊 ロボザック | 週刊 ロボゼロ | 開発関連