Skip to content

Manual Labware Deck Calibration (Slot Offset Recording)

Overview

When installing a Lab Automation Deck onto Jubilee, you must record the precise x/y offset positions for each slot to ensure reliable operation. This procedure steps through the full calibration process, including moving, probing, saving offsets, and generating a new calibrated deck configuration.

Note: You can use any tool to perform calibration, but a pipette tool with a tip installed is recommended for precision.

Pre-Conditions

  • Jubilee machine is powered on and connected.
  • A Lab Automation Deck (or other deck) is physically installed.
  • Machine is homed.
  • Pipette tool is available and loaded (or another precise tool).
  • A pipette tip is manually installed if using a pipette.

Steps

1. Connect to the Machine

Create a connection to the Jubilee machine.

python
from science_jubilee.machine import Machine

# Connect to the machine
m = Machine(address="192.168.1.2")

2. Drop Bed for Safety

Lower the bed to create room for movement.

python
m.move_to(z=150)

3. Load and Pick Up Tool

Load your calibration tool (typically a pipette).

python
from science_jubilee.tools import Tool

# Initialize and load the tool
tool = Tool(index=3, name="Pipette")
m.load_tool(tool)
m.pickup_tool(tool)

Important: If using a pipette, manually install a tip before continuing.

4. Set Up Calibration Metadata

Prepare basic deck metadata for calibration output.

python
deck_type = "Lab Automation Deck"
num_slots = 6
num_sharps_containers = 0
slot_type = "SLAS Standard Labware"
plate_material = "Aluminum"
mask_material = "Delrin"
offset_corner = "bottom_left"  # Corner without flexure
slot_data = {}

5. Define Slot Data Recording Function

Create a helper function to capture current machine position for each slot.

python
def set_slot_data(slot_index: int):
    position = m.get_position()
    slot_offset = [float(position['X']), float(position['Y'])]
    slot_data[slot_index] = slot_offset

6. Probe and Record Slot Positions

Move carefully to each slot, fine-tune manually, and record offsets.

General Movement Safety

  • Move approximately toward slot.
  • Slowly lower Z-axis using Duet Web Control (e.g., Z-5, then Z-0.5).
  • Adjust X and Y manually to align with the chosen corner (no flexure element).
  • Do not overshoot! Always lower Z cautiously.

Slot Calibration

Example for Slot 0:

python
# Move roughly near slot 0
m.move_to(x=30, y=30)

# Manually fine-tune position via Duet Web Control
# ...

# Save slot 0 offset
slot_index = 0
set_slot_data(slot_index)

# Raise bed before moving
m.move_to(z=100)

Example for Slot 1:

python
# Move ~140mm right to next slot
m.move(dx=140)

# Manually fine-tune again
# ...

slot_index = 1
set_slot_data(slot_index)
m.move_to(z=100)

Example for Slot 2:

python
m.move(dx=-140, dy=100)
# Fine-tune
slot_index = 2
set_slot_data(slot_index)
m.move_to(z=100)

(Repeat similarly for Slots 3, 4, and 5.)

Optional: Sharps Containers

If installed, record offset for sharps container manually.

python
# Move manually near sharps container
# ...

slot_index = -1
set_slot_data(slot_index)

7. Save Calibration File

After all offsets are collected, save the calibrated deck configuration.

python
from science_jubilee.machine import get_root_dir
from jinja2 import Environment, FileSystemLoader

# Define file name
file_name = "my-calibrated-deck"

deck_config_path = os.path.join(get_root_dir(), "science_jubilee", "decks", "deck_definition", f"{file_name}.json")

# Load calibration template
env = Environment(loader=FileSystemLoader("templates"))
template = env.get_template("lab_automation_deck_template.json")

# Render and write
calibration_contents = template.render(
    deck_type=deck_type,
    num_slots=num_slots,
    num_sharps_containers=num_sharps_containers,
    slot_type=slot_type,
    plate_material=plate_material,
    mask_material=mask_material,
    offset_corner=offset_corner,
    slot_data=slot_data,
)

with open(deck_config_path, 'w') as f:
    f.write(calibration_contents)

8. Remove Pipette Tip and Park Tool

Manually remove the tip (if used), then park the tool safely.

python
# Remove tip manually

# Park tool
m.park_tool()

Important Notes

  • Always move slowly and incrementally while lowering Z — crashes can damage tools.
  • Always touch the same corner for every slot (e.g., bottom_left).
  • Double-check that slots are aligned before saving calibration.
  • If machine loses connection mid-calibration, reconnect and continue.

Pre-release documentation · Internal research use only · Not authorized for redistribution.