9.システム・コントロールソフト:フリーソフト
ハードウエアと同様に星図等との連携のためにシステムコントロールソフトが必要ですが、現時点ではソフトを作成することは可能であってもあまり良い方法とは思えません。
というのも、自らシステムを設計し製作するには第一に時間が掛かりすぎることと、さらに制御仕様はいずれ標準的なものを選択し、その仕様に互換なソフトを作らなければあまり利用者メリットが無いなどの理由のためです。
最近ではフリーソフトといわれる星図ソフトの中には非常に出来の良いものがあり、制御仕様そのものも公開されており、ファームウエアが作成しやすく使いやすいという観点から、有用で完成度のあるものを選択してシステムコントロールアプリとする方がよいと考えることができます。
このため、EJAN赤道儀制御システムに搭載するファームウエアは、リンクするシステムコントロールソフトの仕様に合わせて新規に書き起こして搭載することになります。とりあえずコマンド仕様が公開されていれば作成も可能となり、ユーザとしてもシステムを受け入れやすく使用しやすいと考えます。
EJAN赤道儀制御システムのシステムコントロールアプリとして採用することにしたフリーソフトは Cartes du Ciel と Yoc の両ソフトウエアです。
また、市販のソフトしてはE-Zeusの開発にも参加された谷藤賢一氏のSuperStarやアストロアーツ社のステラナビゲータも選択肢として挙げておきます。
以下に各ソフトの特徴及びそれぞれのシステムコントロールアプリの仕様に合わせたEJAN赤道儀制御システムの開発秘話のような事柄も記述しておこうと思います。
9.1 Cartes du Ciel(SkyChart)
Cartes du Ciel(SkyChart)はフリーソフトとして開発が行われている星図ソフトですが、それと同時に望遠鏡のコントロールや天体を自動導入する機能などを持っている総合的なシステムになっています。
開発は Lazarus/FreePascalの環境において行われており、実行オブジェクトだけでなくソースファイルも公開されているのが特徴です。
また、各国の言語に対応できるようなシステム構成になっており、作成されたオブジェクトの実行時のプログラム文字表示を所定の定義ファイルを修正することにより変更できます。日本語表記も当然できるのですが、現執筆時点(2013/04)では、概ね日本語表示化は完了しているのでなかなか使い勝手がよいものになっていると思います。
更に、星図データはネット上からフリーで手に入るので、市販の星図ソフトに負けない非常に優れたソフトウエアであるとも感じます。
このソフトは現在も日々進化して新しいバージョンがリリースされたり、バクフィックスされたりしているので少しずつですが機能も高度になり、画面や使い勝手もバージョンが上がるたびに良くなっています。
Cartes du Ciel(SkyChart)V.3.4には、以下の望遠鏡の制御インターフェースが提供されています。
◆INDIドライバ ◆ASCOM ◆LX200 ◆手動装置
EJAN赤道儀制御システムは、このうちLX200コマンドをサポートするシステムとして設計されました。内情を話せばEJAN赤道儀制御システムを作成しようと思い立ったそもそもの要因は、自らのミードLX200-25システムが故障したことに端を発して、この赤道儀の修理が出来ないことによって必然的にコントロールシステムを作成しなれければならないことになったためです。
幸い、LX200コントロールコマンドはある意味、天体の自動導入におけるスタンダードシステムになっておりコマンド仕様が公開され、フリーソフトのCartes du Ciel においてもかなり前からLX200コマンドによる自動導入がサポートされています。
Cartes du Cielを選定した主な理由は、以下の条件を満足させることによります。
a.第一にフリーソフトで、開発が今も進展していること、
そして、オープンソースなシステムなこと・・
現在もユーザの要望により少しずつ機能強化され、星図関連に関しては日々のバグフィクスと機能拡張が少しずつ進んでいるようです。
ただし、望遠鏡の制御機能に関してはver.2から見ていますがあまり進展していないようです。
開発パッケージのバージョン2では望遠鏡のコントロールライブラリが外部ソースとしてリンクされており、バージョン3ではメインプロジェクトに組み入れられていましたが、ソースそのものは全く同じものが入っていましました。
このシステムの純正バージョンはE-ZEUSコマンドをサポートしていません。
そのため、私が提供するSkyChart V3.4は、新規にプログラムを書き起こしてE-ZEUSシステムでも天体の自動導入(GOTO)ができるように機能拡張しました。このようなことができることの意味合いがフリーソフトウエアの強みとも言えます。同時に、LX200システムでのバグを修正しています。
Cartes du Ciel(SkyChart)V3.4には、様々に望遠鏡の制御インターフェースが提供されており、以下のようなものがサポートされています。
◆INDIドライバ ◆ASCOM ◆LX200 ◆E-ZEUS ◆手動装置
b.LX200コマンドがサポートされた自動導入システム機能を持つこと
ミードのLX200システムは早くから天体の自動導入と自動追尾機能を持っており、かつ、制御コマンドが公開されたことから天体の導入システムの制御コマンドとしてアマチュアの間でもかなり使われていたようです。
このためにLX200望遠鏡の制御コマンドは天体の自動導入システムの事実上スタンダードコマンド仕様と言っても良いと思います。
c.日本語表記ができること(既にほぼ日本語化は完了された)
Cartes du Cielシステムの良さは、タイトル表記の言語体系とロジック処理とを論理的に分離させ多国化言語に対応していることです。
更に日本語表記を行わせるためにはタイトルとヘルプに関連するタグの入ったテキストファイルの内容を日本語に翻訳するだけで良いのです。
多くに国の言語でプログラム表記ができるのは非常に良いことで、ユーザが自国の言語表記でシステムを操作できることはシステムが普及するためにも必要なことと思われます。
d.使用ユーザが多いこと(日本だけではなく世界的に見ても)
システム開発者はヨーロッパ及び英語圏の人々を対象に作りはじめたようです。
しかし、このソフトウエアはシステム表記やヘルプの内容を多言語化して表示できるように設計されているので、これらを英文から自国語への翻訳データを用意するだけで表記が自国語に自動変換されます。
e.星図その他のシステム環境が豊富なこと
星図データは全てフリーのものが使えるので、環境の構築も容易で費用が掛かりません。
このような条件に合致するソフトが存在するのことで、私と同じような境遇のユーザのためにも使いやすく、比較的安い予算で自動導入システムが作成できるのではないかと思い、初めにこのシステムと対になるEJAN赤道儀制御システムの開発を決意したわけです。
このソフトが最もよい点はオープンソースであることです。これは、システム開発を行っているものにしか分からないことかもしれないけれど、往々にしてハードが絡むシステム開発というものにはアプリケーションとファーム(ハード側のROM化される制御ソフト)との間の通信に関わる不具合に悩まされることが多いのです。その様なときには相手側のソースが身近にあるということの意味合いは、オープン化された仕様書よりも更に有用なものとなることが多いものです。
9.2 Yoc-Yoshida Observatory Control System
Yocは、瀬戸口 貴司さん(注 0)が開発したE-ZEUS対応の天体の星図表示及び天体の自動導入システムです。
このアプリケーションを システム・コントロールソフトとして上位アプリに採用するきっかけは、E-ZEUSの記事そのものを以前から知っていたことによりますが、何よりも国内で開発されたソフトなので利用者も多いのではないかと思ったからなのです。
また、E-Zeus対応のアブケーションでは、フリーではないけれど優秀なシステムとして、SuperStar IV があります。このソフトウエアは様々なコマンドに対応しており、当然ながらE-ZEUSもその中のひとつとしてサポートされています。(注 1)
E-Zeusの開発は当初 月刊 天文ガイド誌の工作記事として星の自動導入と追尾ができる赤道儀で稼働するシステムとして企画され、E-Zeus開発プロジェクトが発足したようです。プロジェクトは以下の主要メンバーで進められたということです。
◆プロジェクトリーダー : 高槻幸弘氏
◆モータドライバ設計 : 外山保広氏
◆ソフトウエア開発 : 谷藤賢一氏(SuperStar IV)
: 瀬戸口貴司氏(YOC)
◆コントローラ設計 : 早水勉
日本のアマチュア天文家が、天文の普及と天文界の発展を第一の目的として作成したシステムであるとプロジェクトのホームページで謳われています。
このため、ハード設計及びソフトウエアの仕様が全て公開されていることは本当に有り難いことです。
プロジェクトのホームページによれば、システムの設計は以下を重点に設計されているということです。 (詳細な仕様はHPにて参照 http://www2.synapse.ne.jp/haya/zeus/zeus_tech.html )
<E-ZEUSの設計方針>
◆駆動はステッピングモータを用いる
・現状のステッピングモータバイポーラ型のものを使用しており、コントローラとステッピングモータドライバが別ボードで設計されているので、さまざまなコントローラが使用可能です。
当然のことながら、5相のステッピングモータの使用も可能なのですが、おそらくこの
ハード仕様を満たすドライバが存在しないので採用はできませんが、稼働そのものには問題がないと思われます。
◆制御はパソコンを使用する
望遠鏡の主要な操作をパソコン側のプログラム側で行うので、モータのドライバ側で行う処理は少なくなりますが、パソコン側のソフトウエアの処理が増すことと、処理の方法や機能も若干
異なることになります。
E-Zeusは主にパソコン側と赤道儀のモータ制御について規定した規格なので、ソフトウエア側の機能は開発者の設計し思想で異なることになるわけです。
・恒星時の計算や星の位置、座標等の情報処理は全てパソコン側のソフトウエアが処理を実行します。
・天体の導入や赤道儀の回転に関わるステッピングモータ制御データはモータのパルスカウントとして計算し、指示コマンドを送付することで行います。
◆パソコンが無い場合、マニュアル操作もできる
・ハンドボックスを接続することで、回転速度の調整や方向なとの制御ができます。
◆星の座標はステッピングモータのパルス数に置き換えてパソコン側が指定する
・ステッピングモータの回転数と方向はパソコン側のソフトウエアのコマンド指示で行います。
・パソコン側のソフトウエアは、コントローラからのステッピングモータの回転位置で画面更新を行います。つまり、 ステッピングモータの回転数で角度制御と座標変換を行っているわけです
Yocは私がLX200コマンド対応のEJAN赤道儀制御システムを作成した後、システムのチューニングを行うことを考えているときに存在を知ったソフトです。
LX200とCartes du Ciel は世界的にはポピュラーな存在であっても、必ずしも日本ではスタンダードとはいえないかもしれません。むしろE-Zeusを使う人の方が多い様な気がします。これはLX200やそのコマンドが使われていないというわけではなく、Cartes du Cielそのものを制御用に使う天文愛好家が少ないのではないかと思うのです。
というのも、Cartes du Cielでコントロールするための安くて良い制御システムが少ないのではないかと考えるのです。Cartes du Cielというのは望遠鏡を制御するというよりも星の座標をコントローラに対して指定をするプログラムの意味合いが強いので、コントローラ側の処理が多いのです。市販のFS2というコントローラなどの多くは回転と停止のコマンドのみを利用して動作していますから、制御方法はE-Zeusの考えと共通したところがあります。
E-Zeus版の開発ではLX200システムが稼働したことから、モータ駆動部分は大方流用が可能と考えて、主に通信処理部分を設計すればシステムは稼働する状況にありました。
というわけでE-Zeus版の開発を始めたのですが、モータコントロールのチューニング(加減速性能と一般化)を行うことを前提にシステム設計しようとしたために、実際には全ての設計を見直すことになってしまいました。
いずれにしても、甘い憶測とは裏腹にモータコントロールのチューニングを行うことは、結局のところはソースの再設計につながり、E-ZEUSシステムはフルスクラッチと同じことになってしまった訳ですが、その反面システム設計としてはより引き締まった良い設計になったのではないかと考えます。
EJAN赤道儀制御システム:E-ZEUS対応版は上記仕様に沿ってYocシステムとの間で通信を行い、天体の自動導入をサポートするものです。しかしながら、EJAN赤道儀制御システムのハードはE-ZEUSプロジェクト本来のものとは全く異なるのでシステム構成や機能そのものも若干異なることを予め明記しておきます。
また、純正(プロジェクトで設計された)ハードは私の個人的な主観なのですが、やや高度なハードにしすぎたような気がします。
コントロール部分の大方を上位アプリが行ってしまうE-ZEUSシステムでは、赤道儀側のファームが行うことは主にマニュアルコントローラ(ハンドボックスと呼んでいる)の制御とステッピングモータのパルス制御とカウンタ制御くらいなので、通常8ビットのマイクロコントローラ一つでも十分に制御できる位のボリュームであると思われます。
ただし、モータ制御に関しては加減速処理が大型赤道儀では特に重要になってくるので処理が重たくなるので、純正ハード処理ではこの点を重視した設計をしたのでしょう。(注2)
EJAN赤道儀制御システム:E-ZEUS対応版は、あくまでもE-ZEUS仕様の通信により天体が自動導入できるシステムですが、同一のハードを提供しようとするものではないということをご理解いただきたいと思います。
従って、現状ではマニュアルコントローラは提供されていないし、モータの加減速処理も十分とは言い難いということも明記しておきます。(注 3)
EJAN赤道儀制御システム:E-ZEUS対応版では、システムメンテナンスを容易にするためと様々なハード環境に対応するために、E-ZEUS仕様にない追加コマンドもサポートしています。
これらのコマンドは、システムのチューニングやメンテナンス用にサポートしているものなので、公式なものではないのですが、EJAN赤道儀制御システムではLX200版も含め共通のコマンド仕様にし、メンテナンスしやすくしています。
これらのコマンドについては、章を別に設けて詳細を記すことにします。
概要のみ記すと以下のようなコマンドがあります。
表 EJAN赤道儀制御システム の追加コマンド
<No> < 追加コマンド > < 機能 >
1 LCD ON/OFF LCDの表示とON/OFF制御を行う
2 ギア比設定 ハード的なギア比を設定する
3 ステップパルス設定 ステップパルス書き込み設定/読み出し設定
4 回転スピードの変更 高速、中速、低速のスピードの増加・減少
5 システム制御データ設定 システム制御データをEEPROMに設定
(注 0)瀬戸口 貴司様は、2015年1月にお亡くなりになられました。
同時に、YOCのホームページもクローズされてしまいました。そのため、残念ですがYOCをホームページから入手することができくなってしまいました。
(注 1)このシステム作成するにあたって Cartes du Ciel と同様のコマンドシーケンスにおけるトラブル(後述:これは私の理解不足も原因)が発生したとき、瀬戸口様には仕様等について多くのご指導を頂きました。
お忙しい中、当方のしつこい程の質問メイルに対して、毎回丁寧に快くご返事いただいて、本当に有り難く心強い手助けを頂いて、本当に人柄のよい方なのだと感心すると同時に嬉しくも感じた次第です。
SuperStar IV を作成された谷藤賢一さんにもシステムテスト用にプログラムの提供をして頂きましました。
(注 2)私はE-ZEUSシステムを使用したことがないので、利用中やシステムの販売 をしている業者様のホームページの内容からしかE-ZEUSのハードに関する情報を得られないので、実際のところE-ZEUSの加減速処理に関しては正しい評価ができないことを明記しておきます。
また、モータの加減速処理は8ビットマイクロコントローラにはやや重たい作業であることは、実際に作ってみて実感しているので特記させて頂きました。
ただし、ネット上でのE-ZEUSと SuperStarとで動作するビデオ映像をみたがやはりスムースな動作であることは間違いありません。
(注 3)本文執筆時点では加減速処理は出来ていなませんでしたが、2012/11/10以降では加減速処理はサポートされています。
ただし、EJAN赤道儀制御システムの加減速処理は、E-ZEUSシステムのようにハードウエアで行う到着予告(Pre-Arrive)パルスの考えではなく、ソフトウエアによるモータ回転の加・減速度の制御という考えで行っています。
ステッピングモータの加減速処理は詰まる所、ステップ割り込みの時間変化で行うのが正しいのでしょうが、ATmega328には16ビット割り込みが1つしかないのでそのようなことはできません。そのため、割り込みチックの遅延処理という固有の考え方で行っております。
EJAN赤道儀制御システムでは、総ステップ数とモータ回転の加・減速度の値により、モータを加・減速するステップ数が変化します。
ただし、現状ではハードによる加減速度の可変処理は行わないことにし、ソフトウエア拡張コマンドにて対応ということにします。
9.3 Super Star Ⅳ、Ⅴ
Super StarⅣ(注 )はE-ZEUSのソフト開発に携わった谷藤賢一氏によって作成された星図ソフトです。したがって、E-ZEUSとは非常に連携性の良いもので使用実績も多いようです。
Super StarⅣは、一般ユーザ向け機能として日付時間に沿ったその地方の星野を表示するプラネタリウムソフトと天文の愛好家向けに赤道儀を用いた天体の自動導入機能とが合わさったシステムです。Super StarⅣは画面の形態も操作法もYOCとは異なりますが、機能という点ではほぼ同じです。ただ、こちらはフリーソフトから出発して製作されていましたが、現在では製品として(12000円)として販売されている点が異なります。
現バージョンは天文愛好家向けとして、様々な天体の自動導入機能と追尾機能がサポートされています。特に、自動導入に関するサポートシステムが非常に多く、現在国内で稼働している自動導入システムのほぼ全てのコマンドがサポートされているといっても良いでしょう。
下表はSuper StarⅣで接続できる望遠鏡として一覧表示されるものですが、これらは望遠鏡の種別を示したものなので制御コマンドの種別ではないことに注意が必要です。
表 Super StarⅣ、Ⅴで接続可能な望遠鏡の一覧
<動作可能な望遠鏡> <動作可能な望遠鏡>
手動ナビゲーションIZANAI SHOWA ATRAS-Warp
SKY SENSOR 2000PC PENTAX
TEMMA-PC,JR,Ⅱ Sky Explorer
NexStar Sky Explorer EQ6Pro
NexStar i Sky Explorer Ⅱ
NexStar GPS E-ZEUS(Fork Ver.2.00)
NexStar GT,GTR E-ZEUS(Fork Ver.2.21)
CELESTRON CGE E-ZEUS Ver.2.00
Advanced GT E-ZEUS Ver.2.21
CELESTRON(Sky Align System) AGS Ver.2.21
CELESTRON(Sky Align System) IZANAMI for TEMMA-PC,JrⅡ
Meade LX-200 STAR BOOK Ver.1.01
Meade Autostar
Meade Autostar Ⅱ
蛇足ですが、EJAN赤道儀制御システムはこの表において、MeadeとE-ZEUSの機種を選択すれば良いことになります。これは、EJAN赤道儀制御システムが両機種の全コマンド処理をサポートしているからです。現時点でのEJAN赤道儀制御システムは、両コマンド体系毎に別々のコントローラ機種として製作されています。これは、開発システムのメインボードのシステムメモリの制約によるものですから、この問題さえ解決すれば全てのコマンド体系をサポートできるわけです。
(注)2015年9月現在、Super StarはVer.Ⅴにバージョンアップしました。
9.4 ステラナビゲータ 10
ステラナビゲータは(株)アストロアーツ社が販売している星図/望遠鏡制御ソフトです。このソフトは現在市販され使用されている一般的な天文機器の大方の機種に対応しています。Ejan赤道儀制御システムのコマンドはE-ZeusとLX200の二種ですが、ステラナビゲータはE-Zeusコマンドには対応していませんからLX200コマンドシステムについて動作確認テストを行ってみました。
ステラナビゲータとEjan赤道儀制御システムとの通信開始処理が正常に行なえるか否かのテストを行います。ステラナビゲータの観測(B)を押下して、メニューを表示してた後、望遠鏡コントロール(T)を選択すれば以下の画面が表示されます。
ここでコントローラが接続されていれば、COMポートが表示され、通信が可能なことが知らされます。メーカー(V)と望遠鏡(T)の種別を選択してから、接続(N)ボタンを選択するとコントローラとのLX200コマンド接続処理が開始されます。接続処理で何らかの不具合が発生した時はエラーを表すポップアップ画面が表示されます。また、LX200コマンド以外のコマンド体系の望遠鏡では当然のことながら接続はできませんから設座く不良の表示が出ます。正常な接続が開始されれば、星図の中の天体を指定し、同期、導入等の望遠鏡コントロール処理を行うことができます。コントローラとの接続テストの結果は、表 と表 に一覧表示されています。
蛇足ながら、ステラナビゲータはソフトの星図表示とコントローラ側の処理とのタイムラグを解消するために、LX200コマンドの望遠鏡座標取得コマンド(:GR#,:GD#)を0.2秒ごとに送信しています。このため、コマンドの受信とレスポンス処理の時間がかかり、コントローラのリソースに負荷がかかります。このときの、通信ボーレートは9600bpsですから、通信そのものにかかる時間が大きなウエイトを持つことになり、コントローラ側からすれば時間の無駄遣いということになります。通信ボーレートの設定はLX200コマンドにもある訳ですからできれば可変にしたいのですが、この点は現時点では架台としておきます。
10.EJAN赤道儀制御システム開発秘話
-苦しみの跡
以下に、EJAN赤道儀制御システムの開発において発生した様々な不具合の内の主要な事柄について、YOC E-Zeus対応版 及び Cartes du Ciel LX200対応版に分けて、それぞれの内容と対処法の内容を記述しておくことにします。
10.1 Cartes du Ciel(SkyChart)対応版-苦しみの跡
第一にCartes du Ciel LX200対応版において、コマンド通信による問題点とハードリセットに関して発生した問題について記述します。
10.1.1 Arduinoにおけるハード的な問題点
ファームウエアの開発ではハード的(USBやRS232Cの様)な通信タイミング処理も当然発生するが、それよりもむしろ通信仕様から発生するソフト的なコマンド処理のタイミングやコマンドシーケンスに関するものの方がより深刻でした。
というのも、Arduinoのように良く使われたハードというものは既にハード的な不具合が解消されているか又は明確に分かっているいるからです。Arduinoについては、データの入出力に関する部分はマイクロコントローラ自身が単独でも利用できる状態に設計されているので、あまり大きな問題は生じないように思います。
それでも、Arduinoには組み込みシステムでは致命的ともいえるリセット動作に関するハード的な問題点が存在することも事実なのです。これは、Arduinoの利点でもあり欠点でもあるともいえるハード仕様の一部です。
それは、リセットに入ったときの1~2秒程の間、一切の通信処理が出来なくなるという一見するとソフトウエアトラブルのように見えるわけですが、実は通信開始時のハード的な遅延に関する問題なのです。
Arduinoはファームの開発をしやすくするためにROMの上位部分にダウン(ブート)ローダが配置されており、このローダーはリセット信号が入ったときに初めに実行されるものとなっているのです。
要するにハードによるリセット直後にこのダウンローダは、Arduino開発システムからのダウンロードすべきプログラムの有無を検査し、プログラムがあればダウンロードを開始するというように作られているのです。
さらに言えば、リセット信号は通信制御信号( DTR信号 )と連動しており、ソフトウエアが通信を開始しようとするとポートをオープンすると同時にこの信号がLowになってリセットが入る仕組みなのです。このため、上位側アプリケーションにはArduinoがブートローダを実行し終わるまでの1~3秒程の通信待ち時間が生じることになるのです。
通常、ハードへの通信開始は上位側アプリケーションからみれば即座にオープン処理が終了し、機器の正常動作を確認するための何らかのコマンド送出を行った後、正しいレスポンスが返ることを確認して初めて通常のコントロール処理が開始となることが前提です。(注 3 参照)これは、上位側アプリケーションがコントローラとの間で通信を正常に開始しようするための確認動作ですから、方法は異なっていても正しい接続が開始されたか否かを問うために必要な操作として、特別にハード的な仕組みがないシステムでは必ず行われるものなのです。
そして、この通信処理に対して上位側アプリケーションは必ず何らかの固定的なレスポンス(返答となる文字列や制御コードなど)が所定の時間内に返答されることを要求しているのです。
上位側アプリケーションは、このコマンドレスポンスを所定時間内に正しく受け取った後に、システムが正常な接続を開始したと認めてそれに続く制御コマンドの通信処理を開始します。
ところが、実際のArduinoでは前述のリセット動作のために上位側アプリケーションはレスポンスを所定時間内に受け取れず、通信エラーが発生したとして把握してしまうのです。
更に問題だったのは、このリセットの問題が解決して開始処理のシーケンスが正常に行われるようになったとしても、その直後のコマンドレスポンス・エラーとなってシステム間の正常な接続が行われなかったことです。
こちらの問題の根本は Cartes du Ciel側の通信開始処理の内容が正式なコマンド仕様とは若干異なっていることにあり、その内容が仕様書だけでは想像が付かない内容(注 3参照)だったことです。
幸いにも、こうしたときオープンソースのシステムの良さは、このような不具合内容をソースの形で明確に示してくれるので、不具合を見つけるだけでなくその修正をも容易にできるところがよいのです。
同様にして、Arduinoのようなオープンハードのボードシステムは、前述のようなリセットに関する問題点についても同様なことがいえるのです。
Arduinoのリセット時の開始遅延に関しても回路図が明示されているので、対処の仕方も検討ができるのです。
前記の遅延に関する対応としては、当初 Cartes du Ciel側が機器接続のコマンドを送出する前に待ち時間(遅延2秒)を入れるいうソースの修正で解決したけれど、この起動時の待ち時間に対してはたとえ2秒間であっても良しとしないという人は多いものです。また、この修正は根本的に問題を解決するものではなく、一種の対処療法的な意味合いが強くあまり進められる方法ではありません。
更にこのアプリの修正は、Cartes du Cielがバージョンアップされる毎にプログラムに修正をかける必要があるという面倒な事態を引き起こすと同時に他のシステムではやはり受け入れられない方法なので、できる限り避けたい修正方法でもあります。
このような場合、ハード側で対処できることであればそれを行った方がメリットは多いものです。
というわけで公開されているArduinoのハード回路をよくよく検討してみたところ、回路を修正せずに容易に対処できる方法があることが分かったのです。(最近のArduinoボードではハードにより予め対応処置をしているものもあるのですが、このようなハード修正無しでも簡単に対処が出来る方法があるのです)
一般的に商業ベースのハードは回路図を公表しないクローズドなものです。これは自社のハード開発に対するコストが回路を作成する中に多く含まれているからで、会社の利益確保に対するコスト回収の権利保持という意味で当然の行為と思われます。
逆にオープンソース又はオープンハードと呼ばれるものは、複数の開発者がプロジェクトあるいはフォーラムと呼ばれる開発グループをつくって非営利的に開発を行い成果物を得るものです。
このようなかたちで得られた成果物は共有の理念に則って権利を独占しない又はさせないことが特徴ですから、当然のことながらプロジェクトで得られた成果物に関して特定な商業的権利を認めてはいません。
もちろん商業的な価値としては唯一著作権を保持することと、著作権等に基づいた名称などの使用権は保持する場合が多いのです。
これは、会社のクローズドな成果物の場合とは逆に、オープンで開発された成果物そのものを名称も含めて特定なユーザに独占使用させないCopyleft(コピーレフト)という概念沿っているためでもあります。
Arduinoの場合も例外ではなく、世の中には互換という名の下に様々なボート完成品やキットボードが発売されていますが、それらのボードには”Arduino”の名称は本家以外のボードでは使用することが許されてはいないのです。
いずれにしても、Arduinoは正式版であろうと互換品であろうと全く同じ機能であっも良いし、拡張された機能を有するものであってもかまいません。要するに、”Arduino”の名称だけは使えないけれども、ボードそのものを単独販売しても製品に組み込みとして使用したとしても、回路そのものには関しては商業的なロイヤリティの必要がないのが特徴です。
( 注 3)事実、Cartes du Cielは、赤緯取得コマンド(Dec'#:GD#')を出力しておりこのコマンドのレスポンスが正常か否かで機器接続の可否を判断しています。
赤道儀側のファームは前記のようにArduinoによるタイムラグ(だけでなくデータそのものが破棄される)があるので、このコマンドは受け取れずレスポンスはもちろん返さないことになり接続ができないことになってしまいました。この状況は、ハードをArduinoにした場合の話なので、通常はこのようなことにはなりません。より詳しくは、たとえハード仕様に問題がなくとも、Cartes du Ciel における機器接続処理では、赤緯取得コマンドを送出しているので通常接続はできません。
この開始処理の仕方は仕様上正しくなく、正式にはACKを待たなければならないような仕様になっている訳ですが、実際のLX200機種の中にはACKを返さないものがあるとのことでこのような操作記述になっているようです。
いずれにせよ、このような修正は既に稼働しているLX200等の機器に対しては有効であっても、新規に作成されるシステムにおいては不具合となりうるものです。
こういったことに起因する不具合はソース内容を見なければ分からないわけで、コマンド仕様を頼りに作成してるものにとっては致命的な不具合となりうるもののひとつなのです。
しかしながら、仕様上は不具合(バグ)というべきであっても、運用的にはこの修正に合わさなければならないのが、下位のコントローラソフトの宿命という訳なのです。
10.1.2 Arduinoの DTR信号 によるハードリセットの回避
前述のようにリセット信号はシリアル通信の通信制御信号( DTR信号 )と連動しており、ソフトウエアが通信を開始しようとしてシリアルポートをオープンすると同時にこの信号がLowになるためにリセットが入る仕組みなのです。そのため、Arduinoがブートローダを実行し終
わるまでの1~3秒程の上位アプリケーションに対する通信待ち時間が生じることになるのです。
DTR#(アクティブ・ロー)端子がアクティブ(Low)になってから、その状態が一定時間維持され、リセット端子(RESTE)の電圧値が閾値電圧を一定時間維持(2.5μs)されるとアクティブ(Low)状態になりシステムがリセットされます。
Arduino環境では、リセット後のファーム開始はブートローダの所定の位置からに決まっています。このブートローダの主な仕事はユーザプログラムを回線を介してロードし、フラッシュメモリに書き込むことです。もしも、書き込むプログラムが転送されてこないのならば、ブートローダは既に書き込まれているユーザプログラムの先頭から実行するようにします。このようなブートローダ処理のおかげで、特定なハードウエアがなくともユーザが作成したプログラムをArduinoのMCUにダウンロードできるということなのです。
通信制御信号( DTR信号 )によりハードリセットが起こり、かつコントーラ側が一定の時間何もできないように見えるのはこのブートローダの処理のためなのです。これは、Arduino環境では有用ですが、上位プログラムとの通信を行うファームウエアでは致命的です。
さて、それではどのようにして回避すればよいのでしょうか。その答えは、非常に簡単です。
<通信制御信号( DTR信号 )によるリセットの回避>
要はDTR信号がLowになってもリセット信号がLowに落ちなければいいのです。
リセット(RESET)端子は、ICSP(In Circuit Serial Programming)端子のピン番号5とFTDIチップからのDTR#端子とRTS#端子に繋がっています。DTR#端子とRTS#端子は共にアクティブ・ローなので、シリアル回線をオープンしデータを送ろうとするとこれらの端子はアクティブ(Low)状態になります。その結果、リセット(RESET)端子も同様にローになってハードリセットがかかります。(下図 を参照してください)
S1スイッチが押下されるか又はDTR#(アクティブ・ロー)端子がアクティブ(Low)になってその状態を一定時間維持されると、リセット端子(RESET)は電圧値がアクティブ(Low)状態になりになりシステムがリセットされます。
このとき、Arduinoシステムは新しいファームウエアのローディングを開始しようとしますが、所定の手順がなされない場合は、フラッシュ上のファームウエアの実行を開始します。つまり、この待ち時間の間は、上位パソコン側のアプリケーションは通信が開始できずにいます。通常のアプリケーションはこのとき何らかのコマンドやレスポンスをファームウエアが即座にかえすとして、それらを通信が正常に接続されるものとして待っています。
ファームウエアから期待するレスポンスが返ったときは正常な接続が完了したものとして次の処理に入りますが、一定時間内(又は即座に)正しいレスポンスが返らない時は接続エラーとして定常処理を停止します。
この場合、DTR#端子とRTS#端子は共にアクティブになってもリセット(RESET)端子がHighのままならば、シリアル通信は即座にそのまま続けられる訳です。好都合なことに ICSP端子は通常の処理には絶対使わないし、端子2に電源(表では5V)が入っていますから、この電源を端子5につないで電力供給を行えばよいということになります。
こうすることで、リセット(RESET)端子には常に電源電圧がかかりますし、リセットボタンも問題なく効きます。
ただし、このICSP端子はハンダ付けするのではなく、6ピンソケット(2×3)などでジャンパ回路を形成するようにすれば良いですが、次の様な留意点が必要です。
<リセットの回避処置のジャンパ使用時の留意点>
・プログラム開発時はファームウエアのダウンロードのためにジャンパを外す
・プログラム実行時はシリアル通信開始によるリセット回避のためにジャンパを付ける
10.1.3 コマンド解釈におけるソフト的な問題点
次にコマンド解釈による処理内容や手順に生じた問題点について記述します。
Cartes du CielのLX200制御でもミードの複数の機種制御に関する座標の送受信制御の部分でコマンド処理を簡略化している部分(注2)があり、データ変換に不具合が生じました。
Cartes du CielとYocとは星の追尾に関わる部分コマンド設計が全く異なります。
Yocは星の座標(赤経Ra、赤緯Dec)を赤道儀の基点位置からのステッピングモータのパルス数に換算し、そのパルス数をコントーラ側にコマンド(DVコマンド)で指示した後、コントローラ側で追尾更新された位置をパルスカウントの形態で取得するのです。
Cartes du Cielの場合は赤道儀側のコントローラに対して、星の座標(赤経Ra、赤緯Dec)をコマンドテキスト形式で与え、それ以後の星の導入と追尾制御の全てをコントローラに任せているのです。
また、Cartes du Cielは望遠鏡の追尾中の望遠鏡座標を星図表と同期させるために、コントローラに対して座標取得コマンドを送出し、そのレスポンスを取得することによって追尾位置を望遠鏡の座標データとして取得することにより、現位置の座標と地方時にあわせた星図表とともに表示しているということになります。
Cartes du Cielでの不具合は、この星の座標(赤経Ra、赤緯Dec)データの送信と受信処理そのものにあります。
LX200のコマンド仕様書を見ると分かるのですが、これらの仕様は大変良く錬られたものであり、各コマンドが独立して処理されるような仕様となっています。
それは、一つのコマンドは終端コード(’#’パウンドマーク)で区切られており、単独ラインで送っても複数ラインを同時に送付してもこの終端コードがあることで問題は生じないのです。
さらに、コマンド仕様の関係上一つのコマンドには、通常はレスポンスデータがあるわけですから、コマンドを正常に処理するためには正常なレスポンスデータの処理ができるようにっていなければなりません。つまり、コマンド送出とレスポンスデータの返りによる一種のハンドシェイクのような処理を行っているのです。
ところが、Cartes du Cielのコマンド処理の望遠鏡の座標の授受の処理において、座標取得のレスポンス(戻り値)が2つのコマンドが同時に返されるような固定フォーマット処理を行うようになっているのです。(注 4 コマンドの授受 を参照する)
つまり、望遠鏡の座標は星と同じようにテキスト情報で座標(赤経Ra,赤緯Dec)又は方位と高度(Az, Alt)データによって把握されるのですが、これらのデータ取得処理において赤道儀側のコントローラからのレスポンスデータを一つの文字列の様な固定フォーマットで処理をしているのです。のみならず、処理方法が統一されたているのならまだ良いのですが、そうではなくサポートされた時期・機種毎にバラバラなのです。
具体的に話すと、望遠鏡の座標取得(":Gr#",":Gd#")並びに望遠鏡の方位と高度取得コマンド(":GZ#",":GA#")の処理についてなのですが、Cartes du Ciel ではこれらの処理がLX200の機種毎に条件分けして書かれています。
その中で、LX200の処理に前述のような不具合があるのですが、EJAN赤道儀制御システムは、全ての機種についてサポートするつもりであるのでこれは容認できないことになるのです。
具体的には、望遠鏡の赤経(":GR#")と赤緯(":GD#")座標取得コマンドが1つのコマンド文字列("#:GR#:GD#")のコマンドとして出力され、同様に望遠鏡の方位(":GZ#")と高度(":GA#")取得コマンドが1つのコマンド文字列("#:GZ#:GA#")として送出されるのです。
このこと自体はコマンド処理そのものが最終的にはEJAN赤道儀制御システム側の処理として、仕様の範疇ですから何ら問題は生じないのですが、これらの2コマンドのレスポンスデータまで同一文字列のレスポンスとして”固定長”の処理を要求しているのには困惑しました。
レスポンスはあくまで個別に処理されなければならないのが仕様なのですから、レスポンスを2コマンド分同時に返すような固定長として処理することは一種の手抜きともいえるコーディングなのです。事実、Cartes du Ciel の処理において、他機種の処理ではこのようなコーディングをしていないことからもやはり手抜きということなのかもしれません。
というわけで、最も簡単でシステムの処理に影響を与えない様にソース修正を加えなくては成りません。
不具合の要因は、Cartes du Ciel側がコマンドレスポンスをきっちりと処理しておらず、2つのコマンドレスポンスを一つのコマンドレスポンスのように同時処理しようとすることにあるので、要するにレスポンスの取得が一回足りない訳ですから、その分のデータを取得して既存のデータに付加してやればよいことになります。
Cartes du CielのLX200コマンド処理はこのような要因で接続不可になるケースが多いと報告されているらしいのですが、これは当然帰結でつまりバグなのです。
いずれにしても、これらを作成した人々は望遠鏡制御については素人でしょうから仕方がないといわざるを得ないのですが、彼らはソフトウエア技術者としては一流ですから、LX200コマンド処理は星図を有効に使うおまけみたいなものと考えているのかもしれません。
10.1.4 Cartes du CielのLX200ライブラリの一部を修正
この不具合に対する具体的な修正について簡単に記すと、Cartes du Ciel のLX200ライブラリの一部を修正することになる訳ですが、次の2つの関数にステートメントを追加することで修正が完了します。(以下のステートメントは省略形で概要のみ記述)
<Cartes du Cielのソース修正>
//望遠鏡の座標取得(":Gr#",":Gd#")
Function LC200_QueryEQ(ver RA, DEC: double) :boolean;
//”GR#”,”GD#”コマンド出力
if WriteCom(LX200_port, buf, count) = false then exit;
count = 20;
if ReadCom(LX200_port, buf, count) = false then exit; //レスポンス
// -------------------追加ステートメント:start of add statement
buf1 = '';
if ReadCom(LX200_port, buf1, count) = false then exit;
buf := buf + buf1;
//------------------- 追加ステートメント :end of add statement
//ステートメントは省略形で概要記述
end ;
// 望遠鏡の方位(":GZ#")と高度(":GA#")
unction LC200_QueryAZ(ver AZ, AL: double) :boolean;
//”GZ#”,”GA#” コマンド出力
if WriteCom(LX200_port, buf, count) = false then exit;
count = 20;
if ReadCom(LX200_port, buf, count) = false then exit; //レスポンス
//------------------- 追加ステートメント:start of add statement
buf1 = '';
if ReadCom(LX200_port, buf1, count) = false then exit;
buf := buf + buf1;
//------------------- 追加ステートメント:end of add statement
//ステートメントは省略形で概要記述
end ;
( 注 4 )
表 に望遠鏡及び星の座標取得のコマンドとレスポンスの内容が示されています。
Cartes du Ciel ではこれらの設定コマンド(":SrHH:MM:SS#",":SdsDD'MM#")は主に赤道儀コントローラ側の処理なので不具合は常にコントローラ(EJAN側)に責任があることにな ってしまいます。
表 コマンドの授受 : 望遠鏡及び星の座標は以下のコマンドで行われる
<Cartes du Cielコマンド送出> <赤道儀レスポンス>
星の赤経Ra 設定コマンド :SrHH:MM:SS# <-----> '0' or '1'
星の赤緯Dec設定コマンド :SdsDD'MM# <-----> '0' or '1'
望遠鏡の赤経Ra 取得コマンド :Gr# <-----> "HH:MM.T" or "HH:MM:SS"
望遠鏡の赤緯Dec取得コマンド :Gd# <-----> "sDD'MM" or "sDD'MM'SS"
望遠鏡の方位Az 取得コマンド :GZ# <-----> "DDD'MM.T" or "DDD'MM'SS"
望遠鏡の高度Alt取得コマンド :GA# <-----> "sDD'MM" or "sDD'MM'SS"
しかし、座標取得コマンドの処理は Cartes du Ciel側に処理の主体があり、こちらに不具合が見つかった場合は、赤道儀側の開発者である私にとってやや厄介な状況が生まれてしまいます。
Cartes du Ciel側の不具合原因が特定されていれば赤道儀側でも対処は可能ですが、通常、このような場合はソースが無いために不具合の原因を特定することはかなり難しいものになるのです。真っ暗闇に投じられた小ものを手探りで探し当てることに等しい作業になってしまうのです。大方はこのような不具合に遭遇すると様々な通信実験を行ったり、通信データのモニタリングなどを行って情報を収集した後、不具合を類推することになるのです。
このような状況を避けるためにもオープンソースであることは非常に有意義なことでなのです。
いずれにしても、ブレイクポイントの設定とその時点での変数値が表示確認できるような良いデバッガでもあれば、これらの不具合はそれ程多くの労力を使わなくてもよいものであると思います。ソースを実行しながら実行状況を追うことで、双方にあるバグの特定が非常にしやすくなるのです。もちろん、ソースを読み解くことはそれ自体が面倒なことなのですが、何も情報が取得できない中でデバッグを続ける時の苛立ちやもどかしさに比べたら、こちらの方が遙かに容易なことなのです。
ついでに記すと、今回採用したArduinoは未だ開発途上の環境ですから、上記のようなデバッグ環境が整備されていません。確かに、様々なライブラリを使用すること でLEDを点灯するような簡単な処理や単一デバイスを操作することなどにおいては多く利点があります。
それでも、EJAN赤道機制御システムのような数千ステップにも及ぶものになると、プログラムの開発とデバックはそう簡単には行えません。というのも、ArduinoはプログラムデバッグはUSBポートを介して行うことが前提で、実機での動作をエミュレートするようなソフトウエアではないので、不具合は即暴走の要因となって状況判定が不能な状況に陥るのです。
唯一のデバッグ手段は自らのソースの中に次のステートメントを加えます。
改行無しのSerial.Print()文または改行ありのSerial.println()文をソースに入れておき、そのカレントデータ内容をシリアルモニタ(これは)に出力させて、動作状況とデータの内容を確認することだけです。
これは無いよりはましというくらいの機能であって、サンプルソースにあるような簡単なプログラムを作るくらいのデバッグに対する意識しかないことと同じです。とにかくArduinoはフリーなソフトウエアなのであって、元々簡単なハードを操作するようなシステムをより簡易で容易に楽しむ趣旨で作られたものですからあまり文句は言えません。それでも、プロジェクトは進展していますから、いずれより良いデバッグ環境が提供されるかもしれません。
いずれにしても、大きなソースプログラムのデバッグは本当に大変ですから、EJAN赤道機制御システムをより発展させるためには、統合デバッグ環境のあるAVRまたはARMシステムなどにシステム移行することを検討しなければならないかもしれません。
幸い、ArduinoはCやC++をべースに作成され、コンパイル時にCのソースに展開される様なのでAVR StudioなどのC環境とは相性が良いことが救いです。
10.2 Yoc 対応版-苦しみの跡
10.2.1 Arduinoにおけるハード的な問題点
Yoc(Yoshida Observatory Control System)との通信においてハード的な問題となったことは、Cartes du Cielの場合と同様でArduinoのブートローダ絡みのものなので内容は全く同じです。
従って、対処法は前章までに記しておいたのでここでは特に記述しないですが、要するに通信開始にタイムアウトエラーがでてYocは処理やめてしまいます。これは、Yocとしては全くの正常な処理状態なのですが、同様にしてハード側は、リセット処理をしてコマンド待ちに入っている状態なのです。
10.2.2 コマンド解釈におけるソフト的な問題点
Cartes du CielにおけるLX200コマンドとE-Zeusコマンドとの最も大きな相違は、コマンドの終了を表す”終端コード”という概念の有無です。
もちろん個々のコマンドの仕様が異なることは当然のことなので、要はコマンドラインに関する考え方の相違と言うべきなのかもしれません。
Cartes du Cielでは、コマンドラインの終わりを表すコード(これを終端コードといい'#' : pound mark)が定義されています。
このためコマンドが複数同時に届いてもコマンド区切りがはっきりしているので、コマンド処理は非常に明瞭です。
しかし、E-Zeusには終端コードの考えが無い(というか、特に記述がない)ので、コマンドの終了が分かりません。
このため、私の開発システムがwindowsであることと、開発言語がCベースであることから、コマンド文字列はCR+LF('\r\n')で終わるものと考えていましました。
通常、コマンドとしてのテキスト(文字列)は、改行コードを終端コードとして使用する場合が多く、次の3パターンのコードが付けられるものと考えられます。
・ CR('\r')のみ、 : MacOS (ただし、バージョン9まで)
・ LF('\n')のみ、 : UNIX, Linux
・ CR+LF('\r\n') : Windows, MS-DOS
テキストの終端コードは、使用しているパソコンのシステムに依存する訳で固定的なものではありません。プログラム開発言語における仕様と共にオペレーティングシステムとの兼ね合いでき
まるものなのです。ところが、実際に通信をしてみるとコントロール側がうまく動かないのです。
このときはまだ、後述のYoc <--> E-Zeus通信記録を取る仕組みを追加していなかったので苦労する羽目になってしまいました。
幸い、何回かの瀬戸口様とのメイルのやりとりで、”Yoc からのコマンドにはCR('\r')のみが付加されてコマンドが送付されている”と教えて頂いたおかげでこの問題は一気に解決することになったのです。 (瀬戸口様からのメイルで教えて頂いて確認した)
ただし、コントローラ側からYocへのレスポンスには、CR+LF('\r\n')の形式で返答を返しているのですが、それでもYoc側は問題ないようです。
(余談 1)
余談ですが、ArduinoシステムはCベースで開発できる大変分かり易いシステムですが、前述のように唯一の欠点はデバッグ機能(実際にはない)が非常に貧弱であることです。
デバッガがしっかりしていれば、このようなトラブルは直ぐに解決していたと思われます。あくまでも私感ですが、Arduinoはごく小さなプログラム開発には向いていますが、大きなプログラムではデバッグに苦労するのであまり良い開発環境とはいえないようです。
現状でも、LX200対応版は既にシステムのサイズが32K(すでに超えた)バイトに迫っ
ており、これ以上機能拡張ができないので、ATmega328を使用するArduino
ボードでの開発は限界に達しています。
ボード性能的には何ら問題が生じていませんし、速度的にも望遠鏡の制御に支障は生じていませんが、今後の開発を考えた場合にArduino Megaボートに移行するか、あるいは他のボードに移行するのかを検討しなければなりません。
EJAN赤道儀制御システムの場合は、自作や赤道儀のレストアを考慮しているとは言っても全てのユーザがソフトの内容やハードボードを理解する必要がないわけですから、この際、ARMベースのLPCcappuccinoポートあたりをターゲットにしてトライしてみるのもよいのかもしれませんね。
10.2.3 Yocとの接続において : 通信モニタ機能を作成してみる
Yoc <--> E-Zeus通信記録は、YocとEJAN赤道儀制御システム:E-ZEUS対応版との間で行われた通信記録です。
通信はパソコン側のYocとソフトウエア・シリアルが追加されている一台目のE-ZEUS1 間で行われた通信をフックして、同じくソフトウエア・シリアルが追加されかつクロス接続された二台目のE-ZEUS2に転送することで行われます。
E-ZEUS2はPC側のUSBポートを介してRS-232C通信ソフトに接続されているので、最終的にはこの通信ソフトの受信データとしてYocからのコマンドが取得できるのです。
ちなみに、このソフトウエア・シリアルは EJAN赤道儀制御システムのハンドコントローラ接続における通信処理ラインに応用することを念頭にこの接続テストをした訳です。
これらの通信はやや複雑なので以下に接続方法を含め若干の記述をしておくことにします。
まず、E-ZEUSシステムに NewSoftSerialライブラリを追加し、コマンド授受のためのルーチンを追加作成します。
予め送受信ポート(送信 PIN 8,受信 PIN 7 ピン番号は任意 )を設定しておき、以下の手順でソフトウエア・シリアル本を接続してデータの取得を行います。
1.E-Zeus1:YOCとE-ZEUSをシリアル(USB)で接続します。
◆E-Zeus1の送信ピン(PIN8)に対してYOCからの送信データをそのまま出力します。
◆E-Zeus2:2台目はRS323CモニタソフトとE-ZEUS2をシリアル(USB)で接続します。
◆E-Zeus1の送信線(PIN 8から)をE-ZEUS2の受信ピン(PIN 7)にクロス接続します。
◆E-Zeus2の送信線(PIN 8から)をE-ZEUS1の受信ピン(PIN 7)にクロス接続します。
◆E-Zeus1からデータを受信したら、E-Zeus2のシリアルにそのまま出力します。
これにより、E-ZEUS1からのデータはRS323Cモニタソフトの受信データとしてモニタリングできます。
◆E-Zeus2からデータを受信したら、E-Zeus1のシリアルにそのまま出力するようにすると、E-Zeus2からのデータはE-Zeus1の受信コマンドデータとしてモニタリングできます。
2.E-Zeus1及びE-Zeus2の電源をいれる
RS323Cモニタソフトを立ち上げて、COM(システムにより異なる)でE-Zeus2との通信を確立させておきます。
◆YOCを立ち上げて、COM5(システムにより異なるがYOCはCOM5が最大com番号のようだ)で通信を確立します。
◆YOCが立ち上がると、E-Zeus1側のRS323Cソフトの受信データ欄にYOCからE-Zeus1への通信データがモニタされます。
3.稼働中の受信データはファイルに保存されます。
ファイル名は、"COM" + "ポート番号"+"日付”RS232CRcv.txt 型式である
ディレクトリ: RS232C\BACKUP\
ファイル例 :
(前頁受信データファイル) COM8_2012_4_27_16_31_BakRS232CRcv.txt
(送信データファイル) COM8_2012_4_27_16_31_BakRS232CSnd.txt
使用したRS323Cモニタソフトでは、受信データははテキスト形式でシステムの終了時にファイルに書き出されます。
4.E-ZEUS2の送信ポートから特定なコマンドを出力すれば、
外部コントローラからの命令と して処理させることができる
ハンドコントローラのプログラムテストにシステムが使用できることになります。
上記通信モニタ機能によってYoc <--> E-Zeus間の通信記録雅趣得されたので、以下に内容を提示します。
通信記録は、YOCとE-ZEUS1とが接続された時点からのものです。
従って、この通信記録はYOCのE-ZEUSに対する開始シーケンスそのものを表していることに注意することが重要です。
ここで、E-ZEUS1はYOCと接続され、E-ZEUS2はRS232Cモニタプログラムに接続されています。
次表の記述で、YOCとあるのはYOCにおけるプロラム操作の内容を表し、E-ZEUSコマンドとあるのは実際に出力されたデータの内容です。
コマンド内容とあるのは、E-ZEUSコマンドの内容を分かりやすいようにコメントとして付加表記しました。
表 YOCを操作したときのYOCとE-Zeus間の通信記録
《 YOC 》 -> 《 E-ZEUS通信記録 》
〔YOC上の操作 設定〕-> E-ZEUSコマンド 〔コ マ ン ド 内 容〕
COM8でE-ZEUSに接続 RD#0007BB85#0007BB85 周回(1日当り)ステップ数設定
PA#00#00 到着予告ステップ数の設定
ST E-ZEUS状態の返信要求
DVRAF1 RAを恒星追尾速度で連続稼働
GP 約1秒間隔でモータステップ数要求
天体指定し同期設定 GP 約1秒間隔でモータステップ数要求
約1秒間隔でモータステップ数要求
無操作 GP 約1秒間隔でモータステップ数要求
無操作 GP 約1秒間隔でモータステップ数要求
無操作 GP 約1秒間隔でモータステップ数要求
無操作 GP 約1秒間隔でモータステップ数要求
無操作 GP 約1秒間隔でモータステップ数要求
天体指定し移動ボタン押下 DVRAF3#00001A8A RA中速"#00001A8A"連続稼働
無操作 DVDCF3#00002AAA DEC中速"#00002AAA"連続稼働
ST E-ZEUS状態の返信要求
GP モータステップ数要求
ST E-ZEUS状態要求
GP モータステップ数要求
SP1 恒星時運転に移行(スリュー停止)
GP モータステップ数要求
無操作 GP モータステップ数要求
移動:RA"中速"正回転押下 DVRAF3 RAモータを中速連続正回転
GP モータステップ数要求
移動:RA"中速"正回転解除 SP1 恒星時運転移行(スリュー停止)
GP モータステップ数要求
移動:RA"中速"逆回転押 下 DVRAR3 RAモータを中速連続的逆回転
移動:RA"中速"正回転解除 SP1 恒星時運転移行(スリュー停止)
GP モータステップ数要求
移動:DEC"中速"正回転押下 DVDCF3 DECモータを中速連続的正回転
GP モータステップ数要求
移動:DEC"中速"正回転解除 SP1 恒星時運転移行(スリュー停止)
GP モータステップ数要求
移動:DEC"中速"逆回転押下 DVDCR3 DECモータを中速連続的逆回転
移動:DEC"中速"正回転解除 SP1 恒星時運転移行(スリュー停止)
無操作 GP 約1秒間隔でモータステップ数要求
無操作 GP 約1秒間隔でモータステップ数要求
移動:RA"高速"正回転押下 DVRAF4 RAモータ最速連続的に正回転
移動:RA"高速"正回転解除 SP1 恒星時運転に移行(スリュー停止)
無操作 GP モータステップ数要求
移動:RA"高速"逆回転押下 DVRAR4 RAモータを最速連続的に逆回転
移動:RA"高速"逆回転解除 SP1 恒星時運転に移行(スリュー停止)
無操作 GP モータステップ数要求
移動:DEC"高速"正回転押下 DVDCF4 DECモータ最速連続的に正回転
移動:DEC"高速"正回転解除 SP1 恒星時運転に移行(スリュー停止)
無操作 GP モータステップ数要求
移動:DEC"高速"逆回転押下 DVDCR4 DECモータ最速連続的に逆回転
移動:EC"高速"逆回転解除 SP1 恒星時運転に移行(スリュー停止)
無操作 GP 約1秒間隔でモータステップ数要求
無操作 GP 約1間隔でモータステップ数要求
処理終了 SP0 モータの停止要求
10.3 SUPER STAR Ⅳ対応版-苦しみの跡
SUPER STAR Ⅳは、様々な望遠鏡システムのコマンド体系に対応しているソフトウエアなので、EJAN赤道儀制御システムの個々の機器種別で通信テストを行わなくてはなりません。ここでは、E-ZEUSコマンド体系の処理テストに関する事柄について記述していきます。
SUPER STAR Ⅳで制御できるE-ZEUSシステムは以下に示す5種類の望遠鏡が有ります。
表 SUPER STAR Ⅳで接続可能な望遠鏡
< 接続できる望遠鏡 >
E-ZEUS(Fork Ver.2.00)
E-ZEUS(Fork Ver.2.21)
E-ZEUS Ver.2.00
E-ZEUS Ver.2.21
AGS Ver.2.21
この望遠鏡の種別はSUPER STAR Ⅳ側から見たものであり、E-ZEUSではコントローラ側からは何ら相違を見出せませんのでどれを選択してもかまいません。
10.3.1 SUPER STAR ⅣにおけるDVコマンドの動作不良
SUPER STAR Ⅳにおける動作確認は、製作中のEJAN赤道儀コントローラがYOC上で正常に動作することを確認した後に行われました。Arduinoの場合はソフトシリアル機能を応用してYOCのモニタリングを行いましたが、LPCcappuccinoの場合にはこの機能がないので基板上に設置されたLCDの表示機能を利用してコマンド情報の確認を行います。この場合には、送出されたコマンドをそのままLCD上に表するので、指定ステップ数の回転要求を行うDVコマンドの場合は、コマンド表示が表示行欄いっぱいになることと、表示時間が短いなどという欠点が有ります。
E-ZEUSにおける望遠鏡の動作は、次ページの”表 SUPER STAR ⅣとYOCの操作ボタンと発行コマンドの内容”で示す通り、回転動作を要求する”DV”コマンドとコントローラの状態を要求する”ST”コマンドなどで構成されています。
具体的な操作ボタンに対する出力コマンドが示されていますから、この操作ボタンの内で右ボタンに対するコマンドの内容を見てみましょう。
図 YOCの操作ボタンの形態
<YOCの移動ボタン>
このコマンド表で操作内容が”ボタンの押下”と表されているもの横欄は、当該ボタンを押したときにコントローラに送られるコマンドの内容が示され、”ボタンを離す”と表されているのはボタン押下後にボタンを解放したときに出されるコマンドがそれぞれ示されています。これらの発行コマンドの内容は、実際にコントローラに送出された実データのままをLCD表示デバイスで内容を表示確認して得たものです。
表 を見る限り、手動での回転動作を要求する”DV”コマンドにおいて、SUPER STAR Ⅳは、要求する回転速度から恒星時運転又は停止するときに、所定時間をおいて順次低速回転に移行するように複数のコマンドを出力して減速処理をしていますが、YOCの場合にはそのような減速処理を行わず直ちに恒星時運転又は停止に移行する様なコマンドを送出していることが異なるだけです。つまり、処理内要求の内容的意味合いは同じとなりますから、望遠鏡の処理結果はほぼ同じようになります。
停止コマンドではコマンド内容そのものは全く同じものになっています。
導入コマンドにおいてはコマンド内容そのものが両者で若干異なっていることがおわかりでしょうか。この導入コマンドの仕様からするとYOCが正しいのであり、SUPER STAR Ⅳの方は先頭部分にゴミ(ゼロ’0’)が付加していることが分かります。このため、EJAN赤道儀コントローラはYOCでは正常に処理を開始していましたが、SUPER STAR Ⅳではコマンド不良としてレスポンスを返していました。
この場合、先頭部分にゴミ(ゼロ’0’)がなければ何も問題はないのですが、EJAN赤道儀コントローラとしては正しいフォーマットでコマンドが送られてくるものとして処理プログラムが書かれていました。このため、SUPER STAR Ⅳでは通信異常が発生したものとしてのエラー処理を行い、コントローラ側は何の処理も行わなかったのです。
表 SUPER STAR ⅣとYOCの操作ボタンと発行コマンドの内容
[ 操作の内容 ] [ SUPER STAR Ⅳ ] [ YOC ]
< 発行コマンド> < コマンド処理の内容> <発行コマンド>
<ボタンの押下>
ST E-ZEUS状態要求コマンド
0VRAF4 赤経RAモータ正転最速連続駆動 DVRAF4
<ボタンを離す>
DVRAF3 赤経RAモータ正転中速連続駆動 SP1
DVRAF2 赤経RAモータ正転低速連続駆動
DVRAF1 赤経RAモータ正転恒星時連続駆動
<ボタンの押下>
ST E-ZEUS状態要求コマンド
0DVRAR4 赤経RAモータ逆転最速連続駆動 DVRAR4
<ボタンを離す>
DVRAR3 赤経RAモータ逆転中速連続駆動 SP1
DVRAR2 赤経RAモータ逆転低速連続駆動
DVRAR1 赤経RAモータ正転恒星時連続駆動
<ボタンの押下>
ST E-ZEUS状態要求コマンド
0DVDCF4 赤緯DECモータ正転最速連続駆動 DVDCF4
<ボタンを離す>
DVDCF3 赤緯DECモータ正転中速連続駆動 SP1
DVDCF2 赤緯DECモータ正転低速連続駆動
DVDCF0 赤緯DECモータ正転恒星時駆動停止
<ボタンの押下>
ST E-ZEUS状態要求コマンド
0DVDCR4 赤緯DECモータ逆転最速連続駆動 DVDCR4
<ボタンを離す>
DVDCR3 赤緯DECモータ逆転中速連続駆動 SP1
DVDCR2 赤緯DECモータ逆転低速連続駆動
DVDCR0 赤緯DECモータ正転恒星時駆動停止
[ 停止] <ボタンの押下>
SP1 恒星時運転を行う SP1
[導入 ] <ボタンの押下>
0DVRAF4#HHHHHHHH 赤経RAモータ正転最速指定数駆動 DVRAF4#HHHHHHHH
0DVDCF4#HHHHHHHH 赤緯DECモータ正転低速指定数駆動 DVDCF4#HHHHHHHH
このような状況で問題となっていることは、SUPER STAR Ⅳからの回転動作を要求している”DV”コマンド送出のときの先頭部分に不正な文字(’0’)が付加されていることです。
具体的にいえば、右ボタンを押したときに出される赤経RAの回転コマンドは”0DVRAF4”となっており、また、導入ボタンを押下時の指定ステップ数の回転要求コマンドが”0DVRA#HHHHHHHH”となっていることです。ともにコマンドの先頭に’0’(半角ゼロ)というごみ文字が入るために、コントローラ側はコマンド不正として処理しています。このとき、正しいレスポンスとなる半角の’#’をコントローラが返しませんから、上位アブケーション側のSUPER STAR Ⅳは”何らかの通信エラーが発生しています”と表示してエラーを出してこちらも処理を中止してしまいます。
ですが、この状況はハード的な通信エラーではなくて、SUPER STAR Ⅳの出したコマンドエラーなのです。エラー発生当初は、上位アブケーションを信用して表示内容をそのまま受け取って信号部分のソースデバッグを行っていたのですが、どうも状況が納得いかなかったのでコマンドデータをモニタリングする事にしました。その結果が上表なのですが、このようなことが分かれば比較的簡単に修正できたので、もっと早めにコマンド表示を行えばよかったと悔いている次第です。
このような不具合はコマンド通信によるシステムでは、往々にして発生するものですが、前述のようなエラー自体は発見しずらいもののうちの一つです。というのも、コマンド仕様がしっかりと公開されている市販されたシステムにおいて、上記のような不具合を仮定しずらいからです。つまり、正しいコマンドが送付されているということが前提で処理を行おうとするからなのです。
<SUPER STAR ⅣのE-ZEUSコマンドエラー>
・回転動作を要求する初めての”DV”コマンドの前に’0’(半角ゼロ)の文字列が入る
このような状態のままでは、天体の自動導入だけでなく制御そのものができないわけですから、何らかの解決策を講じなくてはなりません。
しかし、このような状況が有るにも関わらず、ネット上で実際にE-ZEUSが稼働しているビデオを見るにつけ、何で動作するのか理解に苦しむところではあります。
どのような場合でもソフト的には回避できるものなのでコントローラ側で回避しても良いのですが、このような修正は本来、SUPER STAR Ⅳの側が行うことが最良なのです。
いずれにせよ、実際のサポートに関しては私の方からは何も言えないので、現状では単に報告のみということになります。
<SUPER STAR Ⅳのコマンドエラー回避方法>
SUPER STAR Ⅳの”DV”コマンドにこのような不具合が有ったとしても、メーカ
ーサイドでの修正を待つことはできませんので、コントローラ側で回避するしか方法はありません。
従来は、正確なコマンドフォーマットに則って制御が行われることを前提に、コントローラ側ではやや緩いコマンド処理をする様なコーディングになっていましたが、修正版ではコントローラ側がより厳しいフォーマットチェックを入れて動作するようにします。
具体的には、”DV”コマンドの”0DVRA#HHHHHHHH”のようなデータはゼロ('0')を除いた実
コマンド開始位置(“DVRA#HHHHHHHH”の“DVRA”)を検索することで行われます。
このような処理法の場合は、基本的な送られてくるコマンドフォーマット長は無意味なものになってしまうわけですから検査はしません。
従って、移動ステップ量(“DVRA#HHHHHHHH”の“HHHHHHHH”)においても、その終端も文字列終端までとします。
このコマンドの検索と取得には次のstrstr()ステートメントを使用して行います。この関数は、第1パラメータ(例では、コントローラ側に送られてきたコマンドがEjanCommand に入っています)の中から、第2パラメータ("DVRA")の文字列のある場所を検索します。関数は一致する文字列(文字ではない)がなければ'NULLヌル'を返し、文字列が有ればその先頭アドレス(この場合は’D’のアドレス)を返します。
#include <stdlib.h>
if ( (newEjanCommand=strstr(EjanCommand, "DVRA")) != NULL ) {
// コマンド文字列に"DVRA"が見つかった時の処理
if ( strchr(newEjanCommand, '#') != NULL) {
// DVRAF2#HHHHHHHH RA Motor Drive Command:赤経モーターの指定ステップ数回転
EZeusRaMotorTrackingCommand( newEjanCommand);
} else {
// DVRAF2 : RA Motor Drive Command:赤経モーターの指定ステップ数回転
EZeusRaMotorDriveCommand( newEjanCommand );
}
このようなコマンドの検査はコマンドの前に不正な文字列が入っていてもコマンド処理ができることになり、より緩やかなコマンド検査ということで本来的にはあってはならない状況なですが、実質的な処理としては仕方ないですね。これで、処理そのものは問題なしです。
<SUPER STAR ⅣのLX200コマンドエラー>
LX200コマンドの場合は、コマンドがデリミタ’#’コードで区切られているので、コマンド送信の後の改行(0x0d)や復帰(0x0a)等の制御コードは要求されていません。E-ZEUSの場合は改行(0x0d)コードが終端として扱われています。 従って、EJANではこの仕様に則ってこれら制御コードを出力せずにコマンド処理が行われているわけです。
SUPER STAR ⅣにおいてE-ZEUSとの通信における問題点は前述のとおりでしたが、LX200コマンドの場合はコントローラ側とシステムの接続時に不具合が発生しました。
SUPER STAR Ⅳはこのとき、望遠鏡の視野座標の取得コマンド(:GR#, :GD#)を出力してコントローラからのレスポンスを待ちます。このとき、赤経RAの座標は正しく表示しますが、赤緯DECの座標が正しく表示されず、”望遠鏡からの応答が有りません”というメッセージを出力して回線を切断してしまいます。このとき、赤経RAの座標は正しく表示されているので通信は良好だと思われますが、赤緯DECの座標の取得がうまくいかないのだと思われます。
SUPER STAR Ⅳの場合、赤緯DECの座標の表示は”±DD°MM.S”ということ
になっていますが、このフォーマットはLX200コマンドにはありません。
<LX200コマンドとレスポンスのフォーマット>
<LX200コマンド> < 座 標 > <高精度のフォーマット> < 低精度のフォーマット>
:GR# 赤経RA HH:MM:SS HH:MM.T
:GD# 赤緯DEC ±DD°MM’SS ±DD°MM’
<星図システムによる座標表示の違い>
< システム > < 座 標 > < 高精度の表示 > < 低精度の表示 >
Caltes du Ciel 赤経RA HHhMMmSSs HHhMM.Tm
赤緯DEC ±DD°MM.SS ±DD°MM
SUPER STAR 赤経RA HHhMM.Tm HHhMM.Tm
赤緯DEC ±DD°MM.S ±DD°MM.S
SUPER STAR Ⅳが自らのフォーマットを優先させるとフォーマットエラーということになる訳ですが、内部処理で表示を統一しているのならば問題はないのですがどうなのでしょうか。
当然のことなのですが、 Cartes du Cielでは、表示精度の設定により上記の形式で各座標が表示される訳ですが、それだけでなくコントローラにも精度指定のコマンドが出力されるのでその指定に従ったレスポンスが返されているのです。
SUPER STAR Ⅳの場合は、複数のコマンド体系に対応しており、それぞれのコマンド体系でのデータ表記は必ずしも同じではありませんから、自画面上の表示は固定フォーマットで統一しているのかもしれません。
いずれにせよ、このようなコマンドレスポンスでは通信が開始されないわけですが、コントローラとしてはどのような上位アプリケーションが接続されているのかを認識することができませんから根本的な解決法はないのです。つまり、レスポンスのフォーマットを変えること自体は容易なのですが、特定な上位アプリケーション毎にレスポンスを切り替えて返すということは、アプリケーションの種別が送られてこないのでできないことなのです。
0コメント