PythonでThorlabsのディレイステージを動かす

本記事にはBBD201というThrolabsのステージコントローラでオプティカルディレイステージ(DDS220)を動かす方法を記した。パッケージとかは作ってないが、色々試してうまくいかずようやくこの方法にたどり着いた。もし同じく困っている人がいればと思い、備忘録として書くことにした。なるべく細かく記したつもりであるが何か疑問などがあったらコメントいただければと思う。Pythonのthorlabs-apt-deviceモジュールを使うことで解決した。この方法で他のコントローラやステージもPythonでコントロールできるかもしれない。

# 経緯
　先日、ラボのパソコンが壊れてしまって復旧作業を行なった。弊ラボではLabViewを使用しているが、GUIプログラミングという謎仕様にアレルギーを発症してしまい、Pythonで書くことにした。最もな治療方法はLabViewを知ることであるが、2022年版を最後にサブスク型へ切り替えることにビジネスモデルを変えることになってしまった。故にラボの将来の運営を考えるとLabViewを知ることは所詮、対処療法に過ぎないだろうと思い、Pythonで書き直すことにした。

# 前提条件
Windows版のAnacondaをインストールして、Windowsのままconda環境を構築した。WindowsでPythonを動かすときはLinux環境を仮想構築するのが定石だが、ThorlabsのAPTやKinesisはWindows版しか提供されておらずAPTを介してデバイスに接続しているためWindows環境のままPythonを使用した(もしかたらLinuxでもできるかもしれないが検証していない)。

# Thorlabsのインターフェイス
 ラボでThorlabsの装置や光学部品を使用している。Thorlabsは色々とインターフェイスを提供しているので色々な言語で書くことができる。Pythonは公式にはサポートされていないため、C#で書くかC#で書いたものをPythonで呼び出す必要がある。本来は、自分でC#をある程度書いてPythonで呼び出す手法をとりたかったが、実験系の復旧を急がなければなかったのでPythonのみしか触っていない。

# thorlabs-apt-deviceとは
Pythonで光学系の装置を動かすとなると、Pylablibが最も馴染みがありそうだが、そもそもデバイスが認識されなかった。なので別のパッケージを探して[thorlabs-apt-device](https://thorlabs-apt-device.readthedocs.io/en/latest/index.html)というパッケージにたどり着いた。最終更新は7ヶ月前(24年10月時点)だったのである程度は保守されているはずである。Thorlabsが提供しているプロトコルのAPTの一部を使用することでPythonでも扱うことができるようになる。

# 1. APTのインストールと更新
APTがパソコンに入っていない場合、インストール必要がある。APTによってサーバーを構築してPythonから呼び出しを可能にしている。筆者の場合、すでにAPTが入っていたが古かったため接続できなかったので最新版が良いと思われる。

# 2. APT Configによる設定
　まずはAPT configを起動してAPT ActiveX Serverと呼ばれるものに動かしたい機器(この場合はBBD201)を登録する必要がある。仕様は理解していないが、APT configに登録することで仮想COMポート(後述)を呼び出してBBD201をpythonから操作することができる。Kinesisや他のソフトでアクセスしているとAPT config上で認識できないので注意すること。
 (1) Contrl unitの選択 をする。3Ch Brushless DC Driver(BBD303)を選択する。BBD201が既に販売終了して古いせいなのか、BBD201がリストに存在しない。BBD201は1 チャンネル仕様だがこれで動いた。
 (2) Serial numberを入力する。これは自分で6桁の数字を決める(機器のシリアル番号だと思って探したがどれも8桁なのでしばらく頭を抱えたので注意書きとして記す)
 (3)Addを選択する
 (4) Confiurationに任意で名前を入力してSet as current, Save, Loadを押す
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324863/06065db7-04f7-c5a9-c06a-3e1accef2373.png)
(5)Stageタブに移動してMotorの項目から該当のシリアル番号を選ぶ。この番号はコントローラでなく、ステージのシリアル番号である(Kinesisから見られる)。そしてStageをDDS220にする。Channelは1チャンネルである。そして、Add/Change Stage AssosiationをクリックしてExitを押してAPT　Configを終了する。
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324863/402c6dc4-968a-0cd0-57e3-ac4e1c7964aa.png)

