ELL14をpythonで制御する の変更点


#author("2024-09-17T14:09:25+09:00;2024-09-15T09:31:06+09:00","default:masami","masami")
#author("2024-09-17T15:15:28+09:00;2024-09-15T09:31:06+09:00","default:masami","masami")
*ソーラボのELL14をPythonから制御する(2023/08/25)
#image(https://mkanzaki.sakura.ne.jp/images/ELL14.png,center,33%)
#contents
**経緯
 ソーラボの「ELL14」はピエゾ駆動の回転マウントです(上の写真)。ELLシリーズには回転マウント以外にもピエゾ駆動のデバイスがあり(スライダー、1軸ステージ、回転ステージ、アイリス)、インターフェース基板やソフトは共通で使えるようです。ELL14はSM1内ネジ仕様なので、直径25 mmか1インチの偏光子や波長板を内部に取り付け可能で、それを外部から制御して、360度回転させることができます。精度は0.05度くらい。ソーラボのこれまでのパーツとは違って、基板が剥き出しになっているのが特徴?です。USBを使って外部からPCなどで回転を制御することが可能です。基板本体にもスイッチがあって、jogで回転させることもできます(テスト以外では使わないと思いますが)。これの導入理由は偏光ラマン測定などをPCから制御して自動化するためですが、まずは1台買って試しているところです(偏光測定では偏光子を2つ回転する必要があると思ってましたが、対物レンズのすぐ上に取り付ければ1台で済むし、その方が色々と都合がいいのです)。
 最近、ソーラボの新製品を見ていたら、ELLシリーズの新製品のELL15というのが出ていました。ELL14と見た目がほぼ同じなので、ELL14の改良品が出たのかとドキッとしましたが、これはピエゾ駆動で絞りを制御する製品でした。
**まず使ってみる
 ELL14にはELL*シリーズ用の簡単な制御ソフト(Windowsのみ)が用意されています(ソーラボのサイトからダウンロードできる)。それをインストールするとドライバーなどもインストールされるようです。ただ後で示すようにMacでも使うことはできます。また、操作マニュアルやコマンドの詳細を書いたpdfも同じところからダウンロードできます。まずはその制御ソフトを使って回転させることができました。この装置は内部的にはRS232Cベースで制御するようになっています(もちろんUSB経由です)。また、デバイスを16個まで繋げることができるようになっています。なので、コマンド送る時はまずはデバイスをアドレス指定する必要があります。(2台目を買ったとき)デバイスに1台目と違うアドレスを振るためにWindows用の制御ソフトを使いました。これはコマンドからも可能です。
**Pythonで制御してみる
 シリアル制御デバイスなので、pythonライブラリのpyserialが使えます。これはpipやcondaでインストールする必要があります。通信設定は9600 baud, 8bit data, 1 stop bit, no parity。コマンドは一番最初にデバイスアドレスの16進の数字がきます(0~F)。その後の2文字がコマンドになり(小文字)、コマンドによってはその後にパラメーターが続きます。パラメータは16進数で表します。送信するコマンドは小文字、返信されるコマンドは大文字と決まっているようです。Macの場合、serial.Serialで指定するデバイス名"/dev/cu.*"は、ターミナルからls /dev/cu.*と入力して、出てくるリストから見つけます(もちろんその前にデバイスをつないでおきます)。
 以下のリストは簡単なプログラム(Mac用)で、角度を最初に45に設定して、その角度に回転させる命令を送って、返事を待って、印刷するだけの内容です。この場合、回転は角度絶対値指定のコマンドを使っています(ma)。エンコーダーは1回転で143,360カウントになるので、回転角1度に対して398.2222のカウント値で、これを回転角度として変換してパラメータ部分に入れて、送る必要があります。そのため、回転角に398.2222を掛けて、それを整数化して、さらに16進に直しています。パラメータ部分はこの場合全部で8桁必要なので、最初の0の数をそれに合うように設定しています。この例ではアドレス0のデバイスについて、絶対値で回転(ma)するようにコマンド文字列を作っていきます。そのコマンドをpyserialを使ってデバイスに送ってます。最後の方はコマンド送った後にデバイスからの返信を読み込んでいます。これでMacからELL14を回転させることができました。Windowsの場合は最初の行を削除して、serial.Serialのところのデバイス名を使っている「COM番号」に変えれば動くはずです。どのCOM番号を使っているかは設定のデバイスから調べます。
 とりあえずはPC/Macからpythonで制御できることが確認できました。

 #!/opt/anaconda3/bin/python
 ##!/usr/local/bin/python3 # 
 import serial
 import struct
 import time
 conv = 398.22222222 # counts for 1 degree 
 # use pyserial program to communicate to ELL14 
 # 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 # so convert to positive angle with same result
 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()
 
