UniteLabs

Tip Handling

Picking up and dropping tips with the Tecan Freedom EVO MCA96 head.
The Freedom EVO is supported in liquid handling SDK versions >=0.35.0.

The Freedom EVO's Multi-Channel Arm (MCA96) drives all 96 channels on a single plunger plate — every mounted channel aspirates and dispenses the same volume simultaneously. Unlike the Hamilton or Bravo heads, the MCA96 always picks up and puts down the full 96-tip set; there is currently no partial-tip (single column/row/tip) support.

Prerequisites

  • A switched on Tecan Freedom EVO device with a Multi-Channel Arm
  • A tip carrier with an EVO tip box loaded (see Deck & Carriers)
  • A running Tecan Freedom EVO connector
  • mca_discard_location set on the instrument configuration

Connect and Prepare the Deck

from unitelabs.sdk import AsyncApiClient
from unitelabs.labware import Vector
from unitelabs.labware.tecan import EvoTipBox_MCA_DiTi_200, EvoTip_MCA_DiTi_200, MP_4Pos_flat
from unitelabs.liquid_handling.tecan import TecanFreedomEvo, TecanFreedomEvoConfiguration

client = AsyncApiClient()

evo = TecanFreedomEvo(
    name="Tecan Freedom EVO",
    client=client,
    configuration=TecanFreedomEvoConfiguration(mca_discard_location=Vector(x=1000, y=100, z=100)),
)
await evo.configure()
await evo.initialize()
await evo.activate()

tip_carrier = MP_4Pos_flat()
tip_box = EvoTipBox_MCA_DiTi_200(identifier="TipBox_200uL")
tip_box.fill(EvoTip_MCA_DiTi_200)

tip_carrier[0] = tip_box
evo.deck.add(tip_carrier, track=7)

Pick Up Tips

pick_up_tips_from() positions channel A1 over the rack's first tip spot and runs the tip-fetch procedure for all 96 channels at once.

await evo.mca.pick_up_tips_from(rack=tip_box)

The pick-up Z bounds are derived automatically from the tip's own geometry. Optional parameters fine-tune the fetch:

  • offset: a Vector(dx, dy, dz) in mm to adjust the pick-up location.
  • z_search: how far above the tip the slow search motion starts, in mm (default 10).
  • pwm_limit: maximum force applied while fetching tips, 1-249 (default 65, the device default).
await evo.mca.pick_up_tips_from(rack=tip_box, z_search=15, pwm_limit=80)
pipette_head is a vendor-neutral alias for mca — both refer to the same MultiChannelArm instance, so evo.pipette_head.pick_up_tips_from(...) works identically.

Put Tips Back

Return all mounted tips into a rack at the position they were picked up from.

await evo.mca.put_down_tips_to(rack=tip_box)

If no tips are currently mounted, put_down_tips_to() logs a warning and returns without moving.

Discard Tips

Discard the currently mounted tips into the waste location configured as mca_discard_location.

await evo.mca.discard_tips()
discard_tips() raises a RuntimeError if mca_discard_location was never set on the configuration, and a ValueError if the configured location falls outside the head's reachable range.

Checking Tip State

tip = evo.mca.get()  # the tip type mounted on the first channel that holds one, or None

print(tip)
# <EvoTip_MCA_DiTi_200 ...>

Head Movement

Move the head (channel A1) directly, independent of any pipetting operation:

from unitelabs.liquid_handling.tecan import AxisSpeeds

await evo.mca.move_to(location=Vector(x=200, y=150, z=100))

# Override per-axis traverse speed (mm/s); unset axes use the configured default
await evo.mca.move_to(location=Vector(x=200, y=150, z=100), speed=AxisSpeeds(z=20))

await evo.mca.move_by(offset=Vector(z=-10))

current_location() returns the absolute deck-frame location of channel A1.

location = await evo.mca.current_location()

Troubleshooting