OPL 株式会社 オプトライン

English

技術情報

2019.11.26Thorlabs自動ステージをPythonで動かす

自動ステージをPythonで制御する方法についてシェアしたいと思います。

PythonでThorlabs Inc.の自動ステージを制御する方法について書かれている記事は探してもありませんでした。

 

ですので、自分で書こうと思い、試行錯誤して得たノウハウのエッセンスを記事にしています。
今回使う自動ステージはThorlabas Inc.のステージです。このステージは同社顕微鏡に組み込むことができます。
自作顕微鏡は拡張性があるため、自由度が広がります。計測と解析を一元化することで、アナログな顕微鏡観察を自動化し、
多変量データ解析をシームレスに導入できるでしょう。

 

motorizedminiinverted

 

Thorlabs自動ステージ挙動

 

開発環境

– Windows10 (x64)
– Python3.6
– Anaconda3
– MSL-Equipment

 

使用する機材

– 小型ステッピングモーター ZFS25B(Thorlabs Inc.)

single_stage_actuator_a3-500

 

– ステッピングモーターコントローラKST101(Thorlabs Inc.)

8121_kst101_sg

 

– コントローラーハブ KCH301(Thorlabs Inc.)

kch301_horizontal_brackets-300

 

インストール

Thorlabs Inc.自動ステージを動かすためには以下の2つが必要です。

 

こちらからkinesisをインストールします。

kinesisは、ローカルPC環境に合わせてバージョンを選んでください。GUIベースのアプリケーションがついてきますが、

今回は使わず`Thorlabs.MotionControl.KCube.StepperMotor.dll`が以下のディレクトリに保存されていれば問題ありません。

C:/Program Files/Thorlabs/Kinesis

 

今回は、Windows10のx64なので、Kinesis 64-Bit Software for 64-Bit Windowsを選択します。

kinesis

インストール中

kinesis_install_window

完了。

 

 

Thorlabas自動ステージを制御するためのモジュールMSL-Equipmentをインストールします。
このライブラリはニュージーランドの研究機関Measurement Standards Laboratory of New Zealandが無償で公開しています。

 

まず、以下のコマンドをコピペして実行しましょう。

pip install https://github.com/MSLNZ/msl-equipment/archive/master.zip

例えば、次のようにAnaconda promptなどで実行してみましょう。

installation

インストールが完了しました。準備完了ですね。

 

インストール手順(原文)

https://msl-equipment.readthedocs.io/en/latest/install.html

 

動作確認

サンプルプログラムは以下のディレクトリから`kst101.py`を探します。

C:\Users\あなたのユーザーネーム\anaconda3\Lib\site-packages\msl\examples\equipment\resources\thorlabs

下のプログラムをコピペしてもいいでしょう。

さて、サンプルプログラムを眺めてみます。
serial=’26001809′の部分を自分が使っているデバイスのシリアル番号に変えるだけで動きそうですね。

“`kst101.py

“””
This example shows how to communicate with Thorlabs KST101, KCube Stepper Motor.
“””

# this “if” statement is used so that Sphinx does not execute this script when the docs are being built
if __name__ == ‘__main__’:
    import os
    from pprint import pprint

    from msl.equipment import EquipmentRecord, ConnectionRecord, Backend

    # ensure that the Kinesis folder is available on PATH
    os.environ[‘PATH’] += os.pathsep + ‘C:/Program Files/Thorlabs/Kinesis’

    # rather than reading the EquipmentRecord from a database we can create it manually
    record = EquipmentRecord(
        manufacturer=’Thorlabs’,
        model=’KST101′,
        serial=’26001809′,  # update the serial number for your KST101
        connection=ConnectionRecord(
            backend=Backend.MSL,
            address=’SDK::Thorlabs.MotionControl.KCube.StepperMotor.dll’,
        ),
    )

    def wait(value):
        motor.clear_message_queue()
        message_type, message_id, _ = motor.wait_for_message()
        while message_type != 2 or message_id != value:
            position = motor.get_position()
            real = motor.get_real_value_from_device_unit(position, ‘DISTANCE’)
            print(‘  at position {} [device units] {} [real-world units]’.format(position, real))
            message_type, message_id, _ = motor.wait_for_message()

    # connect to the KCube Stepper Motor
    motor = record.connect()
    print(‘Connected to {}’.format(motor))

    # load the configuration settings (so that we can use the get_real_value_from_device_unit() method)
    motor.load_settings()

    # start polling at 200 ms
    motor.start_polling(200)

    # home the device
    print(‘Homing…’)
    motor.home()
    wait(0)
    print(‘Homing done. At position {} [device units]’.format(motor.get_position()))

    # move to position 100000
    print(‘Moving to 100000…’)
    motor.move_to_position(100000)
    wait(1)
    print(‘Moving done. At position {} [device units]’.format(motor.get_position()))

    # move by a relative amount of -5000
    print(‘Moving by -5000…’)
    motor.move_relative(-5000)
    wait(1)
    print(‘Moving done. At position {} [device units]’.format(motor.get_position()))

    # jog forwards
    print(‘Jogging forwards by {} [device units]’.format(motor.get_jog_step_size()))
    motor.move_jog(‘Forwards’)
    wait(1)
    print(‘Jogging done. At position {} [device units]’.format(motor.get_position()))

    # stop polling and close the connection
    motor.stop_polling()
    motor.disconnect()

    # you can access the default settings for the motor to pass to the set_*() methods
    print(‘\nThe default motor settings are:’)
    pprint(motor.settings)
kst101の背面に8桁のシリアル番号がありました。
inkeddsc_3657_li

上のプログラムのserial=’26001809′serial=’26002319′に変更します。
プログラムを実行して動作したら完成です。

 

その他ご不明点についてのお問合せは、下記フォームよりお気軽にご連絡ください。

http://www.opto-line.co.jp/contact/