「誰でもわかるマイコン入門」LX200コマンドその1
突然ですが、ブンブンさんのリクエストに答えて、「誰でもわかるマイコン入門」を一時復活し、LX200コマンドについて解説したいと思います。
LX200コマンドは、自動導入対応モータードライブを作るのに大切なコマンド体系です。これをマスターすれば、誰でも自動導入モータードライブが作れます。
前半は主にコマンドの説明、後半はmbedマイコンを使って、LX200コマンド解析機を作ってみたいと思います。
LX200コマンド自体は、テキストベースの簡単なコマンドで誰でも理解できます。しかし、実際に作ろうとすると、けっこう難しいところがあります。具体的には座標計算です。たとえば、赤経13hから12hに移動させる場合、1時間分なので、モーターを西に15度回転させればいいように思えますが、そう単純ではありません。モーターが動いている間にも星は動きますので、その分も考慮しなければなりません。そのへんの、実際に直面する問題にも解説をしていきます。
それでは、前置きはこのくらいにして、スタートです。
LX200コマンドとは
LX200コマンドはミードの望遠鏡を制御するためのコマンド体系です。このコマンド体系は仕様が公表されていますので、これを真似すれば、ミードの望遠鏡に対応した自動導入ソフトを使って、自分のシステムも制御できるわけです。
LX200コマンドは、RS232C通信(ボーレート9600bps)を使ってやり取りされます。RS232C通信はパソコンではすっかり影を潜めましたが、マイコンの世界では単純で分かりやすく、基本中の基本の通信方式となっています。
またLX200コマンドはテキストベースなので、つまり文字列なので、画面に"Hello, World"を表示するような感覚でプログラミングができ、非常にわかりやすくなっています。マイコン入門の題材にしても良いくらいです。
なお、LX200コマンドの正式な仕様書は、ぐぐれば、すぐ見つかるので、見ておいてください。
どんなコマンドがある?
LX200コマンドにはさまざまなものがあります。自動導入に必要なもの以外にも、オートフォーカサーが使うコマンドや、時刻や場所に関するものなどさまざまです。すべてのコマンドに対応する必要はありません。どのコマンドに対応すればよいかは、自動導入ソフトによって異なりますが、だいたい相場は決まっています。
したがって、本当に必要なコマンドのみ説明することとします。
ホストとコントローラ
自動導入ソフトがのったパソコンをホストを言います。いっぽう、モータードライブの方をコントローラといいます。
LX200コマンドは、ホストから、コントローラにコマンド(実際には文字列)を送ることによって成り立ちます。コマンドによっては、コントローラからホストに応答を返さないといけません。制御権はあくまでもホストの方にありますから、コントローラからホストの方へ何かを要求することはありません。一方向の命令体系です。
コマンドの実際
それではどのようなコマンドがあるか見ていきましょう。
:GR#
LX200コマンドはコロン(:)で始まり、シャープ(#)で終わるのが特徴です。大文字小文字は区別されます。このコマンドはもっとも基本的なコマンドで、ホストが、コントローラに対して、現在の赤経座標を知らせてくれという要求コマンドです。
したがって、コントローラはこのコマンドを受け取ったら、次のような文字列を返してやる必要があります。
12:34:56#
この例では、赤経12時34分56秒です。一般に次のような書式で文字列を返してやります。
HH:MM:SS#
なお、LX200コマンドでは低精度の座標もサポートしていて、低精度の座標では
HH:MM.T#
Tは、分の1/10になります。したがって、先ほどの12時34分56秒を低精度で表せば、
12:34.9#
となります。多くの自動導入ソフトに対応させるには、両方の書式に対応しておくのが望ましいです。
:GD#
このコマンドは、GRと同じく、現在の赤緯を返すコマンドです。たとえば赤緯12度34分56秒なら
+12*34'56#
となります。書式は次のようになります。
sDD*MM:SS#
sは符号で+か-です。赤道より北が+になるような座標です。南の場合はマイナスになります。
低精度の場合は次のような書式になります。
sDD*MM#
SSの部分がありません。
。
。
GR,GDコマンドの例でも分かるように、座標を管理するのはホスト側ではなく、コントローラ側になります。これはコントローラ側の負担の方が大きいことを意味します。
コントローラ側では座標は一周360度の角度で保存しておいた方が便利です。そして必要に応じて、赤経、赤緯の座標に直すようにします。
プログラム例
赤経軸の子午線からの角度をRaDegreeとします。(0~360度)、赤緯軸の赤道からの角度をDecDegreeとします。(-90度~+90度)
赤経座標への変換(コピペしてね)
=========================================================================
if (!strcmp(CommandBuffer, ":GR#")) {
int HH, MM, SS;
double d;
d = RaDegree;
if (d >= 360.0) {
d -= 360.0;
}
else if (d < 0) {
d += 360.0;
}
if (d >= 360.0 || d < 0) {
d = 180.0;
}
HH = d/15.0;
d = d - 15.0*HH;
MM = d*(60.0/15.0);
d = d - MM/4.0;
SS = d*(60.0*60.0/15.0);
if (Lx200Preci == 0) { //精度
printf("%02d:%02d:%02d#", HH, MM, SS);
}
else {
printf("%02d:%02d.%01d#", HH, MM, SS/6);
}
}
==========================================================================
赤緯座標への変換
==========================================================================
else if (!strcmp(CommandBuffer, ":GD#")) {
int sign, DD, MM, SS;
double d = DecBaseDegree;
if (d >=0) {
sign = '+';
}
else{
sign = '-';
d = -d;
}
DD = d;
d = d - DD;
MM = d*60.0;
d = d - MM/60.0;
SS = d*60.0*60.0;
if (Lx200Preci == 0) {
printf( "%c%02d*%02d\'%02d#", sign, DD, MM, SS);
}
else {
printf("%c%02d*%02d#", sign, DD, MM);
}
}
==========================================================================
GR/GDコマンドはホストから頻繁に送られてきます。200msに一回とか、そのような頻度です。自動導入で、GOTO命令を発行すると、カーソルが目標に向かって動きますが、それはコントローラ側のこのような計算によるものです。
座標の更新
コントローラが保持している天球上の角度(RaDegree、DecDegree)は、当然ですが、モータを動かせば値を更新しなければなりません。
RaDegreeとDecDegreeの値をどのような方法で更新するかは、モータードライブシステムによって異なります。
一番、正確な方法は、エンコーダー入力です。モーターがどれだけ回ったかではなく、実際にどれだけ赤道儀が動いたかを計測するのがエンコーダーです。赤道儀の手動にも対応できます。
ただ、エンコーダー搭載の赤道儀はそうそうあるものではありません。自作となると、負担が大きいです。
もう一つの方法はパルスを計測する方法です。モーターにどれだけパルスを送ったかを常に数えているのです。パルスモーターは回転角は正確にパルス数に比例しますので、パルスを計測すればモーターの回転角が分かります。
マイコンによっては、1パルス送るごとに割り込みが入るものもありますので、そのような割り込みを使ってパルスを計測します。
最後の方法は、時間を計測する方法です。モーターの回転速度(恒星時とか100倍とか)と動作時間が分かれば、そこから角度が計算できるはずです。
たとえば、1秒ごとにかかるタイマー割り込みの中で、 モーターの速度を対恒星時でV倍とすると、
RaDegree += (15.0/3600.0)*(V-1);
となります。Vは日周運動と同じ方向は+、逆は-になります。-1してあるのは日周運動分をキャンセルするためです。
この方法はあまり正確ではなく誤差も蓄積しますが、プログラム的には一番簡単な方法になります。
。
ちょっと長くなったので、今日はここまで。
| 固定リンク
コメント
ありがとうございます。まさか本当にやってくれるとは…
投稿: ブンブン | 2015年9月28日 (月) 15時16分
ありがとうございます。まさか本当にやってくれるとは…
投稿: ブンブン | 2015年9月28日 (月) 15時24分
ブンブンさん、
やりますよ~、やらなきゃ単なる嘘つきじゃないですか。
投稿: ほんまか | 2015年9月28日 (月) 19時23分
また記事と関係ないことですみませんが、とっさの思いつきと言うことで、許してください。カメラのアクセサリーシューにガイドカメラ一式を乗せてしまう、ということはどうなんでしょうか?軽いセットならいけそうな気がしたので。ss-oneショップのToupCamくらいのやつを想定しています。
投稿: ブンブン | 2015年9月30日 (水) 06時46分
ブンブンさん、
アクセサリシューは難しいでしょう。
しっかり固定はできないと思いますよ。
投稿: ほんまか | 2015年10月 1日 (木) 00時01分