| G-Tune 2004FI SIPHA SYSTEM | ||||||

|
SIPHA CORE |
SIPHA CORE
ハードウェア
あまり変わり栄えしませんが、SIPHA
COREの回路図はこんな感じです。今回も例によってすべてソフトドライブで、サーボ制御に始まってR/C受信機取り込み、各種センサ取り込み、全部H8/3664でやることができました。後、いろいろありまして、サーボとの間には1.5KΩの抵抗が入っていますが、次回作る時は、多分、5KΩぐらいにしようと思っています。この件に関しては、現在、調査中で、またそのうちアップします。
SIPHA
COREのソフトウェア構成
これまたあまり変わり栄えしませんが、SIPHA
COREのソフトウェア構成はこんな感じです。マルチタスク風に書いてありますが、実際にはシングルタスク+割り込み処理です。ただ、こういうふうに整理して作ると、何かとメンテナンスとかチューニングがしやすいので、いつもこのように作っています。前回、完成し切れなかった部分が、ようやく完成しました(ついでに悪いところも見つけてしまったけど)。
センサ処理系を除くそれぞれのモジュールは、サーボ制御周期を基本として逐次呼び出すようになっています。ほら、サーボ補間計算とかって、次にサーボ制御信号を出す時までに計算すればいいですよね。また、Action Scirpt実行処理もそうです。で、センサとかR/C受信機処理を逐次行っているという感じでプログラムされています。
と、まあ、基本的なオペレーティングシステムをプログラムで構築しておき、後は、Action Scriptでなんとかするという形で実装しています。それだけに、今回は、さらにAction Scriptの機能を追加して、「距離センサ」、「電源電圧」、「加速度センサによる姿勢」、「変数」を扱えるようになっています。
気になるプログラムサイズですが、オプティマイズレベル2で25Kバイトほどです。まだまだ余裕がありますよ〜(これを余裕があるといっていいものかは疑問だけど…)。
制御方法概要
基本的にはサーボ制御周期である20msec(本当はもう少し速くして16msecぐらいにしたいんですが…)を基準として、R/C受信機パルス、各センサーの値の読み込みを行い、それに応じてAction
Scriptを実行するようになっています。それがグルグルまわっているだけです。今のところ、すべての動作はAction
Scriptによって設定しています。
1制御周期は、20msecで実行しており、サーボ制御信号出力フェイズと軌道計算フェイズに分かれています。サーボ制御信号は、TimerWの割り込みを使用して出力しています。また、プロポ入力はパルス値ですのでカウントする必要がありますが、これは、TimerVの0.128msecのカウントアップによって行っています。後で説明しますが、TimerVの割り込みとTimerWの割り込みが同時に発生すると、サーボの位置決めが狂いますので、TimerVの割り込みは、実際には軌道計算フェイズでしか使用していません。さらにこれにシリアルEEPROMの読み込みが入るわけですが、これは、読み込み中はプロポ入力信号の解析を中止して、読み込みを行っています。

|
SIPHA TERM |
ターミナル側は、今回、フリーの開発環境である、WideStudioにてグラフィカルなものを作りました。シリアル通信などは、WIN32APIでベタベタとコーディングしています(WideStudio+WIN32APIでどうやってシリアル通信処理をするかは、TSC16を見てください)。
また、SIPHA TERMでの、マシーンメンテナンスですが、
とう流れで行います。以下に、各画面の説明を入れますので、参考にしてください。
Main Function Window
SIPHA TERMを起動すると、まず、このウィンドウが表示されます。このウィンドウから、「計画設定」等を読み込み、SIPHA COREとの通信を開始します。「計画設定」には、動作フォルダ(ディレクトリ)とか、使用するCOMポート、サーボ定義等の情報があります。「電源電圧」が「77」ってなってますが…7.7Vの意味です。直すの忘れていました。
こだわったのが、「緊急停止」ボタン。これを押すと、即座に「サーボ制御信号」をすべてOFFにします。「うぉ、やべ!ど〜しよ〜!?」と思ったときにこれを押すと、「完全脱力状態」になります。ただし、アナログサーボ(+一部のデジタルサーボ)のみ有効な機能です。これは非常に便利ですので、ぜひつけましょう。
Servo Position Controller
SIPHA TERMの中で一番目立つ画面がこれです。サーボの位置をスライドバーによってコントロールするためのウィンドウです。ここでは、角度指示、及び脚ピッチ軸のXZ座標指示(画面の下のほう)を行います。この画面自身は、ただサーボを動かすだけです。また、背景、各パーツ位置は、「設定定義ファイル」にて設定可能になっています。
実は…指示することに割り切って作りすぎたせいか、後に説明するAction Script Managerとかで、Action Scriptを実行した後は、自動的に更新されません。このあたり、使いにくいので今後改良したいところです。結構、全体を長期間に渡って「ちま、ちま」と作っていったため、作りに統一性が無く、このあたりの改良が難しくなっています。これから、コードを整理しようと思っています。
Servo Position Recorder
地味な画面ですが、実は非常によく使う画面です。これは、先の「Servo Position Controller」で指示した角度値を記憶していく機能を持ちます。「Servo Position Contorller」で「ちょいちょい」とサーボ位置を調整し、このウィンドウで「位置追加」とやると、それが記憶されます。また、矢印ボタンを操作すると、その動作状態を1ステップ戻したりすることができ、再び、そこを修正したりすることができます。
そして、最後に、「Action Script 変換出力」をすると、「仮」のAction Scriptが出力されます。「仮」というのが、一応、そのままでも動作するのですが、動作時間とかが適当なデフォルト値が入っているので、そのあたり修正が必要ということです。
Action Script Manager
このウィンドウは、Action Scritpを管理するためのものです。Action Scriptは、パソコン側にテキストファイルで記述されており、これをSIPHA COREのRAMに転送したり、シリアルEEPROMに書き込んだりして実行しています。よって、「編集用のオリジナル」はSIPHA TERM側に、「最終的に実行されるもの」はSIPHA CORE側にあることになります。今までsシリアルEEPROMの中身が事故で消えたことはありませんが、消えても、SIPHA TERMから再書き込みするだけですので、悲しむことはありません。
Propo Operation Emulator
プロポ操作を真似るウィンドウです。SIPHA COREの方で、シリアル通信によって「プロポで指示されたのと同じ操作をする」機能がありますので、これに対してコマンドを送ります。これで、「操作系」のテストを行います。プロポを使わなくていいので、プロポの電池節約とか、電波が出せない場所でのテストに大活躍です。
Device Adjustment Inspector
各機器の調整をする(要は、角度変換とかなしで、サーボを直接操作するとか、CORE内部のデータを見るとか)画面です。実は、完成度が低くて「その時その時、必要な機能だけを、それっぽい枠にほおりこんだ」という感じでして…。これから、また整理していきたいと思っています。
Serial Communication Manager
シリアル通信ウィンドウ…になる予定だったのですが、ただのログウィンドウとなっています。当初、このウィンドウに他のウィンドウからいろいろ要求することにより、通信を行うという構想があったのですが、長期間に渡ってプログラムをしていた結果、「初心」を忘れてしまいました。で、だんだんバラバラになってしまい、現在に至ります。
|
Action Script |
すごい手抜きですが…Action Scriptも載せておきます。コマンド名とかちょっと変わっていますが、基本的には前回のものをブラシアップしたものです。
EXIT 終了 (Exit)
EXIT=
CLCK 待ちクロック設定 (Clock)
CLCK=n
n: クロック(サーボ制御周期の待つ回数)
PLST サーボ制御パルス設定 (Pulse Set)
PLST=s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s
s: ON、OFF、OF
RCRJ リモートレコードジャンプ (Remote Record Jump)
RCRJ=Stick, Stick, Stick, Stick, EqlJump, NeqJump
Stick: LOW,HGH,CNT,IGN (左縦、左横、右縦、右横の順)
EqlJump: 条件成立時レコードジャンプ(0の時は次のレコードへ)
NeqJump: 条件不成立時レコードジャンプ(0の時は次のレコードへ)
EXST 実行レベル設定 (Execution Level Set)
EXST=n
n: 実行レベル(Action Scriptを上書き実行するための
評価値で、0なら新しい要求があれば無条件に上書き
実行、1または2の場合は、実行中のレベルを越える
場合、上書き実行できる)
PBRJ プッシュボタンジャンプ (Push Button Record Jump)
PBRJ=n, EqlJump, NeqJump
n: プッシュボタン番号(0,1)
EqlJump: 条件成立時レコードジャンプ(0の時は次のレコードへ)
NeqJump: 条件不成立時レコードジャンプ(0の時は次のレコードへ)
LDST LED操作
LDST=n, s
n: LED番号(0のみ)
NIRJ レコード条件無しジャンプ (Non-if Record Jump)
NIRJ=n
n: レコード番号(1〜)
NIAJ アクションスクリプト条件無しジャンプ (Non-if Action Script Jump)
NIAJ=n:
n: アクションスクリプト番号(1〜)
VLOP 変数操作 (Value Operation)
VLOP=Cmnd, n, v
Cmnd: SET,INC,DEC
n: 変数番号(0〜)
v: 変数値
VLRJ 変数レコードジャンプ (Value Record Jump)
VLRJ=n, v, EqlJump, NeqJump
n: 変数番号(0〜)
v: 比較値
EqlJump: 条件成立時レコードジャンプ(0の時は次のレコードへ)
NeqJump: 条件不成立時レコードジャンプ(0の時は次のレコードへ)
VLAJ 変数アクションスクリプトジャンプ (Value Action Script Jump)
VLAJ=n, v, EqlAcsID, NeqAcsID
n: 変数番号(0〜)
v: 比較値
EqlAcsID: 一致時のジャンプ先(0は無視)
NeqAcsID: 不一致(0は無視)
PCRJ 姿勢状態 (Posture Condtion Case Branch by Record)
PCRJ=d, Dir0, Dir1
d: チェック方向 LGW:前後、SID:左右、ALL:全判定
Dir0: 前、または左検出時のジャンプ先レコード
Dir1: 後、または右検出時のジャンプ先レコード
※ALL時に倒れ判定が出た場合、Dir0のジャンプ先に移動
DSRJ 距離センサ (Distance Sensor)
DSRJ=l, d, GreaterJump, LowerJump
l: モード(BTO/LFT/RGT/BTA)
BTO どちらかが検査値以下ならFALSE(BOTH OR)
LFT 左センサ評価
RGT 右センサ評価
BTA 両方が検査値以下ならFLASE(BOTH AND)
d: 検査距離(0〜63)実際には遠いほど数値が小さい。また線形変化ではない。
GrJump: 検査距離以上の場合のジャンプ先レコード
LwJump: 検査距離未満の場合のジャンプ先レコード
PLRJ 電源電圧 (Power Level Record Jump)
PLRJ=n, SmallerJump, GreaterJump
n: 電源電圧*10
SmallerJump: しきい値未満レコードジャンプ(0の時は次のレコードへ)
GreaterJump: しきい値以上レコードジャンプ(0の時は次のレコードへ)
SCDG サーボ角度指定 (Servo Control by Degree)
SCDG=s, m, m, Clock, Degree
s: サーボ番号
m: 動作モード(SFT/LNR/HRD)
SCXZ サーボ座標指定 (Servo Control by XZ)
SCXZ=LegMode, m, m, Clock, X, Z
l: 脚モード(LFT/RGT)
m: 動作モード(SFT/LNR/HRD)
Clock: 動作クロック
X: X座標(mm)
Y: Y座標(mm)
Back to G-Tune 2004FI Index