Communicating with Thorlabs APT motor controllers
We recently added a Thorlabs DC motor controller to our scanning MOKE setup to automate the rotation of a waveplate. Our MOKE setup software is written in c++ using Qt, and we wanted to operate the motor from within the software. Thorlabs provides ActiveX controllers and detailed information on the communications protocol for the controller, but their sample videos on using the ActiveX controllers involve embedding the controls which we would rather not do, and communicating directly with the controller appears rather painful. Luckily, it turned out relatively easy to generate libraries and access individual methods from within Qt.
The first step is to generate a namespace from the appropriate ActiveX control with the dumpcpp tool. For us this was
dumpcpp MG17Motor.ocx -n APT -o APT
this generates two very long files APT.h and APT.cpp. In our project we add the ActiveX support with
Qt += axcontainer CONFIG += axcontainer
and in a new wrapper library we include “APT.h”. Now all we need to do is initialize an object of type MG17Motor in APT, shown here as a member of our class
class APTAngle { public: APTAngle(); void set(double angle); void init(); APT::MG17Motor motor; };
Then we can initialize our rotation stage with
void APTAngle::init() { motor.SetHWSerialNum(83853589); motor.StartCtrl(); motor.MoveHome(0,1); motor.MoveAbsoluteRot(0,61,61,3,1); }
and go to positions with
void APTAngle::set(double angle) { angle += 61.0; // offset for the half wave plate if (angle<360) { angle-=360; } motor.MoveAbsoluteRot(0,angle,angle,3,0); }