ELL14をpythonで制御する の履歴(No.2)


ソーラボのELL14をPythonから制御する(2023/08/25)

ELL14.png

経緯

 ソーラボの「ELL14」はピエゾ駆動の回転マウントです(上の写真)。ELLシリーズには回転マウント以外にもピエゾ駆動のデバイスがあり、インターフェース基板やソフトは共通で使えるようです。ELL14はSM1仕様なので、直径25 mmか1インチの偏光子や波長板を取り付けて、それを外部から制御して、360度回転させることができます。精度は44 micro radianとのこと。ソーラボのこれまでのパーツとは違って、基板が剥き出しになっているのが特徴?です。USBを使って外部からPCなどで回転を制御することが可能です。基板本体にもスイッチがあって、jogで回転させることもできます(テスト以外では使わないと思いますが)。これの導入理由は偏光ラマン測定などをPCから制御して自動化するためですが、まずは1台買って試しているところです(偏光測定などでは2台は必要)。
 最近、ソーラボの新製品を見ていたら、ELLシリーズの新製品のELL15というのが出ていました。ELL14と見た目がほぼ同じなので、ELL14の改良品が出たのかとドキッとしましたが、これはピエゾ駆動で絞りを制御する製品でした。

まず使ってみる

 ELL14にはELL*シリーズ用の簡単な制御ソフト(Windowsのみ)が用意されています(ソーラボのサイトからダウンロードできる)。それをインストールするとドライバーなどもインストールされるようです。また、操作マニュアルやコマンドの詳細を書いたpdfも同じところからダウンロードできます。まずはその制御ソフトを使って回転させることができました。この装置は内部的にはRS232Cベースで制御するようになっています(もちろんUSB経由です)。また、デバイスを16個まで繋げることができるようになっています。なので、コマンド送る時はまずはデバイスをアドレス指定する必要があります。

Pythonで制御してみる

 シリアル制御デバイスなので、pythonライブラリのpyserialが使えます。これはpipやcondaでインストールする必要があります。通信設定は9600 baud, 8bit data, 1 stop bit, no parity。コマンドは一番最初にデバイスアドレスの16進の数字がきます(0~F)。その後の2文字がコマンドになり(小文字)、コマンドによってはその後にパラメーターが続きます。パラメータは16進数で表します。送信するコマンドは小文字、返信されるコマンドは大文字と決まっているようです。
 以下のリストは簡単なプログラムで、角度を最初に45に設定して、その角度に回転させる命令を送って、返事を待って、印刷するだけの内容です。この場合、回転は角度絶対値指定のコマンドを使っています(ma)。エンコーダーは1回転で143,360カウントになるので、回転角1度に対して398.2222のカウント値で、これを回転角度として変換してパラメータ部分に入れて、送る必要があります。そのため、回転角に398.2222を掛けて、それを整数化して、さらに16進に直しています。パラメータ部分はこの場合全部で8桁必要なので、最初の0の数をそれに合うように設定しています。この例ではアドレス0のデバイスについて、絶対値で回転(ma)するようにコマンド文字列を作っていきます。そのコマンドをpyserialを使ってデバイスに送ってます。最後の方はコマンド送った後にデバイスからの返信を読み込んでいます。これでMacからELL14を回転させることができました。Windowsの場合は最初の行を削除して、serial.Serialのところのデバイス名をCOMに変えれば動くはずです。
 とりあえずはPC/Macからpythonで制御できることが確認できました。

#!/opt/anaconda3/bin/python
import serial
import struct
import time
conv = 398.22222222 # counts for 1 degree 
# test pyserial program to control 
# Thorlab ELL14 piezo-motor-driven rotating mount

angle = 45 # 45 degree absolute value rotation

if angle < 0: # negative angle is not allowed
   angle = 360.0 + angle
s = round(angle*conv) # convert angle to displacement
cmd = "0ma" # absolute rotation command, first zero means 0th device (0~F)
cmd_angle = format(s,'x').upper()
cmd_0 = ''
for i in range(8-len(cmd_angle)): # adjust length by putting zero
   cmd_0 = cmd_0 + '0'
cmd = cmd + cmd_0 + cmd_angle # add angle value, change to hex and upper case
print('Tx: ' + cmd) # print command to be sent

ser = serial.Serial("/dev/cu.usbserial-DK0BJ28Z",9600) # for Mac, in terminal, do this, > ls /dev/cu.*
#ser = serial.Serial("COM4",9600) # for Windows, number will be different
ser.write(cmd.encode('utf-8'))
time.sleep(1)
t = ''
while True:
	if ser.in_waiting > 0:
		recv_data = ser.read(1) # read one data
		ans = struct.unpack_from("B",recv_data ,0) # tuple, decimal value returned
		t = t + chr(ans[0]) # add up returned message
		if 13 in ans: # 13 means CR
			recv_data = ser.read(1) # read last one which is LF
			break