#image(https://mkanzaki.sakura.ne.jp/images/ELL14_tkinter.png,center,25%)
 その後、TKinterを使って、GUIでボタンをクリックして、回転できるようなpythonプログラムを作ってみました(上の図)。まだ、原点復帰と回転だけの機能しかありませんが、回転角自体は絶対値でも相対値でも指定できます。これはMac上ですが、その後Windowsでも動きました。
**コマンド
 以下、よく使いそうなコマンドをまとめたものです(全てではありません)。最初のゼロはアドレスを意味しているので、実際のアドレスに応じて変える。私の使い方では偏光板や波長板をある角度に設定するだけなので、使いそうなのは原点復帰、回転絶対値、回転相対値コマンドでしょうか。 
-cleaning: 0cm (全周の回転を行い、埃などを除去する。数分かかる) 
-optimization: 0om (周波数をロードなどに応じて最適化する。光学パーツ取り付けた後に実施、数分かかる)
-停止:0st (cleaning, optimizationを止める)
-回転停止:0st (jogを止める時に使う)
-原点復帰 homing: 0ho0 or 0ho1(0だとCW, 1だとCCWで原点復帰する)
-回転絶対値: 0ma000xxxxx (xxxxxのところに回転角に対応するカウント数が16進で入る)
-回転相対値: 0mr000xxxxx (同上)
-jog forward: 0fw (設定されているjogステップで、forward回転する)
-jog backward: 0bw (設定されているjogステップで、backward回転する)
-jog stepsizeを設定:(0sj00004600。例は45º設定。0にするとfw, bwで連続的に動くが、stで止める必要がある。またその場合、velocityを50~70%に設定しないとダメ)
-jog stepsize取得:0gj (0GJ0000xxxxが帰ってくる)
-速度取得:(0gv 速度は出力を変えることで変更する。返事はAGV64のようになり、最後の2桁が0~100%出力値になる(16進)。この例だと100%。)
-速度設定:(0sv32、0~100%出力値を16進2桁にする。この例は50%に設定)
-ステータス取得:0gs (e.g., 0GS00, 00は正常の意味)
-ユーザーデータ保存: 0us
-アドレス変更:0caA (例は0からAへ変更、当然変更後コマンドのアドレスを変更する必要がある)
**注意
 一見ソーラボの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つだと勘違いしていて、混乱しました。
 その後、インターフェース基板が剥き出しなのはちょっと怖いので、タカチのプラスチックケースを加工して納めました。
#image(https://mkanzaki.sakura.ne.jp/images/ELL14_board_case.png,center,20%)
**ケーブル自作
 さらにその後、ELL14の2台目を購入しました。2台をデイジーチェーンで繋ぎたいので、MOLEX 90327-0308のコネクターと8芯のフラットケーブルをRSで買いました(分配器をソーラボで売ってますが、予算が…)。フラットケーブルの方はマニュアル記載の3M 3365/08-100がすごく長いものしか見つからなくて、代わりにWurth Elektronikのリボンケーブル8芯を買いました。こちらは1m単位で買えます。これもRSから。コネクターの取り付けは本来何か専用の工具があるのでしょうが、マイナスドライバーで電極の端の部分(下写真の左側が加工前のコネクター)を押して、ケーブルに突き刺す必要があります。それとコネクターの方向も考えないといけません。この細工は結構難しくて、先端長さのちょうどよいマイナスドライバーが必要です。先端が小さいと電極部分に入り込んで電極を変形させてしまいます。逆に大きすぎると周囲のプラスチック部分まで変形させて、これも結果的に電極を変形させます。これを理解するまでにコネクター3個ダメにしました(ケーブルはその都度少し切った)。最終的には自作したケーブル(下写真の右側)で回転することを確認できました(現在両端にだけコネクターを付けている)。ケーブルの作り方自体はpdfマニュアルの最後の方に載ってます。
