I’ve been building a SALLE protocol on our Opentrons Flex which is working like a charm but can handle up to two plate / run.
I’ve been asked if it’s feasable to scale up while having a better walk-away time.
The issue i have at hand is that if i’m leaving the flex to work for lets say 1h doing 10 plates by the time it finishes my first plate’s sample will evaporate.
In fact we have an Azenta a4s microplate sealer which could be remotly controlled with usb/rs232 cable with simple commands, but didn’t find a way yet to embed this functionality in flex protocol.
Anybody has any solution/idea?
P.s.: i’ve got a real simply robot arm which is indeed controllable with python so would be an interesting project to involve that too later on.
2 Likes
Are you designing your protocols directly in python or are you using Opentrons protocol designer?
With python code you can import the pyserial module and build your own custom commands to run in the middle of the protocol (e.g. within a loop over your plates)
I did it a very long time ago in the OTs to control QInsturment shakers before Opentrons sold their own shakers. It works like a charm.
2 Likes
Yes, im writing my protocols in python but when I upload it to the opentrons app to run it says pyserial modul is not found.
That’s right. The opentrons app doesn’t allow you to add custom modules (or even standard modules available in the RPi).
My workaround was to avoid running those commands (and imports) in simulation mode.
Here is a snippet of the shaker method:
def shake(self, parameters):
"""
Stores the logic for a simple shaker step utilising the BioShake 3000t.
Only runs during the actual protocol since a simulation would not have access to the serial ports.
Sets the temperature and RPM setpoint and starts the system. If users set "wait_for_stop" as an
option, the code will block until the shaker step has completed (indicated by the shaker "homing").
Either way will stop and cool-down the shaker post completion.
@param parameters The parameters for the step
"""
self.custom_home(only_waste=True)
if not self._protocol_context.is_simulating():
with serial.Serial(SERIALPORT, BAUDRATE, timeout=TIMEOUT) as ser:
shaker = Shaker(ser)
if parameters['temp_control']:
shaker.start_temp_control(int(parameters['setpoint']))
if parameters['speed'] and parameters['duration']:
shaker.start_run(parameters['speed'], parameters['duration'])
if parameters['wait_for_stop']:
while not shaker.is_shaker_home():
print(shaker.get_responses())
if parameters['force_stop']:
shaker.stop()
if parameters['cooldown']:
shaker.stop_temp_control()
A very big thank you!
if not protocol.is_simulating():
worked like a charm to avoid error in simulation.
Sadly the sealer is in service right now but managed to control our little demo Cobot this way opening opportunities for our Flex.
Thank you again @nadimest !
2 Likes
Glad you found something that works! If you ever want to built a more complex setup, take a look at UniteLabs. They’ve got ready-made Python connectors for a wide range of devices, and you can run things locally or from the cloud - makes scaling up much easier.
1 Like