« ケーブル地獄からの脱出 | トップページ | 黒部ダムに行ってきました。 »

2015年9月28日 (月)

「誰でもわかるマイコン入門」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分

コメントを書く



(ウェブ上には掲載しません)




« ケーブル地獄からの脱出 | トップページ | 黒部ダムに行ってきました。 »