4コメント

はじめての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
http://www.sharpcap.co.uk/sharpcap/sharpcap-scripting

--------------------

# 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)



この記事へのコメント

  • けむけむ

    こりゃまた、超面白そうなネタを (^o^)/

    .NET Framework はVB5+VCで作ったDLLを呼んで動作するアプリケーションをテラ難儀して移植した覚えがありますが(marshallingでゲロゲロ)、大昔なので何一つ覚えてません (^o^;

    けど、何かしらやってみたいなぁ
    理想はこいつをうまくどうにかして、M-GENのディザリングと連携できるとカッケーのだけど、野望と言うより妄想です...
    2016年09月28日 02:05
  • あぷらなーと

    おお、す、素晴らしい!
    たった数時間で書いちゃうとは、凄いですね。
    ちなみに、Mgen持ってないくせに、一瞬けむけむさんと全く同じことを妄想しちゃいました。

    ベルリンの調教が済んだら、次はニシキヘビと遊んでみましょうかねぇ。
    2016年09月28日 09:57
  • オヤジ

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

    あぷらなーとさん、オヤジさん
    私はまったくすごくないし、ソフトウエア開発に明るくないんですよ。コピペの腕はすごいかもしれませんが(笑)

    けむけむさん、あぷらなーとさん
    オブジェクトにSharpCap.Mountsというのがあるので赤道儀の制御ができるかもしれません(ASCOM経由?メソッドは?)。オートガイドはM-GENさんにお任せをして、スクリプトではASIで撮影するごとに、dec方向とra方向にちょこっとだけ赤道儀を移動させて撮影枚数ぶんだけ繰り返すというのはどうでしょう?少なくともAVXは外部端子が複数あるので、M-GENとPCからそれぞれ接続できちゃうかもかも?
    2016年09月28日 23:45