LX200コマンド解説の2回目です。前回は、ホストからコントローラに現在の座標を問い合わせるコマンドを説明しました。
今日は、もうひとつ重要なコマンド、ホストからコントローラーに目標天体の座標を知らせるコマンドです。
座標を問い合わせるコマンドと目標天体の座標を知らせるコマンド、この2つのコマンドによって初めて自動導入が実現できます。
:Sr~~~#
このコマンドは、ターゲット天体の赤経座標をコントローラに送ります。書式はこのようになります。
:SrHH:MM:SS#
たとえば、赤経12h34m56sなら、
:Sr12:34:56#
となります。また低精度なら、次のような書式になります。
:SrHH:MM:T#
実際、プログラミングするときは、これらの文字列から数値に変換しなけれなりません。この時注意することは、ある程度柔軟性を持たせることです。たとえば、SrとHHの間に空白が入っていることを想定したり、区切り文字も':'コロンでないかもしれません。
いちおう、LX200コマンドでこれらの仕様は決まっていますが、ソフトによっては、かなり方言があり、きちきちに決めてしまうと、思わぬところでエラーが出てしまいます。
:Sr以降の文字列から角度に変換する関数を参考までに載せておきます。
=========================================================================
double GetLX200RaDegree(char *str)
{
int c;
int HH=0, MM=0, SS=0;
char buf[30];
while ((c = *str++) == ' ')
;
while (isdigit(c)) {
HH = HH*10 + c - '0';
c = *str++;
}
while (isdigit(c = *str++)) {
MM = MM*10 + c - '0';
}
if (Lx200Preci == 0) {
while (isdigit(c = *str++)) {
SS = SS*10 + c - '0';
}
}
else {
if (isdigit(c = *str++)) {
SS = 6*(c - '0');
}
}
return 15.0 * HH + (15.0/60.0) * MM + (15.0/3600.0) * SS;
}
========================================================================
なお、コントローラはこのコマンドを正常に受け取ったなら、ホストに文字
"1"
を返してやります。
例 fputc('1', fp);
それでは、次に、赤緯の同様のコマンドを紹介します。
:Sd~~~#
書式は
:SdsDD*MM:SS
低精度は
:SdsDD*MM
ここでsは符号です。
たとえば、赤緯+12°34'56"は
:Sd+12*34*56
となります。
:Sd以降の文字列から角度に変換する関数は、
========================================================================
double GetLX200DecDegree(char *str)
{
int c;
int DD=0, MM=0, SS=0;
int sign = 1;
char buf[30];
while ((c = *str++) == ' ')
;
if (c == '+') {
c = *str++;
}
else if (c == '-') {
sign = -1;
c = *str++;
}
while (isdigit(c)) {
DD = DD*10 + c - '0';
c = *str++;
}
while (isdigit(c = *str++)) {
MM = MM*10 + c - '0';
}
if (c != # && c != 0) {
while (isdigit(c = *str++)) {
SS = SS*10 + c - '0';
}
}
return sign * ((double)DD + MM/60.0 + SS/3600.0);
}
=========================================================================
これも同様に正常にこのコマンドを受け取ったなら、ホストに'1'を返してやります。
fputc('1', fp);
さて、Sr/Sdコマンドはコントローラに対して、目標天体の座標を伝えるだけで、コントローラはこれだけでは何もしません。
次にホストから送られてくるコマンドが重要なのです。
:CM#
このコマンドは、同期のコマンドです。現在の座標を直近のSr/Sdコマンドで送られた座標に一致させます。
なお、このコマンドを受け取ったら、目標天体の名前を返しますが、名称はわからないので、次のように返してやります。
printf(fp, "Unkown name#");
:MS#
このコマンドは、望遠鏡も目標天体に向けるコマンドです。目標天体の座標は、直近のSr/Sdコマンドで送られた値です。
このコマンドを受け取ったら、文字'0'をホストに返してやります。
fputc('0', fp);
赤経座標の引き算
赤道儀を目標の座標に向けるには、赤経角度(RaDegree)、赤緯角度(DecDegree)について、目標座標から現在座標を引き算してやらなければなりません。
現在の角度を、(RaDegree, DecDegree)とします。目標天体の角度を(TarRaDegree, TarDecDegree)とします。
赤道儀を目標天体に向けるためには、以下の引き算をして回転角度を求めなければなりません。
TarRaDegree - RaDegree
TarDecDegree - DecDegree
ただ、ここで注意が必要です。赤緯角度は普通に引き算すれば良いのですが、赤経座標は注意が必要です。
それは、引き算結果を-180°から180°の間にしなければなりません。0°から360°ではだめです。なぜだめかは理由を考えてみてください。
TarRaDegree-RaDegreeの計算結果を-180°から180°の範囲にするための引き算関数を参考までに載せておきます。
=========================================================================
double RaSub(double ToDegree, double FromDegree) {
double diff = ToDegree - FromDegree;
double abs;
double sign;
if (diff >= 0) {
abs = diff;
sign = 1.0;
}
else {
abs = -diff;
sign = -1.0;
}
if (abs > 180.0) {
return -1.0*sign*(360.0 - abs);
}
return diff;
}
=========================================================================
これで、赤経軸については、回転角度が計算できます。たとえば、10°という答えが得られたとします。しかし、モーターを10°回す間にも、星は動いていますから、その分も考慮しなければなりません。この問題についてはまたあとで、議論します。
。
さて、自動導入に最低限必要なコマンドを説明してきましたが、これだけでは、実際、自動導入ソフトと通信するとエラーが出ます。
最低限必要なコマンドをまだサポートしていないからです。
次回、最低限必要なコマンドを紹介します。
最近のコメント