Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Thorlabs Kinesis Piezo Controllers #10

Open
ps3017 opened this issue Jun 27, 2024 · 2 comments
Open

Support for Thorlabs Kinesis Piezo Controllers #10

ps3017 opened this issue Jun 27, 2024 · 2 comments

Comments

@ps3017
Copy link

ps3017 commented Jun 27, 2024

Hi,

if I understand correctly only DC and Stepper motor controllers are currently supported with Kinesis in the motorThorlabs module. I'm working on an application where I need to integrate a Kinesis Piezo motor controller (KIM101) with motorRecord.

Would you be willing to also add an EPICS motor driver support for Thorlabs Kinesis Piezo motor controllers? If yes, could you give me an approximate time frame how long it would take to add this to the motorThorlabs module?

I appreciate any help you can provide.

Best regards,
Petra Smid

@kmpeters
Copy link
Contributor

EPICS motor driver development is usually driven by those who have the hardware and need it to work. As far as I know the organizations I support don't have any Kinesis piezo motor controllers and consequently I won't be allowed to develop a driver for the KIM101 in the foreseeable future.

@keenanlang, the author of the existing Kinesis support, might be able to comment on how much effort it would take to adapt the existing support for the KIM101.

@keenanlang
Copy link
Contributor

@ps3017

The way the Kinesis C++ libraries are written, each different class of motors have their own functions to call, so each needs to be their own controller in the code. We wrote the DC and Stepper controllers because those were the models that we have. We don't have any KIM101 motors to test things out, but you should be able to set up support for them yourself. The layout of the kinesis support is written in a way to make it relatively easy to add support for the other categories of KCube motors.

You can copy-paste the contents of drvKinesisStepper.cpp or drvKinesisDC.cpp into a new file, replacing all of the "Stepper/DC" naming conventions with your own (Piezo, Inertial, etc). At the top of the file, there is an include line, you would replace that with the one for the KIM101

#include "Thorlabs.MotionControl.KCube.DCServo.h"
#include "Thorlabs.MotionControl.KCube.InertialMotor.h"

Then do a find/replace to change the function call prefixes in the file to the KIM_ prefix that the KIM101 uses

CC_Close(this->serial)
KIM_Close(this->serial)

In drvKinesis.h, you will then need to add the class template, this is again a copy/paste/replace operation using the naming convention you chose before.

class epicsShareClass KinesisDCMotorAxis : public KinesisAxis
class epicsShareClass KinesisPiezoMotorAxis : public KinesisAxis

and add in the option to the Enum in that file

enum
{
	KINESIS_DC_MOTOR,
	KINESIS_STEP_MOTOR,
	KINESIS_PIEZO_MOTOR,
};

In drvKinesis.cpp, you'll need to tell it to recognize that option in the constructor

if      (type == KINESIS_DC_MOTOR)    { new KinesisDCMotorAxis(this, 0, serial); }
else if (type == KINESIS_STEP_MOTOR)  { new KinesisStepMotorAxis(this, 0, serial); }
else if (type == KINESIS_PIEZO_MOTOR) { new KinesisPiezoMotorAxis(this, 0, serial); }

Then bind that option to a string, so users can designate the type in the startup script

if (motor_type == "dc" || motor_type == "DC")
{ 
    new KinesisController(asyn_port, serial, KINESIS_DC_MOTOR, movingPollPeriod, idlePollPeriod);
}
else if (motor_type == "stepper" || motor_type == "Stepper" ||
         motor_type == "step" || motor_type == "Step")
{
    new KinesisController(asyn_port, serial, KINESIS_STEP_MOTOR, movingPollPeriod, idlePollPeriod);
}
else if (motor_type == "piezo" || motor_type == "Piezo")
{
    new KinesisController(asyn_port, serial, KINESIS_PIEZO_MOTOR, movingPollPeriod, idlePollPeriod);
}

Then, finally, you just need to tell the Makefile to include your new files and the proper vendor DLL

Thorlabs.MotionControl.KCube.IntertialMotor_DIR += $(THORLABS_DIR)
ThorLabs_DLL_LIBS += Thorlabs.MotionControl.KCube.InertialMotor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants