title
TOP - ASTRONOMY SIDE - SMART SHOOTER
Smart Shooter とは?

 Smart Shooter とは、Mac や Windows PC から Nikon や Canon のカメラを USB ケーブルでつないで制御するソフトウェアです。
 このようなカメラ制御を行うソフトウェアは他にもいくつか存在しますが、この Smart Shooter の最大の特徴は、スクリプト言語によって動作をカスタマイズできるところといえるでしょう。
 もし、自分が欲しい機能がなくても作ってしまえばいいのです。プログラミングが出来る人なら自作すればよいですし、プログラミングは出来ないという人でも他の人が作ったスクリプトを自分の Smart Shooter に読み込ませればよいのです。

 Smart Shooter の購入は、サポートサイト ( http://hartcw.com ) で行います。この記事を書いている時点では $50 となっています。支払いは、クレジットカードかPayPalが使えます。支払い手続きが完了すると、メールでレジストレーションコードが送られてきますので、それをソフトウェアにコピーペーストします。
 一応、お試し版も用意されていますが、20枚程度しか撮影できないという制限がかかっており、色々試すには厳しい制限です。
 少々お高いと感じるかもしれませんが、スクリプトによる制御というのは、私個人は他では見たことが無くオンリーワンのソフトウェアなので、この記事を読んでビビッときた方は是非(・∀・)。
 ちなみに、Mac版は、Mac App Store でも販売を行っています。私は、サポートサイトの方を先に見つけてしまったので、サポートサイトから Mac 版を購入しました。
 なお、この記事を書くにあたって使用した機材は、Apple MacBook Air 2011 / OS X 10.8.2 / Nikon D300s / Nikon D700 / Nikon D5100 です。機材や環境によって動作や画面が異なる場合があるかもしれませんが、予めご了承ください。特に、Canon のカメラは保有していませんので、コマンドの記述に差異があるかもしれません。
画面構成

 画面の構成は以下のようになっています。画面左側に接続しているカメラとそのカメラの状態が表示されます。様々なカメラの状態の変更や撮影、ライブビューの切り替え等を行うことが可能です。
 USB ケーブルでカメラを繋いだら、[ Connect ] ボタンを押すと繋がります ( 設定画面から自動接続に変えることも出来ます )。複数台のカメラの同時接続もできるようです。
 ステータス表示の下には撮影した画像のファイル名が一覧表示されます。撮影時にパソコン側に画像をダウンロードできますので、撮影中もパソコン側で別のソフトを使って画像処理をすることもできます。
 画面中央には、ライブビューもしくは撮影した映像が表示されます。
 画面右側には、スクリプトに関する情報が表示されます。スクリプトの読み込みを行い、実行。実行中に止めることももちろん可能です。ボタンの下側にあるのは、スクリプトで定義したユーザインターフェイスです。スクリプトは、実行する処理だけでなく画面の定義も行うことが出来ます。
 画面下側には、カメラとのやり取りのログが表示されます。スクリプトからここに文字列を表示させることも出来ます。
 一部、Bulb Timer 等の薄く表示されているのは、現在使えない機能です。サポートしているカメラと機能の一覧は、こちら に書かれていますが、Nikon のカメラはバルブの長さ設定はできないようです。
snap

複数台接続の検鏡について : 先程、カメラを複数台接続できると書きましたが、私の環境では、2台のカメラを繋ぎましたが先に繋いだ方しか認識できず複数台のコントロールについては動作検証ができませんでした。ちなみに、USBハブを経由せずに、MacのUSBポートに直接繋いでいます。
 また、Nikon D700は、メモリカードをさした状態では接続しても認識されず、メモリカードを抜くと認識されるという現象が発生しています。私の環境固有の問題なのか、設定の問題なのか、そもそもそういうものなのかは、現在特定できていません。
スクリプト言語 Tcl/Tk と スクリプトAPI

 さて、肝心のスクリプトです。ここからはプログラミング言語の知識がある程度要求されるところです。
 採用されている言語は、Tcl/Tk という言語です。プログラマーの方なら聞いたことはあるかもしれません。オリジナルの言語ではない実績のある言語なので、その点では安心して使えます。
 ただし、メジャーな言語ではありませんので「 新しい言語を勉強しないといけないのか〜 」と思われる方が多いでしょう。でも、文法は単純。なにかしら1つのプログラミング言語が使える方ならすぐに使えるようになるのではないかと思います。
 私も、Smart Shooter で初めて目にした言語ですが、すんなり入っていけました。そもそも、カメラの制御ではそんなに複雑な処理は必要ありませんので、基本的な文法だけ知っておけば十分だと思います。
 それともう1つ覚えなければ行けないのが「 スクリプトAPI 」です。これはカメラを制御したり、現在のカメラの状態を取得したりするためのコマンド群です。これもそんなに難しいものはありません。スクリプトAPIのリファレンスは英語ですが、こちら で見ることが出来ます。
簡単なサンプルスクリプトの作成

 では、具体的にスクリプトを作成してみましょう。用意するものはテキストエディタ。テキストを新規作成し、以下の1行を書いて「 sample.tcl 」というファイル名で保存してください。
SmartShooter TakePhoto
 そして、[ Load Script ] ボタンを押して今保存したファイルを選択して読み込みます。続いて [ Run Script ] ボタンを押して実行です。接続していたカメラで1枚写真が撮影されたはずです。できなかった場合は、カメラの電源、ケーブルの接続、[ Connect ] ボタンの押し忘れ等を確認してください。
 この「 SmartShooter XXX 」という形をした文がスクリプトAPIで、「 XXX 」のところを色々と変えることで、カメラを制御したり、カメラの情報を取得したりすることができます。今回の「 TakePhoto 」はそのまんまですが「 撮影をする 」というコマンドになります。
 続いて、この sample.tcl を以下のように書き換えてください。そして、再び [ Run Script ] ボタンを押します ( 再度読み込む必要はありません )。
SmartShooter Set ShutterSpeed 1/250 SmartShooter TakePhoto SmartShooter Set ShutterSpeed 1/125 SmartShooter TakePhoto
 今回新しく出てきたのは「 SmartShooter Set ShutterSpeed XXX 」もそのまんまですが「 シャッタースピードをXXXに変更する 」というコマンドです。このスクリプトで、1枚目は「 1/250秒 」で、2枚目は「 1/125秒 」で撮影するという段階露出が自動でできるわけです。いくつでも好きなだけ書いて段階露出できます(・∀・)。
 カメラの感度を変えるには以下のようにします。特に解説は不要ですね。注意点は「 大文字小文字を忠実に書く必要がある 」というところです。「 Iso 」のところを「 ISO 」と書いたらエラーになってしまいます。
SmartShooter Set Iso 400
 絞りの変更は「 Set Aperture XXX 」。
SmartShooter Set Aperture 4.5
 露出補正の変更は「 Set Exposure XXX 」で、プラスの時はプラス符号は不要です。
SmartShooter Set Exposure -1.3
 他にも様々な値が変更できますが、今回はひとまずここまで。スクリプトで変更してないものについては、現状の設定のまま撮影が行われます。AF がオンになっている場合は、オートフォーカスが行われてシャッターが下りるということになります。

撮影の間隔について : 手持ちの Nikonの3機種で試した範囲ですが、Nikon D300s と Nikon D700 は保存先がパソコン側に固定されます。Nikon D5100は、カメラ内のカードにも指定が可能です。これは機種によって変わるようですが、古い機種はパソコン側固定になるとのこと。保存がパソコン側の場合は、データのダウンロードが行われ、その間は次のコマンドが実行されません。
 つまり、撮影と撮影の間にある程度の隙間ができてしまうのです。星の軌跡を比較明合成するような用途で使おうとすると、軌跡が途切れ途切れになる可能性があります。
 単純なインターバル撮影ならカメラ自身が機能を持っていますので、Smart Shooter を使うまでもないかもしれませんが、ダウンロードの時間を短くするために、カメラの画質モードをRAWからJPEGにするなどの工夫が必要になるかもしれません。
 カメラ内のカードに保存できるようになれば、そのような工夫は不要になりますが、逆に、パソコン側にダウンロードしながら撮影するので問題が無ければ、撮影しながら別のソフトを使って画像処理ができるわけですので、メリットにもなりうるともいえます。
 以下に、実際にどの程度の間隔があいてしまうのかの実測結果を載せました。クリックすると動画をみることもできます。
 ちなみに、機材は、MacBook Air が、Core i5 / 1.7GHz で、USB 2.0。Nikon D700 が USB 2.0。パソコンとカメラ側が USB 3.0 になればもっと短くなるでしょう。ただし、最近のカメラは画素数も増えているため、ある程度相殺することになります。
JPEG RAW
クリックすると動画が表示されます ( 液晶パネル内でバーが伸びているときがダウンロード中です )
変数や分岐を使ったスクリプトの例

 まずは、簡単なスクリプトを見ていただきましたが、今のところスクリプトAPIしか使っていませんね。Tcl/Tkの命令も使った少し複雑なサンプルを作ってみましょう。「 3枚の段階露出を5秒おきに10回繰り返す 」というものにしてみます。
set i 1 while { $i <= 10 } { SmartShooter Set ShutterSpeed 1/500 SmartShooter TakePhoto SmartShooter Set ShutterSpeed 1/250 SmartShooter TakePhoto SmartShooter Set ShutterSpeed 1/125 SmartShooter TakePhoto SmartShooter Wait 5 incr i }
 最初の「 set i 1 」は「 i という変数に 1 を代入する 」という意味です。次の「 while { $i <= 10 } { ... } 」は「 i が 10 以下の間は次の括弧の中の処理を繰り返す 」という意味です。Tcl では、変数へ値を代入するのには「 $ 」が不要で、変数の値を参照するのには「 $ 」が必要なので、このような記述になります。
 そこからの6行は、先程解説した段階撮影で3枚撮影を行います。次の「 SmartShooter Wait 5 」は「 5秒停止 」を意味します。次の「 incr i 」は「 i の値を1つ増やす ( increment ) 」を意味します。これで、10回撮影が行われた時には、i の値が 11 になり、while から抜け出してスクリプトが終了します。
時間と連動した自動撮影

 さて、例えば皆既日食の完全自動撮影をしたいとします。この場合「 部分日食中は5分おきに撮影 」「 皆既中は段階撮影で連写し続ける 」という風な撮影パターンが考えられます。このような時間に連動した自動撮影のスクリプトを書いてみましょう。
set curTime [ clock seconds ] set endTime [ clock scan "Wed Jan 23 09:00:00 AM JST 2013" ] while { $curTime < $endTime } { SmartShooter TakePhoto SmartShooter Wait 300 set curTime [ clock seconds ] }
 最初の「 set curTime [ clock seconds ] 」ですが、「 [ clock seconds ] 」で「 現在の今世紀の最初からの経過秒数 」を取得できるため「 現在の時刻を curTime に代入する 」という意味になります。次の「 [ clock scan XXX ] 」は「 文字列で記述された日時を今世紀の最初からの経過秒数に変換する 」ものなので、全体としては「 endTime に 2013/1/23 09:00:00 JST 」を代入するという意味になります。
 次の「 while { $curTime < $endTime } { ... } 」は「 現在時刻の curTime が endTime よりも小さい間括弧の中の処理を繰り返す 」という意味になります。その後、撮影して、5分停止したら、現在の時刻を再度取得して curTime に代入します。現在時刻が endTime よりも大きくなったら、この繰り返しの部分の処理が終わります。
 これで部分日食中の撮影が自動化されました。皆既中の処理も同じような記述になります。先程のスクリプトの後ろに続けて以下を入力してください。
SmartShooter Set Iso 800 set curTime [ clock seconds ] set endTime [ clock scan "Wed Jan 23 09:05:00 AM JST 2013" ] while { $curTime < $endTime } { SmartShooter Set ShutterSpeed 1/250 SmartShooter TakePhoto SmartShooter Set ShutterSpeed 1/125 SmartShooter TakePhoto SmartShooter Set ShutterSpeed 1/60 SmartShooter TakePhoto set curTime [ clock seconds ] }
 暗くなるので「 感度を上げてブレを防ぐ 」ために「 ISO 800 」に変更するという処理も入れました。while の中では、段階露出を中断なしで撮影し続けるようにしました。
 こんな感じで、while ループをどんどん追加していけば、時間に応じた自動化ができるわけです。

バッテリーの消費について : Smart Shooter を使っていると、カメラ側のバッテリーの減りが速くなるようです。ずっとUSBで繋がっていますし、データのダウンロードも行っていますので仕方の無いことかもしれませんが、バッテリー対策も必要になるかもしれません。

関連 : 天文リンク - OS X用アプリ