#image(https://mkanzaki.sakura.ne.jp/images/ELL14_cable.png,right,25%)
 デイジーチェーンで繋ぐ場合、各ELL14に異なるアドレスをアサインする必要があります。最初は全て0に設定されています。アドレス変更にはELL14セットに付いてくるWindows用ソフトELLOを使えば可能です。私は1台目はアドレス0のままで、2台目を1と設定しました。
**実際の使用
#image(https://mkanzaki.sakura.ne.jp/images/ELL14+object-lens.png,right,20%)
 最近、顕微ラマン装置で1/2波長板や1/4波長板を使うために対物レンズのすぐ上にELL14を取り付ける必要があって、どのようにしたら良いか試行錯誤してみました。
 1つの方法は上記のようにELL14の固定には30/60 mm変換プレートが2枚を使い、それの60 mm側を使ってELL14基板を両側から6 mmロッドで挟んでいます(長めのネジを使ってます)。右の写真のケースです。対物レンズは下側の30/60 mm変換プレートのSM1ネジにねじ込むことで取り付けられます(このSM1ネジはミツトヨレンズのネジと本当は全く同じではないのですが、非常に似ているので実際的にはねじ込んで問題ありません)。このユニットの上側はケージブロック(ビームスプリッターが入る)に接続しますが、それには6 mmロッドをねじ込んで、6 mmロッドを30/60変換プレートの30 mmケージ側で支持することになります。
 別の可能性は30/60 mm変換プレートは下側に1枚だけ使って、上のケージブロック側との接続は4 mmロッドと6 mmロッドを繋いで、4 mm側をELL14の30 mmのケージ穴に、6 mmロッド側をケージブロック側の接続に使うことです。4 mmの方での固定は落下しないか気になりますが。
 レンズをELL14に直接ネジ込むこともできるのですが、うちで使っているミツトヨの超長作動距離レンズは重くてモーターに負担がかかりすぎるので、この方法は無理だと思います。
 上下の3つ写真はELL14と対物レンズからなるユニットの取り付け状況を示しています(全て30/60変換プレート2枚使った場合)。一番下の写真では1/2波長板がELL14の内ネジ部分に固定されて入ってます。30/60 mm変換プレートとしては在庫の6 mm厚を使ってますが、強度的に不安があるので、1/2インチ厚のものがいいかもしれません(現在注文してます)。実際に使ってみて良い方にする予定です。
#image(https://mkanzaki.sakura.ne.jp/images/ELL14+object-lens2.png,right,20%)
 元々対物レンズはケージキューブにねじ込んでいたので、このユニットはそのキューブに取り付けることになります。このケージキューブは下側にロッド用のネジ穴があるので、短いロッド4本を取り付けて、それをユニットの上側の30/60 mm変換プレートの30 mm側に挿入して固定します。これで一応使えるはずです。短いロッド4本がちょうどなかったので、現在注文中。実際のテストはそれらが届いてから…。このユニットを使うと対物レンズ位置が35 mm程度下に移動するので、それに応じて試料位置を低くする必要があります。
 元々対物レンズはケージキューブにねじ込んでいたので、このユニットはそのキューブに取り付けることになります。このケージキューブは下側にロッド用のネジ穴があるので、短いロッド4本を取り付けて、それをユニットの上側の30/60 mm変換プレートの30 mm側に挿入して固定します。これで一応使えるはずです。短いロッド4本がちょうどなかったので、現在注文中。実際のテストはそれらが届いてから…。このユニットを使うと対物レンズ位置が35 mm(1/2"厚の変換プレートだと45 mm)程度下に移動するので、それに応じて試料位置を低くする必要があります。
#image(https://mkanzaki.sakura.ne.jp/images/ELL14+object-lens3.png,center,25%)