Efforts this week went into programming our Opentrons OT-2 Liquid Handler robot. The API is mostly well documented by the manufacturer and so most of the time was spent simply troubleshooting our Python code. Nevertheless, there are some important obstacles that we encountered while setting up our test procedure.
When scripts are sent to the OT-2, it simulates them internally before beginning movement. This simulation process is also available without even needing the OT-2 on hand, thanks to the opentrons_simulate command. The Opentrons simulator performs additional sanity checking on the API functions being used to make sure that the robot will actually be able to perform them, above and beyond simply making sure that the Python script is sensible and executes.
Despite my having not yet actually seen the device in person, we were able to program it to precisely mix different colors of food coloring with an appropriate dilution, creating 500μl of different colored water in different wells.
First, the robot interprets the color recipes given, and determines the amount of excess water that each well will need to reach 500μl. It uses one 1000μl tip to dispense the calculated amount of water into each well.
Next, the robot uses a 20μl tip to dispense the appropriate amounts of red food coloring to each well, which ranges from zero to 20μl. It discards the tip, gets a new one, and repeats this process with the other three colors.
Finally, the robot uses a 1000μl tip to aspirate 100μl from the first well, then dispenses it back in, repeating this process ten times to ensure complete mixing. It repeats this process with a fresh tip for each well.
After this test completed, three main changes were made to the script:
First, the position of the pipette during the dispense step was changed to 5mm above the bottom of the well, in order to prevent cross-contamination of colors.
Second, the pipette was instructed to "blow out", which we believe is equivalent to manually pipetteing "to the second stop", after dispensing, in order to make sure all the fluid in the tip is expelled.
Third, the proscribed color mixtures were moved from static arrays defined in the Python script into an external csv file that is read at run-time. It should be possible to bundle the Python script and the csv file together so that they can be sent to the robot simultaneously, but one weakness of the Opentrons API is that it doesn't explain this procedure very well.
With the lessons learned from this, I expect that we will be able to program our OT-2 to perform any arbitrary fluid handling tasks that we need moving forward.