スポンサーリンク

はじめてのIron Python、SharpCapのScriptを書いてみたよ

SharpCapでカメラや望遠鏡を制御するのにスクリプト言語が使えるというので、興味を持っていました。ただ、使える言語はPythonで、しかも.NETで動作するIron Pythonです。Pythonなんか1行も書いたことがなく、しかも.NETというWindows プログラマ以外は関係なさそうな開発環境です。まぁ、しかし、サンプル・スクリプトをかき集めてコピペすればなんとかなるでしょうと、Iron Pythonでスクリプトを書いてみました。
■何を作るか
SharpCapもだいぶ使い慣れてきて、いじくるパラメータも限られてきました。ヘッドランプをつけながらも、暗闇でゲインの数値を入力したり、スライダーを動かすのはちょっとしたストレスだったので、プリセットボタンを押すだけで、ゲインと露出の値を設定できるようにしてみました。
script2.jpg
■Iron Python = 鋼鉄のニシキヘビ😖
私はヘビが嫌いですが、習得しやすい言語らしいです。{ }を使わないので、どこからどこまでがネストなのか関数なのかがよく分かりません(その辺、下記のスクリプトは大いに怪しいです)。カッコの代わりにスペースで行頭を揃えるらしいです。なので、必然的に見やすいコードになるそうです。演算とか条件分岐とか繰り返しの考え方はどの言語も変わらないので、慣れる人はすぐ慣れてしまうのでしょう。
.NETは、私が挫折したフレームワークです(笑)VB 6.0までは、趣味でプログラムを書いていたことがありましたが、.NETに対応してからはオブジェクト指向のBASICに馴染むことができませんでした。だから.NETは苦手(笑)慣れてる人は、強力なスクリプトを書けると思います。
数時間の格闘ののち、意味が分からないなりに、なんとか動くものができました。コントロール配列を使えば、もうちょっとキレイに書けるかと思ったら、そんなのとっくの昔にサポートが終わっていたんですね(爆死)
■使い方
使い方は二通りあります。どちらの場合にしても、まずは下の方にあるスクリプトをコピーしてください。このSeesaaブログではインデントの半角空白が表示されないようなので、全角に置換して掲載してあります。必要に応じて、半角に置換しなおしてくださいm(_ _)m
script.jpg
(1)コンソールにペーストして実行する
メニューにある「Scripting」>「Show Console」を選択します。すると、ターミナルのような画面が出ます。その下にスクリプトを書く場所がありますので、そこにコピーしたスクリプトをペーストします。ペーストの後、緑色の再生ボタンを押します。これで実行完了。
(2)スクリプトを保存したのち、実行する
コピーしたスクリプトをエディタにペーストし、hoge.py(*.pyは、Pythonの拡張子)とか適当な名前で保存しておきます。メニューにある「Scripting」>「Run Script」を選択すると、保存したスクリプトを選択するダイアログがでます。Pythonスクリプトを選べるようになっていますが、表示はありません(たぶんSharp Capのバグ)。なので、Show All Filesにしてから、ファイルを開きます。ファイルが実行されます。
あとはボタンを押すだけで値が変わります。Expは露出(秒)、Gainはゲインです。「Allingment」は、露出3秒、ゲイン550のコンボ設定です。私の場合ですが、天体導入のためのスターアライメントとフォーカシング時に、ハイ・ゲインと短時間露出でにすることが増えてきたので、それもプリセットボタンに組み込んでみました。画面の邪魔にならないところに置いてください。Exitで終了〜

■動作環境
ASI1600につなぐのを忘れないでくださいね。SharpCap2.9、ASI1600で動作を確認しています。ここまで紹介しておいてなんですが、お約束として、動かなかったり、予期しない動作があったりして、パソコンに問題が起きてもごめんなさいです。また、実践に投入していないので、使いやすいかどうかは分かりません(~o~)。
■改変等
スクリプトを見ていただけると分かりますが、やってることは明快です。ビニングをトグルするとか、レチクルのオンオフとか、文字列や値を書き換えれば、カスタマイズも効くと思います。このスクリプトに関しては、どんどん改変、配布をなさってください。文法とか絶対的に怪しいので、ちゃんとしたものにしていただけますと嬉しいです。プログラムを学んでいる方は、参考にしないように!
SharpCap Scripting Object Model

SharpCap Scripting – SharpCap – Lunar, Planetary, Solar and Deep Sky Imaging. EAA and Live Stacking.

——————–

