Cole-Parmer GenoGrinder (fka SPEX GenoGrinder)#
The GenoGrinder is a high-throughput plate shaker and homogenizer. It clamps a microplate (or a stack of plates, or a set of vials in a plate-format holder) between two platens and shakes it vertically for a fixed time at a fixed speed, grinding or mixing the contents of every well at once.
Product page: Cole-Parmer SamplePrep HG-600-230 Geno/Grinder 2010
Property |
Value |
|---|---|
Communication |
Serial, ASCII line protocol |
Serial settings |
9600 baud, 8 data bits, no parity, 1 stop bit |
Line terminator |
carriage return ( |
Duration range |
1–999 s |
Speed range |
1–9999 rpm |
Clamp |
motorized (open/close) or fixed, depending on model |
Warning
This driver has NOT been tested against hardware in PyLabRobot. setup() logs a
warning to that effect. If you verify it on your machine, please open a PR to
remove the warning.
Physical setup#
Connect the GenoGrinder’s serial port to your computer, typically through a USB-to-serial adapter, and note the port name (/dev/ttyUSB* on Linux, /dev/tty.usbserial-* on macOS, COM* on Windows).
Make sure the instrument’s serial parameters match the driver defaults (9600 baud, 8 data bits, no parity, 1 stop bit), and that the safety lid is closed – the machine will not run with it open.
Connect#
setup() opens the serial port and runs the instrument’s power-on routine, which homes the mechanism and readies the clamp. Its reply doubles as a communication check, so a successful setup() means the machine is talking and ready to run.
Some GenoGrinder models have a fixed clamp that you tighten by hand instead of a motorized one. On those, pass use_clamp_commands=False: open_clamp() and close_clamp() then do nothing, so the same protocol code runs on either machine.
from pylabrobot.cole_parmer import GenoGrinder
grinder = GenoGrinder(port="/dev/ttyUSB0") # replace with your port
await grinder.setup()
Check the clamp#
request_clamp_state() reports whether the clamp is "open", "closed", or "unknown".
print("Clamp:", await grinder.request_clamp_state())
Open the clamp#
open_clamp() reads the current position and only moves if the clamp is not already open, so it is safe to call repeatedly.
await grinder.open_clamp()
Load a plate#
Place your plate (or plate stack) in the clamp now, centered on the platen, and close the safety lid.
Close the clamp#
close_clamp() clamps the plate down. Like open_clamp(), it checks the current position first.
await grinder.close_clamp()
Shake#
shake() uploads the run parameters, starts the run, then polls the instrument until it reports the run is complete – so the call returns when the plate has actually finished shaking.
duration is in seconds (1–999) and speed in rpm (1–9999). Start gentle and work up: hard grinding at high rpm can crack plates and unseat seals.
await grinder.shake(duration=30, speed=1500)
Read the status#
request_status() returns the instrument’s raw status line – Standby when idle, or one of the transient run states (Running Sample, Locking, Mixing, Unlocking, Run Complete) during a run. Useful when driving the machine from another task while a run is going.
print("Status:", await grinder.request_status())
Abort a run#
stop_shaking() stops a run in progress. Because shake() blocks until the run finishes, call this from a separate task (or after interrupting the cell) when you need to cut a run short.
await grinder.stop_shaking()
Home the clamp#
home_clamp() returns the clamp to its reference position. Use it to recover a known state after an aborted run.
await grinder.home_clamp()
Unload the plate#
Open the clamp again and take the plate out.
await grinder.open_clamp()
Teardown#
stop() halts any run still in progress and closes the serial connection.
await grinder.stop()