roboBASIC

roboBASIC_v272J(20080509) が公開されていますね

新しいroboBASICが公開されていますね。
avalonさんとか、ビロビさんが書いてますので、そちらを参考にして下さい。

けど、いちおう

  • VistaではroboBASIC, roboScript, roboRemocon, roboMakerともに動きませんでした。
  • avalonさんも書かれていましたが、私もFirmwareのアップデートを行うとエラーがでました。エラーが出た後はroboBASICを立ち上げ直さないと以下のエラーがでます。
    Finderscreensnapz013


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

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

BlueSMiRF関連(オーディオプラグに繋ぐには6)

今日はなんだか沢山ブログを書いてますねぇsweat01けど、カレンダー通りのお仕事なので、ゴールデンウィークでお休みで、沢山な訳ではないのですよ。。。

さて、前回、完成したBlueSMiRFモジュールを使って、以下のソフトで無線通信でできることとできないことを試してみましたので、まとめておきますpaper早速、SimROBOTでも試しましたよscissors


roboBASIC

  • コントローラー情報...
  • プレイ/ストップ/リセット... 
  • Catch & Play(ヒューマノイド)...
  • オブジェクトコード転送...不可
  • 削除...不可 
  • ゼロ点設定...不可
  • モーターコントロールパネル...不可

roboRemocon

  • PCコントロール...
  • Download(オブジェクトコード転送)...不可

SimROBOT

  • PCコントロール...
  • Catch & Play(ヒューマノイド)...
  • Download(オブジェクトコード転送)...不可

RZ1Action

  • Catch & Play(ヒューマノイド)...

RZ1Basic

  • コントローラー情報...
  • プレイ/ストップ/リセット...
  • オブジェクトコード転送...
  • 削除...
  • Catch & Play(ヒューマノイド)...
  • PCコントロール...
  • ETX/ERXのPCコントロール...
  • AD値、変数値などの値の取得...
  • ターミナル...
  • ゼロ点設定...不可

ゼロ点設定が、私のロボットでは、roboBASICも、RZ1Basicも、途中で止まってしまいます。RZ1Basicでデバグしたところ、4番目のモーターのデータを取得の際です。原因究明中です。

モーターコントロールパネル(roboBASIC)は、途中で変なことが起こって回線が途切れて、roboBASICがハングアップします。

オブジェクトコードの転送は、途中Baudrateの変更に対応したRZ1Basicのみ可能で、その他、roboBASIC, roboRemocon, SimROBOTは当然、不可です。削除も結局、空のオブジェクトコードを転送しているので、Baudrate変更に対応していなければ不可


ついでに、RZ1Basicで、ポート設定する時に、BlueSMiRFにチェックを入れるんですが、これがv0.3.3では保存できていませんでした。従って、v0.3.3では、毎回、起動した際、最初に、ポート設定を開いて、BlueSMiRFにチェックを入れる必要があります(オブジェクトコードの転送をしないのであれば、このチェックは必要ありません)。直しましたので、次のバージョンからは平気です。

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

| | コメント (8) | トラックバック (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)
|