# IronPython Pad. Write code snippets here and F5 to run. If code is selected, only selection is run.
#この3行はおまじない
import clr
clr.AddReference(“System.Windows.Forms”)
from System.Windows import Forms
class ControlForm(Forms.Form):
def __init__(self):
self.Height = 140
self.Width = 275
self.Text = ‘ASI1600 Control’
#常に全面に表示
self.TopMost = 1
#Allignment Button
self.MessageButton = Forms.Button(Text=”Allignment”, Left=10, Top=10)
self.MessageButton.Click += self.OnClickAllign
self.Controls.Add(self.MessageButton)
#EXIT Button
self.ExitButton = Forms.Button(Text=”Exit”, Left=170, Top=10)
self.ExitButton.Click += self.OnClickExit
self.Controls.Add(self.ExitButton)
#Form上のテキスト表示はこんな感じで
#self.Controls.Add(Forms.Label(Left=10, Top=35, Text=”Gain”))
#Gain 300 Button
self.MessageButton = Forms.Button(Text=”Gain 300″, Left=10, Top=40)
self.MessageButton.Click += self.OnClickGain1
self.Controls.Add(self.MessageButton)
#Gain 350 Button
self.MessageButton = Forms.Button(Text=”Gain 350″, Left=90, Top=40)
self.MessageButton.Click += self.OnClickGain2
self.Controls.Add(self.MessageButton)
#Gain 400 Button
self.MessageButton = Forms.Button(Text=”Gain 400″, Left=170, Top=40)
self.MessageButton.Click += self.OnClickGain3
self.Controls.Add(self.MessageButton)
#Exp 30 Button
self.MessageButton = Forms.Button(Text=”Exp 30″, Left=10, Top=70)
self.MessageButton.Click += self.OnClickExp1
self.Controls.Add(self.MessageButton)
#Exp 60 Button
self.MessageButton = Forms.Button(Text=”Exp 60″, Left=90, Top=70)
self.MessageButton.Click += self.OnClickExp2
self.Controls.Add(self.MessageButton)
#Exp 90 Button
self.MessageButton = Forms.Button(Text=”Exp 120″, Left=170, Top=70)
self.MessageButton.Click += self.OnClickExp3
self.Controls.Add(self.MessageButton)
#Gain1
def OnClickGain1(self, sender, args):
SharpCap.SelectedCamera.Controls.Gain.Value = 300
#Gain2
def OnClickGain2(self, sender, args):
SharpCap.SelectedCamera.Controls.Gain.Value = 350
#Gain3
def OnClickGain3(self, sender, args):
SharpCap.SelectedCamera.Controls.Gain.Value = 400
# 単位は秒 micro seconds は小数点でOK
#Exp1
def OnClickExp1(self, sender, args):
SharpCap.SelectedCamera.Controls.Exposure.Value = 30
#Exp2
def OnClickExp2(self, sender, args):
SharpCap.SelectedCamera.Controls.Exposure.Value = 60
#Exp3
def OnClickExp3(self, sender, args):
SharpCap.SelectedCamera.Controls.Exposure.Value = 120
#Allignment & Focusing
def OnClickAllign(self, sender, args):
SharpCap.SelectedCamera.Controls.Exposure.Value = 3
SharpCap.SelectedCamera.Controls.Gain.Value = 550
#Exit
def OnClickExit(self, sender, args):
self.Close()
if __name__ == ‘__main__’:
app = ControlForm()
Forms.Application.Run(app)

この記事へのコメント

  1. こりゃまた、超面白そうなネタを (^o^)/
    .NET Framework はVB5+VCで作ったDLLを呼んで動作するアプリケーションをテラ難儀して移植した覚えがありますが(marshallingでゲロゲロ)、大昔なので何一つ覚えてません (^o^;
    けど、何かしらやってみたいなぁ
    理想はこいつをうまくどうにかして、M-GENのディザリングと連携できるとカッケーのだけど、野望と言うより妄想です…

  2. おお、す、素晴らしい!
    たった数時間で書いちゃうとは、凄いですね。
    ちなみに、Mgen持ってないくせに、一瞬けむけむさんと全く同じことを妄想しちゃいました。
    ベルリンの調教が済んだら、次はニシキヘビと遊んでみましょうかねぇ。

  3. 天体趣味の方、ソフト開発に明るい方が多いですね。
    先日拝見した方は、赤道儀のモーターのエナメル線を巻き替えて動かすとか!Blogでフィードバックありがたい事です。
    オヤジはもう、全部忘れました。

  4. あぷらなーとさん、オヤジさん
    私はまったくすごくないし、ソフトウエア開発に明るくないんですよ。コピペの腕はすごいかもしれませんが(笑)
    けむけむさん、あぷらなーとさん
    オブジェクトにSharpCap.Mountsというのがあるので赤道儀の制御ができるかもしれません(ASCOM経由?メソッドは?)。オートガイドはM-GENさんにお任せをして、スクリプトではASIで撮影するごとに、dec方向とra方向にちょこっとだけ赤道儀を移動させて撮影枚数ぶんだけ繰り返すというのはどうでしょう?少なくともAVXは外部端子が複数あるので、M-GENとPCからそれぞれ接続できちゃうかもかも?

タイトルとURLをコピーしました