Teaching the gripper paddle positions
How to teach the gripper paddle positions and configuring the gripper module.
This guide explains the teaching process of the CO-RE gripper positions on the MFX CO-RE gripper carrier and how the gripper module is configured, activated, and deactivated.
Prerequisites
- A switched on Microlab STAR device
- A running Microlab STAR connector
- An MFX CO-RE gripper carrier with two gripper paddles
- At least two installed pipetting channels
- Understanding of basic movement of the pipetting channels as described in the Positioning and movement guide
Get deck x-dimensions
Instantiate a liquid handler instance and initialize the device. This will load the device configuration from the device's firmware. The configuration is set up during the initial hardware installation of the device. In case the configuration does not match the actual device state, it can be adjusted with the UniteLabs SDK, but we strongly advise to consult with the vendor.
The configuration can be viewed via the await hamilton.get_configuration()
method. To quickly hone in on the x-coordinate of the gripper position, we check the following entries:
>>> await hamilton.get_configuration()
{
...
'waste_x': Decimal('1340.0'),
'waste_direction': 'right',
'min_x': Decimal('360.0'),
'max_x': Decimal('1140.0'),
...
}
In most cases, the (fixed) carrier is located between the last track and the trash position, i.e. the max_x
and the
waste_x
respectively.
The following table provides some references of some device instances:
Model | Gripper Position 1 | Gripper Position 2 |
---|---|---|
Microlab STARlet | x=796, y=105, z=225 | x=796, y=79, z=225 |
Microlab STARlet (2009) | x=797, y=124.3, z=234.7 | x=797, y=106.3, z=234.7 |
Microlab STAR | x=1338.1, y=125, z=235 | x=1338.1, y=106.5, z=235 |
We can check that the gripper is not configured by running hamilton.core_gripper.park_location
, resulting in:
(Vector(x=Decimal('0'), y=Decimal('0'), z=Decimal('0')),
Vector(x=Decimal('0'), y=Decimal('0'), z=Decimal('0')))
❗️Warning
Never activate the gripper without configuring the positions. This may crash the pipetting channels!
Channel selection and teaching
Typically, the two channels closest to the cover are used, which correspond to the last two channels with the highest indices, which may vary depending on the number of channels installed. Before we start the teaching process, we clear the y-range to move the other channels out of the way and start with the foremost channel. For an 8-channel setup, we use the following:
hamilton.api.min_traverse_height = 282.5
await hamilton.api.disable_cover_control()
await hamilton.pipettes.activate()
await hamilton.pipettes.clear_y_range(channels=[7])
await hamilton.pipettes.api.set_z_positions_to_safety()
We can always check the current location of the channels by using:
await hamilton.pipettes.current_locations()
for all locations at once or
await hamilton.pipettes.api.get_z_positions()
await hamilton.pipettes.api.get_x_position()
await hamilton.pipettes.api.get_y_positions()
for the individual directions.
After checking that the deck is clear of any obstructions, the arm is moved to the approximate location. In this case the waste_x-coordinate of a STAR model is used.
await hamilton.pipettes.api.set_x_position(x_position=1340.0)
Alternatively, the move_to
method can be used to specify a new location in x-, y-, z-coordinates:
from unitelabs.labware import Vector
await hamilton.pipettes[7].move_to(Vector(x=1340.0, y=125, z=334.7))
We can use the move_by
method to hone in on the exact x-, y-, and z-location just above the gripper paddles.
from unitelabs.labware import Vector
await hamilton.pipettes[7].move_by(Vector(y=10))
await hamilton.pipettes.api.get_y_positions()
for z:
await hamilton.pipettes[7].move_by(Vector(z=-10))
await hamilton.pipettes.api.get_z_positions()
and for x respectively:
await hamilton.pipettes[3].move_by(Vector(x=0.1))
await hamilton.pipettes.api.get_x_position()
Repeat this process until all axes are aligned. The x- and y-position must align with the center of the paddle hole, whereas the bottom of the channel must align with the upper brim of the paddle hole.
Repeat this for position 2. The same channel is used for teaching although for configuration, the second gripper channel is used.
Configuration and usage
await hamilton.core_gripper.configure(park_location=(Vector(x=1338.1, y=125, z=235), Vector(x=1338.1, y=106.5, z=235)), channels=(6, 7))
❗️Warning
The coordinates used for configuration must be adjusted and validated for each device individually. Don't use the coordinates above. Use the coordinates identified during the above teaching procedure. If not specified correctly, the pipetting channel may crash during pick-up!
When activating the gripper, the dedicated channels will move to the pickup location to pick up the gripper paddles. Make sure the traverse height is set safely according to your deck layout.
await hamilton.core_gripper.activate()
In case the pick-up failed on the first try, adjust the z-direction to allow for a bit more space between the upper brim of the hole and the channel bottom. To reset the state, drop the paddles using:
await hamilton.core_gripper.drop_gripper()
and put the paddles back into their original position.
Once finished, await hamilton.core_gripper.deactivate()
will put the paddles back into their position automatically.