# 3. APT Userで動作を確認する
APT Userというソフトウェアを起動してAPTがBBD201とステージを認識していることを確認する。繰り返しにはなるが、この時、Kinesisや他のソフトウェアを起動してステージをコントローラを使用していると認識できないので注意すること。
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324863/9cf35379-36ac-6804-cac6-c064c7ffac67.png)

# 4. Device Managerから仮想COMポート通信を有効にする
デバイスマネージャーを起動して、Universal USB Serial Bus controllersの項目にあるステージコントローラを見つける。APT USB Deviceって名前になっているかもしれないしそうでないかもしれないので注意。プロパティからAdvnadedのタブに行ってLod LCPにチェックをつける。こうすることで仮想COM Port通信が可能になる。この通信方法でPythonから操作している。チェックをつけてOKを押すことでPort (COM & LPT)の項目にAPT USB Device Serial Port(COMX)と表示されるはずである。COMのXはパソコンによって違う番号が割り当てられるはずである(番号は後で使う)。詳しい説明は[thorlabs-apt-deviceのチュートリアル](https://thorlabs-apt-device.readthedocs.io/en/latest/gettingstarted.html)を参考にされたい。
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324863/ef859727-bd06-da50-b110-5895173561a2.png)

# 5. thorlabs-apt-deviceのインストール
Anaconda prompotを起動する。先にcondaで仮想環境を作っておく。インストール方法は先ほど挙げたページにも書いてあるので書くほどでもないが
```
pip install --user --upgrade thorlabs-apt-device
```
でインストールできる。あるいはレポジトリのクローンをしてインストールする。
 pythonを起動して以下のコードを試してみる。
 ```
 from thorlabs_apt_device import BBD201

 stage = BBD201("COM4")
 ```
先ほど確認したCOM portの番号を上の例みたくいれる。実行後にエラーが出なければ認識できたはずである。この時、ステージのCalibrationが自動で実行されずはずである。 ()内は空の場合でも自動で接続するらしいができなかった。


# 6. ステージの操作
```
stage.home
```
でホームポジションにステージを移動できる。
```
stage.status
```
でステージの位置や移動速度などの情報を辞書型で取得できる。なのでstage.status["position"]などで特定の情報を取得できる。ホームポジションはDDS220 (220 mmステージ)の場合は2200000 (110.00000 mm)となっている。Python上で200000が1.00000 mmに相当することに注意してほしい。
```
stage.move_absolute(200000)
stage.move_relative(200000)
```
上は原点からの位置、下は2200000を基準としてステージを動かすことができる。起動時にCalibratonしてホームポジションを決めるので個人的にはホームポジションからの位置で指定した方が正確であるとは思う。ステージの移動速度などの設定などは[このページ](https://thorlabs-apt-device.readthedocs.io/en/latest/api/thorlabs_apt_device.devices.aptdevice_motor.html#thorlabs_apt_device.devices.aptdevice_motor.APTDevice_Motor.move_absolute)を参考にされたい。例えば110.0000 mmから2.5000 mm前に動かしたかったら
```
stage.move_relative(250000)
```
となるし後ろに進めたかったら
```
stage.move_relative(-250000)
```
というふうになる。動かした後にpythonを終了してKinesisやAPT Userでどこにあるの確認することをお薦める。位置のOffsetも設定できるようだが筆者は特にしていない。

# まとめ
特に書くことはないのだが、要約・導入・結果・考察・結論っていうスタイルが染み付いている身としては書かざるを得ない。BBD201をPythonで操作する記事を書いた。このモジュールは他のThorlab製のガジェットに使用できるようなのでPylablibが上手くいかないことがあったら使用するというのが良いかもしれない。Tkinterと連携することで、GUI上で位置や速度なども表示させることができるだろう。気が向いたら続くを書くかもしれない。こういった解説記事を初めて書いたのでわかりづらさがあったらご容赦願いたい。