print('Rx: ' + t) # print returned message
ser.close()
ELL14_tkinter.png

 その後、TKinterを使って、GUIでボタンをクリックして、回転できるようなpythonプログラムを作ってみました。まだ、原点復帰と回転だけの機能しかありませんが。回転角自体は絶対値でも相対値でも指定できます。これはMac上ですが、その後Windowsでも動きました。
 光学等方体の場合は、ELL14に1/2波長板を入れて、偏光方向を90度変えることで偏光測定が一応できますが、異方体の場合にはもう1台に偏光子を使うことが必要となります。その場合は2つのELL14をアドレスを変えてやって制御することになります。

コマンド

 以下、よく使いそうなコマンドをまとめたものです(全てではありません)。

注意

 一見ソーラボの30 mmケージシステムに容易に取り付けられるように見えますが、実はそう単純な話ではありません。写真の回転マウント部分の反対側に30 mmケージに対応したマウントが一応付いていて、穴も開いてます。しかし、ここには30 mmケージで使っている直径6 mmのロッドは入らず、(16 mmケージ用の)直径4 mmのロッドが入ります。なので、6 mmロッドに短い4 mmロッドを延長しないと、固定できません(ロッドのネジは共通のようです)。ただ、この取り付け方法だと、ケージ用ロッドはマウントを貫通できないので、ケージがここで途切れてしまいます。光学系の構成によってはこれは困ります。
 ケージを途切れさせない方法としては、回転マウント基板にある60 mmケージ用の穴(ロッドのネジが入る穴)が使えます(大きめの穴は50 mm間隔でケージとは無関係)。ロッドを両側からネジを介して、基板を挟んでやることで固定することができます。ただこれは60 mmケージに対応するので、30 mmケージを使っている場合は、30/60 mmの変換用プレート2枚を前後に使って変換・接続してやる必要があります。場所とりますが…
 ケージではなくて、ポストとホルダーを使っている場合は、やはり回転マウントの裏側の4 mmロッド用の穴の下部2つを使って、ケージマウントブラケットで固定して、これをポスト+ホルダーで固定することもできるようです。ELL15の紹介にそうして固定している写真が載っていた。
 購入する時は1台目は電源やインターフェース基板も入ったセットを買う必要があります(私はそうした)。デイジーチェーン接続する場合は、2台目からは本体だけ買えばいいようです。その場合はデイジーチェーン接続するためのコードを自作する必要があります。私はそのためにRSで適当なケーブル1 mとコネクタ部分を購入しました(2台目が来た時のために)。それが面倒な方用にはデイジーチェーン接続するための専用基板も売ってます。セットには電源アダプターが付属しますが、ちょっと使ってみたところ、USBからの電源でも回転はできました。ただ、複数デバイスをデイジーチェーンで繋ぐとか、取り付ける素子が重いとかだとちゃんと電源アダプターを繋いだ方がいいようです。
 ELL14はピエゾモーター部分が2つあるので、モーターが2つあるタイプに相当するようです。コマンドマニュアルでモーター2タイプで使えると書かれているコマンドが使えることになります。最初、モーター1つだと勘違いしていて、混乱しました。
 その後、インターフェース基板が剥き出しなのはちょっと怖いので、タカチのプラスチックケースを加工して納めました。

ELL14_board_case.png

ケーブル自作

 さらにその後、ELL14の2台目を購入しました。2台をデイジーチェーンで繋ぎたいので、MOLEX 90327-0308のコネクターと8芯のフラットケーブルをRSで買いました(分配器をソーラボで売ってますが、予算が…)。フラットケーブルの方はマニュアル記載の3M 3365/08-100がすごく長いものしか見つからなくて、代わりにWurth Elektronikのリボンケーブル8芯を買いました。こちらは1m単位で買えます。これもRSから。コネクターの取り付けは本来何か専用の工具があるのでしょうが、マイナスドライバーで電極の端の部分(下写真の左側が加工前のコネクター)を押して、ケーブルに突き刺す必要があります。それとコネクターの方向も考えないといけません。この細工は結構難しくて、先端長さのちょうどよいマイナスドライバーが必要です。先端が小さいと電極部分に入り込んで電極を変形させてしまいます。逆に大きすぎると周囲のプラスチック部分まで変形させて、これも結果的に電極を変形させます。これを理解するまでにコネクター3個ダメにしました(ケーブルはその都度少し切った)。最終的には自作したケーブル(下写真の右側)で回転することを確認できました(現在両端にだけコネクターを付けている)。ケーブルの作り方自体はpdfマニュアルの最後の方に載ってます。
 デイジーチェーンで繋ぐ場合、各ELL14に異なるアドレスをアサインする必要があります。最初は全て0に設定されています。アドレス変更にはELL14セットに付いてくるWindows用ソフトELLOを使えば可能です。私は1台目はアドレス0のままで、2台目を1と設定しました。

ELL14_cable.png