シグマ光機の「SHOT-602」はステッピングモータ対応の2軸のステージコントローラです。これはもう製造してないと思います。うちではこれにマイクロメーターにステッピングモーターが付いた形状の「SGSP-13ACT」を接続して使っています。SGSP-13ACTの利点は普通のXYステージで手動マイクロメーターが付いているものを置き換えることができて、手軽に自動制御できるようになります。ただ、マイクロメーターの取り付け位置によってはXYステージの移動する部分とステッピングモーターが干渉するために、移動できる範囲が狭くなることがあります。今使っているタイプのXYステージ(中央精機の中古)では干渉しません(しかし面積をとりますが)。
以前これらを顕微ラマンの測定システム(WinSpec/32)でマッピングのために使ってました。Visual Studioでプログラムを作成して、SHOT-602の制御とWinSpecの制御をしてました。しかしWinSpecはWindows8以降では使えず、そのため後継ソフトのLightFieldに更新したのですが、前に作ったXYステージ制御用プログラムが使用できません。正確にはXYステージ制御としてはまだ使えるはずですが、ラマン装置との連携部分が使えません。
LightField自体の使い方にやっと慣れたので、LightFieldを外部から操作してマッピング等を含めたAutomationができるようにしているところです。LightFieldはAutomationのためにPythonで外部から制御できるようになっているので、ステージコントローラもPythonで制御することにしました。これがSHOT-602をPythonで制御することに至った経緯です。
**インストール
Windows10 Proの英語版を顕微ラマン装置の制御に使っているので、まずこれにPythonをインストールしました。LightFieldもPythonから制御する必要があるので、LightFieldのPython Automationのマニュアルに沿って、Pythonをインストールしました。1つ注意はPythonが使えるようにするにはLightFieldをインストールする際にAdd-InsとAutomation SDKもインストールする必要がありますが、私はここで躓きました。Add-Ins等をインストールしたつもりでしたが、Pythonのサンプルコードなどがありません。色々とインストール時のオプションを試して、何とかAdd-InsとSDKが正しくインストールされました。SDKが正しくインストールされるとデスクトップにAdd-inへのショートカットができているはずです。出来てない時は何か問題があるようです。また、Pythonの.NETのパッケージもインストールする必要があります(これもマニュアルに説明があります)。
この時点ではどうも環境変数でPythonやpipの場所が設定されてないようでした。Windowsのターミナルからpipが認識されません。使えるようにするためには環境変数を設定する必要がありました。それでpipが使えるようになったので、PySerialを> pip install pyserialでインストールしました。Macで普段Pythonを使っているので、
Windowsではちょっと勝手が違って戸惑います。
SHOT-602はシリアル通信(RS-232C)を使っていますが、現在のPCだとRS-232C端子はもうありませんが、シリアルーUSB変換ケーブルを使うことでUSB端子で使えるようになります。使えるようにするにはこの変換器で使っているICのドライバーをインストールする必要があります(Windowsが自動でインストールしてくれる場合もあります)。また、コントロールパネルのデバイスをチェックして、このシリアルーUSBケーブルを抜き差しすることで、コントロールパネルのデバイスのどれが対応しているか分かるはずです。そのデバイスの詳細を見るとCOM*に対応しているか分かります。この*の番号部分をメモしておきます。うちの場合COM3でした。
SHOT-602のマニュアルではハイパーターミナルで通信をテストすることになってますが、それが付属していたのはWindows XPまでで、今のWindows10にはありません。今回はTeraTermを使ってSHOT-602と通信できるかチェックしました。SHOT-602はインターフェース仕様が8 bit, no parity, 1 stop bit, ハード制御なしになります。通信速度はSHOT-602本体にあるDIPスイッチで設定できます。私は以前19200で使っていたので、それを選びました。SHOT-602では19200が最速です。また、命令を送るときにはCR+LFが最後に必要です。TeraTermでそれらを設定するとSHOT-602と通信ができました。
Pythonでシリアルデバイスを制御する時はライブラリのPySerialが便利です。これはpipでインストールする必要があります。以下はSHOT-602の命令の中のMとGコマンドだけ使った例です。Mコマンドは指定したパルス数だけモータを回す設定を行います。SGSP-13ACTは1パルスで0.5 micron移動します。ステージ1を+方向に2000パルス移動させるには
M:1+P2000 G
とします。Mコマンドだけでは実際には移動しないので、次にGコマンドを送ります。Gコマンドは駆動命令で、Gの1文字だけ送るとMコマンドで設定した移動が始まります。
なお、これらのコマンドを送る前にencodeしておく必要があります。MとGコマンド1組送るだけの例を以下に示します。
最初の行でserialをインポートして、3行目で通信条件を設定しています。COM3の部分は必要に応じて変えてください。これを実行するとステージの片方が1 mm移動しました。他のコマンドにはジョグ、原点復帰、速度設定、停止、モータホールド/フリーなどのコマンドがあります。
import serial crlf = “\r\n” ser = serial.Serial(“COM3”,19200) txt = “M:1+P2000” + crlf go = “G” + crlf ser.write(txt.encode('utf-8')) ser.write(go.encode('utf-8')) ser.close()
次に矢印キーを使って、XY軸を移動させる簡単なプログラムを作成しました。1回押した時の移動ステップをv,c,m,fキーで変更できるようにしています。qキーを入力すると停止します。キー入力はmsvcrtのgetchを使って検出しています。普通のキーだと数字が1個返ってきます。例えばqキーだと113が返ってきます。矢印キーの場合はまず224が返ってきて、さらにその後にもう1つ数字が返ってきます。なので224が返ってきた場合は、もう一度getchで読み込んで、その数値で矢印の向きを判定しています。これでSHOT-602が自由に制御できるようになりました。パルス数を数えて、現在位置を表示したり色々とできると思います。次はLightFieldをPythonで制御する部分を少し勉強して、両者を合わせる予定です。
import serial from msvcrt import getch ser = serial.Serial("COM3",19200) step = 10 # initial step crlf = "\r\n" txt1 = "M:2-P" txt2 = "M:2+P" txt3 = "M:1-P" txt4 = "M:1+P" go = "G\r\n" print("XY stage driver") print("q for quit") print("v for very corse: 500 micron") print("c for corse: 50 micron") print("m for middle: 5 micron") print("f for fine: 0.5 micron") while True: key = ord(getch()) #print(key) if key == 113: # q for quit break; if key == 118: # v for very corse step = 1000 if key == 99: # c for corse step = 100 if key == 102: # f for fine step = 1 if key == 109: # m for middle step = 10 #print(key) if key == 224: key = ord(getch()) if key == 72: # Up arrow txt = txt1 + str(step) + crlf ser.write(txt.encode("utf-8")) ser.write(go.encode("utf-8")) elif key == 75: # Left arrow txt = txt3 + str(step) + crlf ser.write(txt.encode("utf-8")) ser.write(go.encode("utf-8")) elif key == 77: # Right arrow txt = txt4 + str(step) + crlf ser.write(txt.encode("utf-8")) ser.write(go.encode("utf-8")) elif key == 80: # Down arrow txt = txt2 + str(step) + crlf ser.write(txt.encode("utf-8")) ser.write(go.encode("utf-8")) ser.close()
その後、TKinterというライブラリーで制御をGUI化しています。これはMac上での例。ボタンをクリックすると設定した移動ステップだけ移動します。移動ステップはコンボボックスから変更できます。さらに、Windows PCにコピーして、同様に動作することを確認しました。