Hello World, “Hamilton Heater Shaker”!#
The Hamilton Heater Shaker is a HeaterShaker
machine that enables:
heating,
locking & unlocking, and
(orbital) shaking
…of plates (active cooling is not possible with this machine).
Temperature control = RT+5°C to 105°C (all variants)
Variants:
Cat. no.: 199027
shaking orbit = 1.5 mm
shaking speed = 100 - 1800 rpm
Cat. no.: 199033
shaking orbit = 2.0 mm
shaking speed = 100 - 2500 rpm
Cat. no.: 199034
shaking orbit = 3.0 mm
shaking speed = 100 - 2400 rpm
max. loading = 500 grams
Footprint: size_x = 146.2, size_y = 103.8, size_z=74.11
Setup Instructions (Physical)#
A Hamilton Heater Shaker (hhs) can be used through two different control interfaces:
a control box, called the
HamiltonHeaterShakerBox
: this supports connection of up to 8 heater shakers per control box, ORdirectly plugging the hhs into a Hamilton STAR liquid handler: STAR liquid handlers have 2 RS232 ports on their left side, and can therefore support up to 2 heater shakers simultaneously.
When using the heater shaker box control interface a USB-B cable is plugged into one of the heater shakers and connected to the host computer. This heater shaker is connected via a serial port to the control box. Other heater shakers are also plugged into the control box using serial cables, but not plugged into the computer. The first heater shakers serves as a gateway.
When using the Hamilton STAR interface, the Heater Shaker is connected via a serial interface:
Connection: STAR (RS232) ⇄ Host computer (USB-A)
The heater shaker is then controlled through the STAR Liquid Handler.
Setup Instructions (Programmatic)#
In either case, HamiltonHeaterShakerBackend
will be the backend and HeaterShaker
will be the frontend.
Depending on the interface you use, pass a different argument to HamiltonHeaterShakerBackend
.
hs_box_control:
As multiple heater shakers can be controlled through one USB connection to the computer (a cable to HHS 1 when using the control box), the index
of a specific heater shaker needs to be specified.
Note that this also requires turing a DIP switch on the bottom of the HHS module.
star_control:
Each heater shaker is connected via a separate cable to the STAR liquid handler.
The back RS232 port corresponds to index=1
and the front RS232 port corresponds to index=2
.
interface_choice = "star_control" # hs_box_control VS star_control
if interface_choice == "hs_box_control":
# Setting up a backend with the HamiltonHeaterShakerBox
from pylabrobot.heating_shaking import HamiltonHeaterShakerBackend, HamiltonHeaterShakerBox
control_interface = hhs_box = HamiltonHeaterShakerBox()
elif interface_choice == "star_control":
# Alternative: setting up a backend with a STAR
from pylabrobot.liquid_handling import LiquidHandler, STARBackend
from pylabrobot.resources import STARDeck
from pylabrobot.heating_shaking import HamiltonHeaterShakerBackend
control_interface = star_backend = STARBackend()
# Control via a STAR requires instantiation of the STAR liquid handler
lh = LiquidHandler(backend=star_backend, deck=STARDeck())
else:
raise ValueError(f"Interface choice invalid: {interface_choice}")
backend = HamiltonHeaterShakerBackend(
index=1,
interface=control_interface
)
from pylabrobot.heating_shaking import HeaterShaker
from pylabrobot.resources.coordinate import Coordinate
hs = HeaterShaker(
name="Hamilton HeaterShaker",
backend=backend,
size_x=146.2,
size_y=103.8,
size_z=74.11,
child_location=Coordinate(x=9.66, y=9.22, z=74.11),
)
Note that you will need to call hhs_box.setup()
before calling HeaterShaker.setup()
.
When using a STAR
, just use star.setup()
or, more likely, lh.setup()
.
This is opening the USB connection to the device you are using as an interface.
Note that setup should only be called ONCE:
when using a STAR as a liquid handler, just call
lh.setup()
. (Do not call it again when using the heater shaker.)when using multiple heater shakers with the control box, call
.setup()
once for the control box, and then callHeaterShaker.setup()
for each heater shaker. (Do not callsetup
again for the control box.)
if interface_choice == "hs_box_control":
# When using the HamiltonHeaterShakerBox, you need to call setup() on the box
await hhs_box.setup()
elif interface_choice == "star_control":
# Alternative: when using the STAR, you need to call setup() on lh
await lh.setup()
After calling setup
on your interface, call HeaterShaker.setup()
for each heater shaker machine.
This will initialize the HeaterShaker
machine itself.
await hs.setup()
Usage#
Heating Control#
await hs.get_temperature() # Temperature of sensor in the middle of the heater shaker in C
25.6
The HHS also supports reading the temperature at the edge of the heater shaker:
await hs.backend.get_edge_temperature()
25.7
await hs.set_temperature(37) # Temperature in degrees C
'T1TAid0004er00'
await hs.wait_for_temperature() # Wait for the temperature to stabilize
Shaking Control#
await hs.lock_plate()
await hs.shake(
speed=100, # rpm
direction=0, # seconds
acceleration=1000, # rpm/sec
)
await hs.stop_shaking()
await hs.unlock_plate()
Closing Connection to Machine#
await hs.stop()
Using Multiple Hamilton Heater Shakers#
1x hs_box - Multiple HHS#
When using multiple heater shakers, you can use the HamiltonHeaterShakerBackend
class to control them. This class will automatically handle the communication with the control box and the individual heater shakers.
As above, initialize the HamiltonHeaterShakerBox
class. Then, initialize as many HamiltonHeaterShakerBackend
classes as you want to control, specifying the index for each. Note that each HamiltonHeaterShakerBackend
gets the same instance of the HamiltonHeaterShakerBox
: this is because there is a single USB connection, managed by that instance.
control_interface = hhs_box = HamiltonHeaterShakerBox()
# HS1
backend1 = HamiltonHeaterShakerBackend(index=1, interface=control_interface)
hs1 = HeaterShaker(
name="Hamilton HeaterShaker",
backend=backend1,
size_x=146.2,
size_y=103.8,
size_z=74.11,
child_location=Coordinate(x=9.66, y=9.22, z=74.11),
)
# HS2
backend2 = HamiltonHeaterShakerBackend(index=2, interface=control_interface)
hs2 = HeaterShaker(
name="Hamilton HeaterShaker",
backend=backend2,
size_x=146.2,
size_y=103.8,
size_z=74.11,
child_location=Coordinate(x=9.66, y=9.22, z=74.11),
)
For setup, call setup
on the HamiltonHeaterShakerBox
instance. This will setup the USB connection to the control box. Then, call setup
on each HamiltonHeaterShakerBackend
instance. This will setup the individual heater shakers.
await hhs_box.setup()
for hs in [hs1, hs2]:
await hs.setup()
1x STAR - 2x hhs#
control_interface = star_backend = STARBackend()
# Control via a STAR requires instantiation of the STAR liquid handler
lh = LiquidHandler(backend=star_backend, deck=STARDeck())
# HS1
backend1 = HamiltonHeaterShakerBackend(index=1, interface=control_interface)
hs1 = HeaterShaker(
name="Hamilton HeaterShaker",
backend=backend1,
size_x=146.2,
size_y=103.8,
size_z=74.11,
child_location=Coordinate(x=9.66, y=9.22, z=74.11),
)
# HS2
backend2 = HamiltonHeaterShakerBackend(index=2, interface=control_interface)
hs2 = HeaterShaker(
name="Hamilton HeaterShaker",
backend=backend2,
size_x=146.2,
size_y=103.8,
size_z=74.11,
child_location=Coordinate(x=9.66, y=9.22, z=74.11),
)
await lh.setup()
for hs in [hs1, hs2]:
await hs.setup()