-
Notifications
You must be signed in to change notification settings - Fork 5
Verifying hardware operation
Once you have the hardware assembled and connected to the PC it is time to check that it functions correctly.
Before proceeding, clone the master
branch of BakingTray and add its code directory and all sub-directories to the MATLAB path.
It is best to do this with a setup.m
file containing the line of this sort: addpath(genpath('C:\MATLAB\BakingTray\code'))
This way you are robust to the possible changes of the directory structure in the future.
The pathtool
GUI will also work if you prefer.
Once this is done, you should work through the following and ensure that you can communicate with each piece of hardware.
Make a note of which classes you need to use and any communication details, such as COM port numbers.
BakingTray communicates with the laser in order to stop acquisition should it drop out of modelock. Available laser control classes are in the components/laser directory. Let us say you have a Chameleon laser and it is connected to your motherboard serial port, COM1. The following sample session confirms we can connect to the laser and demonstrates some features of the laser control class.
>> c=chameleon('COM1');
Setting up Chameleon laser communication on serial port COM1
Connected to Chameleon laser on serial port COM1
>> [~,status]=c.isReady
status =
'Laser not powered on'
% So let's turn on the laser with the key switch...
% Test if laser shutter is open (0 means it's closed, 1 means it's open)
>> c.isShutterOpen
ans =
0
>> c.openShutter; % Let's open the shutter
>> c.isShutterOpen
ans =
1
% Yep, shutter is now open
% Let's read and then change the wavelength
>> c.readWavelength
ans =
920
>> c.setWavelength(940);
>> c.readWavelength
Failed to read wavelength from Chameleon. Likely laser is tuning.
ans =
NaN
% Wait 5 seconds...
>> c.readWavelength
ans =
940
% Nice
% Close communications with the laser
>> delete(c)
Disconnecting from Chameleon laser
Closing serial communications with Chameleon laser
Most vibratomes consist of a DC motor that turns a cam which produces lateral motion of an assembly that in turns holds the blade. You will now ensure you can set the vibratome to run at a desired speed and also stop the vibratome. Attache the blade holder to the vibratome as you would for normal operation. You should try a range of speeds and choose the fastest speed that doesn't cause nasty resonances (you'll hear them). The following sample session demonstrates this with the Faulhaber MCDC motor controller, with which we interface via a serial connection.
>> f=FaulhaberMCDC('COM2');
Setting up Faulhaber MCDC3006 DC motor controller.
Motor max speed: 60 revs per second.
%Let's start a gentle vibration
>> f.startVibrate(7); % You should now see a modest vibration of the blade
>> f.stopVibrate; % And we stop it
% Try a range of speeds and stop once it becomes more noisy
>> f.startVibrate(10); % quiet
>> f.startVibrate(11); % quiet
>> f.startVibrate(12); % still quiet
>> f.startVibrate(13); % Getting loud
>> f.startVibrate(12); % <--- This is the setting we'll use
>> f.stopVibrate;
% Terminate the session
>> delete(f)
Closing connection to Faulhaber MCDC motor controller
The X/Y/Z sample translation stage is pushed up and down by what we will refer to as a Z-jack, to distinguish it from any stage that might be driving the objective. You will now ensure that you can connect to the motor controller and issue motion commands. Some motor controllers (such as that on the TC1000) are calibrated stepper motor drivers and so you will also need to measure how many motor pulses there are per mm. Since this is the more complicated scenario, this is what will be demonstrated here.
Before proceeding with this step ensure the area surrounding the stage is clear of obstructions.
Remove the objective, the water bath, and the blade holder.
The motion control classes page describes how BakingTray handles motion control hardware.
Briefly, each physical motion axis consists of a linear stage and a controller for that stage.
BakingTray represents these as separate software entities: a class that inherits linearstage
represents the stage and a class that inherits linearcontroller
represents the stage controller.
To connect to the TC1000 Z-jack from the command line we first need to build the stage class then attach it to the controller:
% Make an instance of the Haydon 43k4U linear stage class
>> tStage=haydon43K4U
tStage =
haydon43K4U with properties:
positionUnits: 'mm'
axisID: ''
invertDistance: 1
positionOffset: 0
controllerUnitsInMM: 1
axisName: []
minPos: []
maxPos: []
% That creates an instance of the class. This instance needs to be
% populated with reasonable settings:
>> tStage.minPos=0;
>> tStage.maxPos=40;
>> tStage.axisName='zAxis';
>> tStage.controllerUnitsInMM=1.5305E-4; % We'll show how to derive this later
Now it's time to make an instance of the controller.
% The controller class for this Z-jack is an AMS_SIN11. Let's make an instance of
% that and attach it to the stage we just made:
>> A = AMS_SIN11(tStage);
% The following command will connect to the device and then immediately start
% a downward reference motion until it reaches the lower limit switch. This will
% be considered the zero position. Locations upward from this are positive.
% YOUR SYSTEM MUST HAVE FUNCTIONAL LIMIT SWITCHES FOR THE REFERENCING MOVE TO WORK
>> A.connect('COM8');
Device returned:
K= 5/ 3,I= 2001/ 1,V= 10014/ 1,E= 100,,1/10thn=A
Homing axis on AMS_SIN11..
% Indeed it considers itself to be at 0 mm
>> A.axisPosition
ans =
0
>> A.absoluteMove(10); %move up 10 mm
>> A.axisPosition
ans =
10.0000
% Do not disconnect yet from the device.
The stepper motor controller instructs the motor how many steps to take, it doesn't know anything about the number of mm the actuator has travelled. The conversion factor of mm to steps was defined above as:
tStage.controllerUnitsInMM=1.5305E-4;
This value is correct for our hardware but you should derive it again here. For this you will need a Mitoyo measuring gauge sold by ThorLabs and an arm of some sort to clamp it to. You can clamp to the thicker portion with a 9.5 mm diameter right below the main body (see the ThorLabs CAD PDF from the link above).
>> A.absoluteMove(10);
>> A.attachedStage.controllerUnitsInMM=1; % scaling factor is now one to one
>> A.attachedStage.maxPos=1E6; % Otherwise the controller will refuse to move the axis
Now set to the measuring gauge and make a note of the reading
The TC1000 has two limit switches on the Z-Drive. They are located to to the rear of the stage and look like yellow push-buttons. The sensors work using induction and so don't touch any moving parts. When the stage passes these locations the motor controller automatically stops the motor. We will be using the lower limit switch as a reference point so we need to ensure it's reliable. Cautiously lower the stage until it reaches the lower limit switch: you should find eventually the stage will fail to move down any further.
The X/Y sample stages translate the sample during a tile scan and drive the sample into the blade during cutting.
The PIFOC will be controlled by ScanImage but now is a good time to get to know it and ensure it's behaving well. Mount the objective you will be using into the PIFOC and start ScanImage.
Installation: Getting Started
Hardware requirements
Setting up: Overview
Verifying hardware operation
Starting BakingTray
Setting up ScanImage
Settings Files
Achieving high stitching accuracy
Installation: Calibration
Basic calibrating procedures
Calibrating the stages
Fine-tuning positioning accuracy
Further User Instructions
FAQ
Problems & Solutions