« 2008年2月 | トップページ | 2008年4月 »

2008年3月

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)

RZ1Music v0.1.2 公開

Icn_rz1music2_128 RZ1Music v0.1.2を公開しました。

またまた大した変更ではないのですが、

更新内容

  1. アイコンを変更した(けど、まだ気に入らないsweat01
  2. ファイルメニューの終了が、「Exit」となっているのが気になって、修正
  3. 見栄えを良くした。

ここからダウンロードできます。
Finderscreensnapz001

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

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

RZ1Basic v0.3.1 公開

Rz1bicon04

RZ1Basic v0.3.1を公開しました。

エラーを起こす不具合が3つほど見つかりましたので、v0.3.0を公開したばかりですが、こちらを使って頂けますようお願いします。

RZ1Basicはここからダウンロードできます。

更新内容

  1. ロボザックのスタートボタンと、シミュレーションのスタートボタンのアイコンが同じだったため、間違えてクリックしないように、シミュレーションスタートのアイコンを変更した。
  2. シミュレーション再生で、CONST名が例の用に一部を含む名称を用いていた場合にエラーが出る不具合を修正した。
    (例:kRとkRR)
  3. 「'」の後に、「"」があった場合、コンパイルエラーを起こす場合がある不具合を修正した。
  4. Windows版において、シミュレーション再生で、スタックオーバーフローなどのエラーが出るような場合、エラーメッセージが出続けて落ちる不具合を修正した(ヒロビさん、不具合報告ありがとうございました)
  5. Music編集ウインドウのインターフェイスを見栄えを良くした。

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

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

RZ1References v0.1.0 公開

Icn_rz1references_128_2

RZ1References v0.1.0を公開しました

RZ1Referencesは、RZ1Basicの機能のひとつ、コマンドリファレンスの機能を抜き出して単独のソフトウエアとしたものです。RZ1Basicを使われない方、RZ1Basicを使っていない時など、ROBOBASICのコマンドをリファレンスしたい時などにお使い下さい。

ここからダウンロードできます。

Photoshopscreensnapz002

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

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

RZ1Peek v0.1.0 公開

Icn_rz1peek_128RZ1Peek v0.1.0 公開を公開しました。

RZ1Peekは、Robonova-I / Robozak-Iとコンピュータを通信ケーブルで繋いで、実行中のコントローラー(MR-C3024)から各種データを取得する為のソフトウエアです。

この機能はRZ1Basicに付いている機能ですが、 roboBASICしか使わない方の為に 、RZ1Basicから抜き出し、単体のソフトウエアとしたものです。プログラムのデバグなどにご利用下さい。

ここからダウンロードできます。

Parallels_desktopscreensnapz003

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

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

RZ1Music v0.1.1 公開

Icn_rz1music_128

RZ1Music v0.1.1公開しました。
今日はRZ1Basicの新しいのを公開したから、明日公開しようかと思っていたのですが、間違ってアップロードしてしまったので、公開です。
更新内容は、Windows版で、メニューが表示されない不具合を修正のみです。

ここからダウンロードできます。

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

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

RZ1Basic v0.3.0 公開

Rz1bicon04

RZ1Basic v0.3.0を公開しました。

Windowsバージョンで、ゲームパッド編集がうまいことできなかったので、それを修正し公開しました。あと、AD値以外の変数値、INなどのデータが取得できるようになりました。

RZ1Basicはここからダウンロードできます。

更新内容

  1. ゲームパッド編集において、(Windows版で)上手く動いていなかった部分があった為、以下の点について修正した
    • ちらつきを修正
    • 左のリストで、日本語を入力できない不具合を修正
      Parallels_desktopscreensnapz006
    • 8ビット以上の直接値の場合に対応
      最大値が255以上の場合は「直接(8bit)」を選択して下さい。
      Parallels_desktopscreensnapz008
    • 保存のボタンを付けた
      Parallels_desktopscreensnapz007
  2. FOOTGROUNDING書込みのボタンを付けた
    シミュレーション再生の足の接地のコマンドを、以下の図のボタンをクリックすることで、ソースコードの選択位置に書込むことができます。
    Rz1basicdebugscreensnapz008
  3. シミュレーション再生で、
    • LCDのFORMATの桁数に対応した
    • IN, OUT, BYTEIN, BYTEOUT, MOTORIN, SERVO,ROMPEEK, ROMPOKEに対応した
    • AD, INの値の設定に対応した
  4. ADデータの取得以外、IN, BYTEIN, 変数値の取得に対応した。LCDを持ってなくても結構便利にデバグできるようになりました。

《シミュレーション再生におけるポート値の設定》

  1. ポート値の設定の為のボタンをクリックすると、
    Rz1basicdebugscreensnapz002
  2. 以下の図のようなダイアログが表示されます。
    Rz1basicdebugscreensnapz001
  3. 例えば60号のCDにあるプログラムでは、IN(33)を使っているので、このダイアログで33番のチェックボックスをON/OFFすることで、その値を設定できます。
  4. ポート番号32から39は、ADの0から7にも対応します。0から5のチェックボックスにチェックを入れることで、ADポートとして扱えます。
  5. ポート番号39番以上の場合は、ダイアログ下の方のエディットフィールドにポート番号を入力して下さい。6個まで、設定できます。ハイテックにあるOverall Template Programでは、52番のポートを使っています。
    • 39以上なので、6個のうちのどれかのフィールドに52と入力することで、それがIN/OUTの52番となります。
    • GOSUB robot_voltageのコメントを外して、シミュレーションをスタート。
    • AD(6)の値が147以下になるとOUTが実行されるので、AD(6)のスライダーを147以下にしてみます。
    • 52番と記入したチェックボックスがオン/オフすると思います。
      Rz1basicdebugscreensnapz003

《コントローラーから値を取得する》
これまでのバージョンではケーブルでつないだ状態でロボザックを起動させて、ADポートの値を取得することができていましたが、今回、その他に、変数の値、INの値、BYTEINの値も取得できるようになりました。変数の値が取得できるようになったので、デバグの為にLCDが無くてはとお考えになっていた方にも、有効に使える様になったかと思います。

  1. メニューのコントローラーの中の「コントローラのデータ読込み」を選択
    Rz1basicscreensnapz005
  2. 「取得データ」のメニューから取得したい項目を選択(SRAM 0x0140のようになっているのが、変数の格納アドレスです。ソースコードで宣言した順になっているので、もし2番目に宣言した変数の値を取得する場合は、SRAM 0x0141を選択して下さい)なおBYTEで宣言されている必要があります。
    Finderscreensnapz006

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


 

| | コメント (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)

タッチセンサーと光センサー

タッチセンサーと光センサーをADポートに繋いで、特性をRZ1BasicのADポート取得の機能を使って、実際の値をみてみた。

【タッチセンサー】

Parallels_desktopscreensnapz001

触れてない時が、255で、触れた時が、0になります。ロボザックではAD(1)に接続するようになっていますが、殆どオン/オフなので、ADポートを使うのはもったいないですね。デジタルポートでいいんじゃないかなぁ?

【光センサー】

Parallels_desktopscreensnapz002

暗くすると値が大きくなります。255になるには、真っ暗にならないとならないようです。ロボザックでは、サーボモータを付けるところの11番と17番に付けることになっています。デジタルポートなので、オン/オフのデータしか得られないですね。RoboZak奮戦記の「光センサーを試す」で調べていますが、「出力反転となる距離は床から1mm程度しか離れていませんからほとんど非接触のタッチセンサー(?)というレベルですね。」とのことらしいです。なんかこれだけの感度が得られているのにデジタルじゃもったいないですね。

タッチセンサーをデジタルポートにいれて、光センサーをADポートに入れるとADのポートが足りなくなってしまうのかなぁ?

 

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

強化ブラケットは、まず下肢に

ロボザック61号が届きましたね。
腕のと同じですよねsign02
強化ブラケットは弱々しい下肢に付けました。
Dvc00149_2

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

セクシーボイスアンドロボ

『セクシーボイスアンドロボ』は、黒田硫黄の漫画作品で、「スピリッツ増刊IKKI」2000年12月号(創刊号)から2003年2月号(第13号)にかけて13話連載され、同誌の月刊化を期に未完のまま中断となっている漫画のようです(Wikipediaより)。

日本テレビでTVドラマ化(11話)され、2007年4月10日〜2007年6月19日に放映されていたようです。私は見ていなかったのですが、子どもがDVDを全巻借りてきたので、一気に見ました。

七色の声を操る14歳の少女「ニコ」と、ロボット大好きオタク青年「ロボ」の2人が、謎の婦人から依頼を受けて、次々と事件を解決して行く冒険活劇で、毎回笑えるし、教訓じみたこともあって、とてもハマりましが、原作も読んでいないのですが、テレビの方はだいぶ原作と変わっていたようで視聴率が伸びなかったようです。

松山ケンイチ演ずる通称:ロボは、ロボットオタクの24歳青年。秋葉原勤めの会社員。自宅に大量のロボットフィギュアを飾っている。特に『マックスロボ』というアニメが大好きで、いつもマックスロボのフィギュアを持ち歩いていて、フィギュア片手に「マックスビーム」とか、「マックスパンチ」など、決め台詞を叫んでいます。何かを食べるときはいつも「いただきマックス」と言うのが、どうも私まで移ってしまいましたsweat01

で、主題歌は、みつき大切なもの の 2曲目の「ひとつだけ」です。
買っちゃいましたhappy01




DVDは、まだ買ってないけど、欲しい。。BOXが1万切ればいいのになぁ。。

| | コメント (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)

RZ1Music v0.1.0 公開

Icn_rz1music_128

RZ1Musicというのを公開しました。
このソフトウエアは、ROBOBASICのMUSICコマンドを編集する為のソフトウエアです。

RZ1Basicを使わない方(roboBASICを使っていらっしゃる方)にも、この機能を利用して頂ければと、RZ1Basicの機能から単体のソフトウエアとして抜き出したものです。

ダウンロードはここから

Photoshopscreensnapz001

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

ヘクスローブねじ

ロボザック/ロボノバのネジと言えばsign03

c4cronoさん

c4cronoさんのブログのカテゴリ「ねじ」を見て頂くとわかりますが、ネジに拘って、ロボザックで使うネジを全て、特注でヘクスローブ(Hexalobular)ねじをネジ屋さんに作ってもらっています。

半年以上前ですが、c4cronoさんとお会いする機会がありまして、ねじ一式もらっていたのですが、ロボザックそのもの作成を全然してなかったので、せっかく頂いたのに、そのままになっていました(すいませんc4cronoさん)。

ヘクスローブねじは、日本ではあまりなじみではないのですが、「簡単に開けられない」という意味合いがひとつにあります。


私は20年くらいMacを使っていますが、Macがヘクスローブねじで、メモリーやハードディスクを増設する時に、ヘクスローブ用ドライバーを買いました。今はMacも自分でメモリーやハードの増設をしていいようになり、簡単に開け閉め、取り付けができるようになっているので、ヘクスローブ用ドライバーを持っていたことも忘れてましたsweat01

第40号の所までできていたのですが、左の下肢だけでも、ヘクスローブねじに付け替えようと、昨日は午後から作業開始。

ヘクスローブねじ、すばらしいheart02すげー楽チンnoteまじグ〜good
正直、ロボザックを作っていて、ネジ締めるのって、こんなに大変なんだぁdownと再認識していたのですが、スイスイ作業が進みました。ということで、上肢も交換してしまおうと、やりだしたら止まらずに、体幹部分も交換して、いつの間にか、未完成だった、右の下肢も作り、49号のケーブルを束ねる前の段階までできてしまいましたhappy01

結局、ネジ締め、頭の先から足の先まで、いっきに全部したので、ネジはどれだsign02と考えながらやってましたが、どこにどんなネジが使われるのかも自然にあたまに入ってしまい、見ればだいたい、どんなネジなのかも判断付くようになりましたscissors

ヘクスローブねじ頭になって、かっこ良くなったし、
まぢ、c4cronoさんに感謝感謝です。

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

RZ1Basic v0.2.9 公開

Rz1bicon04

RZ1Basic v0.2.9を公開しました。

ブログもなかなか更新できず、プログラミングに集中してました。やっとシミュレーション再生機能を付けることができましたscissors あと、バグをヒロビさんに報告頂きましたので、その修正をしました。

RZ1Basicはここからダウンロードできます。

更新内容

  • Music編集ウインドウを閉じると、ハングアップしてしまう不具合を修正
  • Windows版において、コンテクストメニューが全然働いていなかった不具合を修正
  • ERXコマンドのコンパイル時の不具合を修正
  • MOVE24の行を選択した場合の不具合を修正
  • ファイルを開いた時、プログレスバーのちらつきを抑制(Windows版)
  • ファイルを保存した時、ファイル名が変になる不具合がある修正(Mac版)
  • シミュレーション再生機能を追加
    それに伴い、
    • IRRemoconの設定仕様変更
    • ゲームパッド設定仕様変更

《シミュレーション再生》
シミュレーション再生に対応しました。

始める前に

足の接地のコマンドをあらかじめ書込んでおく必要があります。
赤外線リモコンの設定は大したことないので簡単ですが、ゲームパッドを使う場合は、PSコントローラのデータの取得、ETX、ERXで書いたことを理解できてないと設定が難しいかもしれません。


赤外線リモコンの場合

  1. 赤外線リモコンのボタンをクリック
    Rz1basicdebugscreensnapz003
  2. 右クリックで、SIM REMOCON(n)を選択
    Rz1basicdebugscreensnapz004
  3. シミュレーション開始ボタンをクリック
    Rz1basicdebugscreensnapz005
  4. デモムービーです
    ※一時停止すると
    • 停止したところのソースが表示されます
    • 変数の値がソースの下のリストに表示されます
    ※ソースを書き換えた場合は、「■」の停止ボタンをクリックした後に、再生する必要があります。

ゲームパッドの場合

USBのPSコントローラーや、普通のPSコントローラーとパソコンを繋げるコネクタなど、インプットデバイスで、機体をコントロールできるようにしましたが、この機能を使ってシミュレーションすることができます。

今回は夢現工房さんのダウンロードのページにある「Template Plogram For GameCon(Version1.09 20070515)」を使っってみました。

  1. ゲームパッドの使い方の説明に従い、ゲームパッドの設定画面を表示、私の場合は以下の図の様に設定しました。
    あたりをよ〜く理解できていないと設定を作るのは難しいかも知れません。
    Rz1basicdebugscreensnapz006
  2. 設定が済んだら、シミュレーションにチェックを入れて、ゲームパッドコントロールをオン(開始)にします。
    Rz1basicdebugscreensnapz007
  3. シミュレーション開始ボタンをクリックします。※このプログラムはフリーの時(ボタンを押していない時)が、&hFFなので、先にゲームパッドコントロールをオンにしておかないと、ゼロとしてデータを受け取るので、勝手にロボットが動いてしまいます。
    Rz1basicdebugscreensnapz005
  4. デモムービーです。

   

Lcdのデータも表示されますので、デバグにご利用頂けるかもしれません。
Rz1basicdebugscreensnapz002

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

RZ1Basic v0.2.8 公開

Rz1bicon04

RZ1Basic v0.2.8を公開しました。

今回のメインの更新はコマンドリファレンスを新しくしました。高度な検索機能を付けた訳ではないのですが、勉強のためにSQLを使ってみました。

最新版のRZ1Basicはここからダウンロードできます。

更新内容

  • コマンドリファレンスを新しくした
    Rz1basicdebugscreensnapz001
  • 「行の移動」機能追加した
    Parallels_desktopscreensnapz002

    Parallels_desktopscreensnapz003
  • コントローラのウインドウに最小化とクローズのボタンを付けた
  • 「戻る/進む」で行がズレる不具合を修正した

《コマンドリファレンスについて》
Parallels_desktopscreensnapz004 これまでと同じくコマンドリファレンスの表示ボタンをクリックすれば、上の図で示しいたようなウインドウが開きます。データベースファイルは、

  • マイドキュメント(Windows)または書類(Macintosh)の中のMicono Utilitiesの中のRZ1の中のExplanationの中の 「ROBOBASIC_COMMAND.rsd」というファイルです。

「新規/編集/保存/削除」を行うとこのファイルが書き換えられます。オリジナルのデータに戻したい場合は、このファイルを捨ててから、もういちどコマンドリファレンスを開いて下さい。

以上です。

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

のらみみ

「のらみみ」という、TBSで毎週金曜日の夜中深夜2:25からやっているアニメがあります(公式サイト)。夜更かしな私は、2〜3回見たことがあります。

子どもたちが「キャラ」と一緒に過ごすことによって、様々な経験をし、大人への階段を一歩一歩のぼってゆく、笑いあり、感動あり、哀愁ありの物語で、今までにない不思議な気持ちにさせられる話なんですが、なんだか気に入ってます。

その中の、第3話の後編に「ぼくのスーパーロボ」で、9Bというキャラが出てきます。

登録No. 00065536
キャラタイプ:ロボット
名前
 アイアンギミック
 BBBBBBBBB(9B)

ストーリは、ちょっと記憶が薄れてあやふやな部分がありますが、9Bは、コタ郎くんと一緒に過ごすことになったのですが、すぐに壊れて動かなくなってしまったのです。居候(いそうろう)キャラ相談所の「ハローキッズ」に持って行くも、ロボットといってもキャラは生き物なのです。直(治?)せるものではないと言われてしまいます。9Bをすごく気に入っていたコタ郎君は自分で直そうとしますが、本当に壊れてしまった。泣く泣く9Bを河原に埋めようとしたら、偶然、以前、9Bを居候させていたというお兄さんに出会います。そのお兄さんは9Bがなぜ動かなくなったのか知っていました。メンテナンスモードになっていたのかな?メンテナンスモードを解除し、無事9Bは治ったのでした。そしてお兄さんは、その方法をコタ郎くんに教えてあげるのです。

第1〜3話のDVDが、2008年3月26日に出るみたい。欲しい。

エンディングテーマは、アマゾンじゃないけどiTunes Storeで買った。

原作コミックもあるよ。

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

RZ1Basic v0.2.7 公開

Rz1bicon04

RZ1Basic v0.2.7を公開しました。

今回のバージョンでは、前々から付けたかった条件コンパイルの機能を付けましたgood

最新版のRZ1Basicはここからダウンロードできます。

更新内容

  1. DIR, INIT, GYROSET, GYRODIR, GYROSENSE, POS, GETMOTORSET, ZEROにおいてもMOVEと同じように、モーター番号と名称を表示するようにした。Rz1basicdebugscreensnapz001

  2. ON...GOTOのラベル名の番号を表示するようにした。
    Rz1basicdebugscreensnapz002
  3. ON...GOTOのラベル名をOption(またはALT)+ダブルクリックで、ジャンプ先を表示できるようにした。
  4. シミュレーション画像の足の接地切換えのコマンドに対応
  5. 条件コンパイル機能を追加

《足の接地切換えコマンドについて》
シミュレーション画像の足の接地の切換えを行うコマンド

  • '<--FOOTGROUNDING RIGHT-->
  • '<--FOOTGROUNDING LEFT-->
  • '<--FOOTGROUNDING FREE-->

の3種類に対応しました。
これは、RZ1Actionと同じコマンドです。現バージョンのRZ1Basicでは、RZ1Actionのようにコードの再生に対応していませんので、上のコードが書かれている行にカーソルがあるか、選択されると、足の接地が切換えることくらいしかできません。ゆくゆくはRZ1Basicにも再生機能を付ける予定でいます。

《条件コンパイルについて》
条件付きコンパイルができるような仕組みを付けました。現バージョンでは関係演算子は使えないので簡単な条件しか作れませんが、デバグ時にコードを書いたり消したりするのが面倒な方は、お役立て頂ければと思います。

但し、この条件付きコンパイルの機能はroboBASICにはない機能です。ソースコードは、RZ1Basicだけで使えればいいという訳ではないので、ちょっとややこしい仕組みになっていますので、以下の例を参考にしてやってみて下さい

条件コンパイルのステートメントは、

  • '#IF
  • '#ELSEIF
  • '#ELSE
  • '#ENDIF

になります。どれも「'」を付けてコメントとしてます。

one

CONST STACKCHECK=1
....
....

'#IF STACKCHECK
'    sp=PEEK(&h04D5)
'    IF sp<&h0D02 OR sp>&h0E00 THEN
'        MUSIC "G"
'        END
'    ENDIF
'#ENDIF

  • STACKCHECKをCONSTで定義しますが、定義する場合は、条件コンパイルの文章が出てくる前に定義しておく必要があります。
  • STACKCHECK=0とするか、STACKCHECKそのものを定義しなければ、この部分はコンパイルされることはありません。
  • '#IFと'#ENDIFで挟まれた部分は、コメントにしておかないとroboBASICでコンパイルする場合、STACKCHECKの状態に関わらずコンパイルされてしまいますので、コメントにしておくのが無難だと思います。RZ1Basicのみでしかコンパイルしないというなら、コメントは外しても構いません。

two

'CONST SPEEDTEST01=1
CONST SPEEDTEST04=1
....
....
'#IF SPEEDTEST01
'    SPEED 1
'#ELSEIF SPEEDTEST04
'    SPEED 4
'#ELSE
    SPEED 7
'#ENDIF

  • SPEEDTEST01はコメントになっているので、'#ELSEIFのSPEEDTEST04の部分がコンパイルされます。'#ELSEIFの中も、例oneと同じ理由でコメントにしておいた方が無難だと思います。
  • '#ELSEを使う場合、'#ELSEの中は、どの条件にも関係ないという意味でしょうからコメントは外しておいて構わない(roboBASICでコンパイルする場合でも影響がない)ということになると思います。

その他:

  • 現バージョンでは、以下のような条件コンパイル文を入れ子(条件コンパイル文の中に条件コンパイル文を書く)にすることはできませんのでご注意下さい。

'#IF HOGEHOGE
    '#IF IREKO1
       'PRINT FORMAT(A,HEX,2)
    '#ELSEIF IREKO2
        '.....
        '.....
    '#ENDIF
'#ELSE
    ......
    ......
'#ENDIF

以上です。


| | コメント (10) | トラックバック (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を見てみることにしましょう。

このワイヤレスコントローラーのシステムでは、キーパッドやアナログスティックの状態、およびコントローラーの振動を、送信コマンドのETXを使ってコントロールします。ETXによって送信するデータは以下の表のような意味を持ちます。

Pagesscreensnapz012_2

例えば、右のアナログスティックの左右の傾け具合のデータを取得したいばあいは、"C"をETXコマンド使って送信すればいいことになります。

例:ETX 19200,"C"

ETXコマンドを実行すると、それに対応したデータをコントローラが送り返してきますので、ERXコマンドでそのデータを待ち受けます。

例:COUNTER=0
  MACHI_LOOP:
  COUNTER=COUNTER+1
  IF COUNTER>1000 THEN GOTO MAIN
  ERX 19200, KOTAE, MACHI_LOOP

その待ち受け方は上の様になります。この例の場合、送られてきたデータは、2つめの引数のKOTAEという変数に入ります。が、しかし、データがまだ送られてきてなかった場合は、3番目の引数のMACHI_LOOPにジャンプする仕組みになっています。これにより繰り返しERXコマンドを実行することができます。あと、うまく行くのか試していませんが、何らかの不具合により、データが得られない場合のための、ループを抜けるコードを入れてもいいかもしれませんね。

さて、前回、"A", "B"で得られるデジタルデータを調べたので、今回は、"C","D","E","F"で得られるアナログスティックの割り付けを図にしてみました。この図は「#?」が最終的に割り付けられた番号で、呼ばれるルーチン名をその下に書いてあります。

ON PSDT GOTO MAIN,key1ad,key2ad,key3ad,key4ad,key15,....

左のスティックは1の位に、右のスティックは10の位に割り付けられており、ON...GOTOを見てみると、左右のアナログスティックを同時に動かした場合のルーチンは何も割り付けられておらず、何もしないでMAINに戻るようです。さらに、右のスティックを斜めに倒した場合の、key50,60,70,80のルーチンは「GOTO MAIN」になっているようです。

Gamecon2


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

ROBOBASIC講座(5/10*4の答え)

先日「FOR...NEXT」の「算術演算子」ところで書いた問いに答えておきます。

問題は、以下です。

one a = 4 * 5 / 10
two a = 5 / 10 * 4

ここでは算術演算子に優先順位がないということもそうなんですが、あわせて割り算の結果は切り捨てであることを気に留めておいて頂きたいと思い、作った問題です。

まず、oneは、まず4x5のかけ算をして、a=20/10となります。次に20÷10でa=2になります。しかし、twoは、まず5÷10を行います。5÷10は、0.5でなく、四捨五入して1になるわけでもなくて、切り捨てて0になります。従って、a=0*4なので、a=0が答えです。

かけ算を先にやることによって、分子が分母割より大きくなるため、正しい答えになれます。

例えば、70点満点の試験を行って100点換算する場合(つまり百分率の計算)をする場合、なんとなく、

百分率(%)=(現在の数値÷その数値の最大値)X 100

という、百分率の公式?が頭にあるので、小数点を扱えない型を利用しているにも関わらず、うっかり、このまま計算してしまいがちです。この計算では全員が0点になってしまいます。

プログラミングの場合は、いつもいつも小数点を扱える型を使っているわけではないので、式を立てる時に、その辺を注意する癖を付けておくといいですね。



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

RZ1Basic v0.2.6 公開

Rz1bicon04

RZ1Basic v0.2.6を公開しました。

ファイルを開いた時のシンタックスのカラーリングの高速化、コマンドリファレンスの充実化、コンパイル時のエラーチェックの充実化あたりをやっていたのですが、対応できていないコマンドを見つけましたので、早急に更新しました。

更新内容

  • ジャイロ関連のコマンド(GYRODIR,GYROSET,GYROSENSE)に対応
    ※対応済みのつもりでしたsweat01
  • AIMOTOR関連のコマンドの不具合を修正
    ※AIMOTERとスペルミスしていたため、認識されていませんでしたsweat01
  • ゲームパッドを一度起動させると、その後、RZ1Basicを終了させるまでデバイスを占有していたのを、起動させてない時は解放するようにした

RZ1Basicはここからダウンロードできます。

《余談》

●ファイルを開いた時のシンタックスのカラーリングの高速化の為に、正規表現を使ってみました(使ってなかったのかsign02と言われそうsweat01)。土日を使ってやってみたのですが、全然速くなりませんでしたbearingむしろ正規表現を使わない方が早かったimpactやっぱ律速は色付けそのものかなぁ。。

●コマンドリファレンスを読んでしたら、"NOT"というのを見つけました。roboBASICで使ってみたのですが、コンパイルエラーが出てしまいます。NOTの書式お分かりになられる方いらっしゃいましたら教えて頂きますでしょうか?

●コマンドリファレンスをSQL系のデータベース化をして、もう少しまともにしようかと思っています。正規表現も、SQLも、っていうか、文字文字したの、っていうか、スクリプトっぽいプログラミングはどうも拒否反応しちゃって、自分で組んだ方がマシと思って避けてきましたsweat01けど、正規表現は今回だいぶマスターしたし、SQLも、こんなことでもなきゃ勉強しませんですからね。いい機会と思ってがんばろ〜

●これこそ余談ですが、iPodの空きがなくなってきた。
Itunesscreensnapz007
そろそろ買い替えなくてはいけないのだが、携帯も壊れそうでメール送信する時やネットに繋げるたびにハングアップしてしまうので、いつまでもつやらという感じだし、今月はRZ1Basicとか作っているコンパイラが期限切れるので更新にお金が掛かるしsweat01優先順位をよく考えてお金を使わなくてはsign01

今まで買ったiPodは9台。
iPodのモデル一覧)

  1. iPod (Scroll wheel) (5 GB) 白
  2. iPod (Click Wheel) (20 GB) 白
  3. iPod shuffle (512 MB) 白
  4. iPod mini (2nd generation) (4 GB) 緑
  5. iPod mini (2nd generation) (4 GB) 青
  6. iPod nano (2nd generation) (8 GB)  赤
  7. iPod (5th generation) (60 GB) 白
  8. iPod nano (3rd generation) (4 GB) シルバー
  9. iPod nano (3rd generation) (8 GB) シルバー

今、使っているのは、第5世代の60GB iPodで、音楽は10000曲程度にとどめているんですが、仕事のデータも、趣味のデータも、兎に角すべてのデータをiPodに入れて持ち歩いています(落としたらとんでもないことになるsweat01)。やっぱ、次、買う記念すべき?10台目のメインのiPodはiPod classic 160GBのシルバーになるんでしょうけど、iPodに合わせて、携帯とか、DSとか、PSPとか、全部白で揃えてきたのに、白のiPodがなくなってしまって残念ですdown

みなさんはiPod持ってますかsign02iPod持っている人、好きで〜すheart02sweat01

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

ROBOBASIC講座(テンプレートMAINループ その2)

以前、「ROBOBASIC講座(テンプレートMAINループ)」として、赤外線リモコン用のテンプレートのMAINループをフローチャートにしたものを紹介しましたが、今回は、PSワイヤレスリモコンとラジコン(RC)用のテンプレートのMAINループをフローチャートにしてみましたので載せておきます。今回のMAINループは、赤外線のものよりは簡単ですね。

PS用の方は、MAINループの中に、各ボタンのデジタルデータを取得するためのGOSUBルーチン(GOSUB PSGET)とアナログコントローラからのデータを取得するためのGOSUBルーチン(GOSUB ADGET)があり、それぞれ取得したデータに応じて、ON...GOTO....で各ルーチンへジャンプします。RC用はデータ取得と処理は1セットしかないので、さらに簡単ですね。

Template Plogram For GameCon(Version1.09 20070515).bas
のMAINループのフローチャート図

Template_plogram_for_gamecon

RC Tempate Program(Version 1.21 20060929).bas
のMAINループのフローチャート図
Rc_tempate_2

これらはMAINループは単純ですが、リモコンやプロポからのデータの受信およびアクションへの割り付けを行っているGOSUBルーチン内が、そこそこややこしいですね。今回はPSコントローラのデジタルデータを取得した後のアクションへの割り付けの辺りを見てみましょうsign01
と、その前に、ビット演算子について解説しておきます。

《代入(計算式)その2》
ビット演算子
には、「AND」、「OR」、「XOR」、「<<」、「>>」、「.」があります。ビット演算では、名前の通り、ビットごとの計算を行います。表で例の式をバイナリにして、つみ算のように縦に3つ並べてみました。バイナリですから、0と1なので、one「AND」、「OR」、「XOR」は、それぞれの桁を、理論演算子で解説したように計算します。two「<<」、「>>」は、それぞれの桁を、指定された数だけズラします。「<<」は、左へズラしますので、ひとつズラせば2倍に、2つズラせば4倍になり、「>>」は、その逆なので、ひとつズラせば2で割る、2つズラせば、4で割ることと同じ意味になります。最後にthree「.」で すが、数値をバイナリで表すと0と1なので、それぞれの桁を、デジタルデータのフラグ(オン/オフなど)として割り当てて利用する場合があります。例え ば、リモコンのボタン0〜7の8個のボタンがあったら、それぞれのボタンのオン/オフを、BYTE値のそれぞれの桁に割り当てるのです。その様な使い方を している場合、例えば5番目のボタンがオンなのかオフなのかを知りたい場合、n=a.5のような式で、5ビット目が、0ならば0に、1ならば1になるとい う演算子です。計算そのものは、例に書いた様に、その数だけ右にシフトして、1とANDを取る計算をしていますflair

Pagesscreensnapz013

ビット演算はたぶん普通には使わないので解りにくく感じるかもしれませんが、慣れてくるととっても有用なので、頑張って使いこなして下さいね。

《演算子の優先順位》

  1. 算術演算子・ビット演算子
  2. 関係演算子
  3. 理論演算子

それぞれの演算子の優先順位は上記のようになります。


【PSコントローラのデジタルデータの取得】
リモコンの受信機からのデータの取得は、ETX, ERXという送受信のコマンドを使って行います。ETX, ERXの説明はまたの機会にお話することにして、今回は受信したデジタルデータをどのように振り分けているかを見てみましょう(私はこのコントローラを持っている訳でないので、ほんとに正しいかどうかはわかりませんsweat01)。

Template Plogram For GameConではETX, ERXにより、Data0とData1にデータを取得した後、以下のようなコードが続きます。早速、今回解説したビット演算子の「ドット」を使ったコードですsign01

PS_left = Data1.7'1,0
PS_down
= Data1.6'1,1
PS_right
= Data1.5'1,2
PS_up
= Data1.4'1,3
PS_start
= Data1.3'1,4
PS_r3
= Data1.2'1,5
PS_l3
= Data1.1'1,6
PS_select
= Data1.0'1,7

PS_square = Data0.7'1,0
PS_cross
= Data0.6'1,1
PS_circle
= Data0.5'1,2
PS_triangle
= Data0.4'1,3
PS_r1
= Data0.3'1,4
PS_l1
= Data0.2'1,5
PS_r2
= Data0.1'1,6
PS_l2
= Data0.0'1,7

を図にしてみました。ドットの演算子で、それぞれのボタンのオンオフをそれぞれの変数に代入しています。さらにこの続きのコードは

Gamecon

以下のようになっているので、0の時がオン、1の時がオフなんだと分ります。IF文で、それぞれのボタンの番号をPSDT1とPSDT2に割り付けていきます。この際、PSDT2は10の位、PSDT1が1の位になるように割り付けて、足し算した結果が、ON...GOTOでの行き先の番号となります。

実際に私は使っていないのでよくわかりませんが、例えば、PSDT1が左手、PSDT2が右手という感じに割り当てると、分りやすいってことはないのかなぁ??

 

IF PS_l2 = 0 THEN
    PSDT1
= 5
ELSEIF PS_r2 = 0 THEN
    PSDT1
= 7
ELSEIF PS_l1 = 0 THEN
    PSDT1
= 6
.....

.....

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

« 2008年2月 | トップページ | 2008年4月 »