Opentrons Heater-Shaker Module - temperature control (37-95°C) with orbital mixing (200-3000 rpm) for cell culture, enzymatic reactions, and sample preparation requiring simultaneous heating and...
The Heater-Shaker Module combines precise temperature control (37-95°C) with orbital shaking (200-3000 rpm) for automated protocols requiring simultaneous heating and mixing. Ideal for cell culture incubation, enzymatic reactions, bacterial transformations, and any workflow needing temperature-controlled agitation.
Core value: Automate temperature-sensitive mixing protocols with reproducible timing and conditions. Replace manual incubator transfers with on-deck temperature control.
Use the Heater-Shaker skill when:
Don't use when:
| Operation | Method | Key Parameters |
|---|---|---|
| Load module | protocol.load_module() |
"heaterShakerModuleV1", location |
| Set temperature (blocking) | set_and_wait_for_temperature() |
celsius (37-95) |
| Set temperature (non-blocking) | set_target_temperature() |
celsius |
| Wait for temperature | wait_for_temperature() |
- |
| Start shaking (blocking) | set_and_wait_for_shake_speed() |
rpm (200-3000) |
| Stop shaking | deactivate_shaker() |
- |
| Stop heating | deactivate_heater() |
- |
| Open latch | open_labware_latch() |
- |
| Close latch | close_labware_latch() |
- |
| Check status | .current_temperature, .current_speed |
- |
from opentrons import protocol_api
metadata = {'apiLevel': '2.19'}
def run(protocol: protocol_api.ProtocolContext):
# Load Heater-Shaker in deck slot
hs_mod = protocol.load_module("heaterShakerModuleV1", location="D1") # Flex
# hs_mod = protocol.load_module("heaterShakerModuleV1", location="1") # OT-2
Two-step approach (recommended):
# Load adapter first, then labware
hs_adapter = hs_mod.load_adapter("opentrons_96_flat_bottom_adapter")
hs_plate = hs_adapter.load_labware("nest_96_wellplate_200ul_flat")
Available adapters:
opentrons_96_flat_bottom_adapter - Universal flat-bottom platesopentrons_96_pcr_adapter - PCR plates and stripsopentrons_96_deep_well_adapter - Deep-well platesopentrons_universal_flat_adapter - Custom flat-bottom labwarePre-configured combinations (legacy):
# Load labware directly (adapter implicit)
hs_plate = hs_mod.load_labware("nest_96_wellplate_200ul_flat")
The labware latch MUST be closed for shaking operations.
# Close latch before shaking
hs_mod.close_labware_latch()
# Open latch for pipetting or gripper access
hs_mod.open_labware_latch()
Important:
Protocol waits until temperature is reached before continuing:
# Set temperature and wait
hs_mod.set_and_wait_for_temperature(celsius=37)
# Perform operations at target temperature
protocol.delay(minutes=10)
# Turn off heater
hs_mod.deactivate_heater()
Temperature range:
Set target temperature and continue with other operations while heating:
# Start heating (non-blocking)
hs_mod.set_target_temperature(celsius=75)
# Perform pipetting while heating
pipette.transfer(100, source, hs_plate.columns()[0])
# Wait for temperature before critical step
hs_mod.wait_for_temperature()
# Now at target temperature
protocol.delay(minutes=5)
Use case: Parallel pipetting during heating to save time.
# Get current temperature
current_temp = hs_mod.current_temperature
# Log temperature
protocol.comment(f"Heater-Shaker at {current_temp}°C")
# Close latch first (required)
hs_mod.close_labware_latch()
# Start shaking and wait to reach speed
hs_mod.set_and_wait_for_shake_speed(rpm=500)
# Shake for specific duration
protocol.delay(minutes=5)
# Stop shaking
hs_mod.deactivate_shaker()
# Open latch for pipetting access
hs_mod.open_labware_latch()
Speed range:
# Get current speed
current_speed = hs_mod.current_speed
if current_speed > 0:
protocol.comment(f"Shaking at {current_speed} rpm")
Recommended speeds by application:
Note: Higher speeds increase risk of splashing and cross-contamination.
# Set temperature first
hs_mod.set_and_wait_for_temperature(celsius=37)
# Then start shaking
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=400)
# Incubate with heating and shaking
protocol.delay(minutes=30)
# Stop shaking, then heating
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
hs_mod.deactivate_heater()
# Start heating (non-blocking)
hs_mod.set_target_temperature(celsius=42)
# Prepare samples while heating
pipette.transfer(100, samples, hs_plate.wells())
# Wait for temperature
hs_mod.wait_for_temperature()
# Start shaking
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=600)
# Incubate
protocol.delay(minutes=20)
# Cleanup
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
hs_mod.deactivate_heater()
Note: The Heater-Shaker cannot cool below 37C. Use a Temperature Module for ice incubation and heat shock steps, then transfer to the Heater-Shaker for the 37C recovery with shaking.
# Ice incubation and heat shock on Temperature Module
temp_mod.set_temperature(celsius=4)
protocol.delay(minutes=20) # Ice incubation
temp_mod.set_temperature(celsius=42)
protocol.delay(seconds=45) # Heat shock
# Transfer plate to Heater-Shaker for recovery
temp_mod.deactivate()
protocol.move_labware(plate, hs_mod, use_gripper=True)
# Recovery at 37C with shaking
hs_mod.set_and_wait_for_temperature(celsius=37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=300)
protocol.delay(minutes=60)
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
hs_mod.open_labware_latch()
# Pre-warm to reaction temperature
hs_mod.set_and_wait_for_temperature(celsius=37)
# Add enzyme while at temperature
hs_mod.open_labware_latch()
pipette.transfer(10, enzyme, hs_plate.wells(), mix_after=(3, 50))
# Incubate with gentle mixing
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=300)
protocol.delay(minutes=30)
# Stop reaction - transfer to Temperature Module for cooling
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
hs_mod.open_labware_latch()
# Use Temperature Module for cooling below 37C
# protocol.move_labware(hs_plate, temp_mod, use_gripper=True)
# temp_mod.set_temperature(celsius=4)
# Incubate with antibody
hs_mod.set_and_wait_for_temperature(celsius=37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=400)
protocol.delay(minutes=60)
# Stop for washing
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
# Wash steps
for _ in range(3):
# Remove liquid
pipette.transfer(200, hs_plate.wells(), waste, new_tip="always")
# Add wash buffer
pipette.transfer(200, wash_buffer, hs_plate.wells())
# Mix
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=500)
protocol.delay(seconds=30)
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
hs_mod.deactivate_heater()
# Resuspend magnetic beads
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=1200)
protocol.delay(minutes=2)
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
# Transfer to magnetic module for separation
protocol.move_labware(hs_plate, mag_block, use_gripper=True)
# Gradual temperature increase
for temp in [25, 35, 45, 55, 65]:
hs_mod.set_and_wait_for_temperature(temp)
protocol.delay(minutes=5)
hs_mod.deactivate_heater()
For holds requiring exact elapsed time:
import time
# Set conditions
hs_mod.set_and_wait_for_temperature(celsius=37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=500)
# Track elapsed time
start_time = time.monotonic()
# Perform operations
# ... your protocol steps ...
# Calculate remaining time
elapsed = time.monotonic() - start_time
remaining = max(0, (10 * 60) - elapsed) # 10 minutes total
# Complete the hold
protocol.delay(seconds=remaining)
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
hs_mod.open_labware_latch()
# Heat/shake on Heater-Shaker
hs_mod.set_and_wait_for_temperature(celsius=37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=400)
protocol.delay(minutes=30)
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
# Open latch BEFORE gripper operation
hs_mod.open_labware_latch()
# Move plate to next module
protocol.move_labware(hs_plate, magnetic_block, use_gripper=True)
Height restrictions:
8-channel pipette restrictions:
Example valid OT-2 layout:
# Heater-Shaker in slot 4
hs_mod = protocol.load_module("heaterShakerModuleV1", "4")
# Adjacent slots 1, 5, 7 - keep empty or use tip racks
tips_1 = protocol.load_labware("opentrons_96_tiprack_300ul", "1") # OK
tips_5 = protocol.load_labware("opentrons_96_tiprack_300ul", "5") # OK
# Use non-adjacent slots for plates
plate_2 = protocol.load_labware("corning_96_wellplate_360ul_flat", "2")
plate_3 = protocol.load_labware("corning_96_wellplate_360ul_flat", "3")
❌ Shaking with open latch:
hs_mod.open_labware_latch()
hs_mod.set_and_wait_for_shake_speed(500) # Error: latch must be closed
✅ Correct:
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(500)
❌ Gripper movement without opening latch:
protocol.move_labware(hs_plate, "C1", use_gripper=True) # Error: latch closed
✅ Correct:
hs_mod.open_labware_latch()
protocol.move_labware(hs_plate, "C1", use_gripper=True)
❌ Not deactivating modules:
hs_mod.set_and_wait_for_temperature(37)
# Protocol ends - heater stays on!
✅ Correct:
hs_mod.set_and_wait_for_temperature(37)
# ... operations ...
hs_mod.deactivate_heater()
❌ Temperature out of range:
hs_mod.set_and_wait_for_temperature(celsius=25) # May error if ambient is >23.5°C
✅ Correct:
# Use Temperature Module for temperatures <37°C
temp_mod.set_temperature(celsius=25)
Module won't heat below 37°C:
Shaking command errors:
Pipette collisions (OT-2):
Temperature not stable:
Gripper cannot access:
# Incubate with beads on Heater-Shaker
hs_mod.set_and_wait_for_temperature(37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(400)
protocol.delay(minutes=10)
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
hs_mod.open_labware_latch()
# Move to Magnetic Block for separation
protocol.move_labware(hs_plate, mag_block, use_gripper=True)
protocol.delay(minutes=3) # Bead separation
# Pipette supernatant
pipette.transfer(150, hs_plate.wells(), waste.wells())
# Return to Heater-Shaker for resuspension
protocol.move_labware(hs_plate, hs_mod, use_gripper=True)
# Cool samples on Temperature Module
temp_mod.set_temperature(4)
protocol.move_labware(cold_plate, temp_mod, use_gripper=True)
# Heat and shake on Heater-Shaker
hs_mod.set_and_wait_for_temperature(65)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(600)
protocol.delay(minutes=15)
robotType: "Flex"opentrons - Main Opentrons Python API skillopentrons-temperature-module - Temperature-only control (4-95°C)opentrons-thermocycler - PCR thermal cyclingopentrons-magnetic-block - Magnetic bead separation (Flex)opentrons-gripper - Automated labware movement (Flex)