/SerialMultiplexer

Liquid handling robot for in situ serial multiplexing

Primary LanguageObjective-C

Open source robot for liquid handing and serial multiplexing fluorescence microscopy

Motivation

For fluorescence microscopy, a large limitation on the amount of data that can be extracted from a single sample is the number of targets that can be labeled within a sample. Fluorophore spectral overlap limits this to around four targets in a typical setup, possibly up to ten if careful spectral demixing is done. In contrast, a single signalling pathway may contain a few hundred components. Quantifying all of these components in a single sample would require an approach that increases the number of targets by an order of magnitude or more.

One solution is to label targets in a sequential manner with probe signal nullification steps in between. Target probes are introduced in sequential rounds, if possible without moving the sample off of the microscope. After imaging, the probe signal can be removed either by stripping the probes, washing out the probe solution, or chemically or photo-bleaching the label fluorophore. With this procedure the number of targets that can be probed is expanded with the number of rounds. With a 4 color set-up and 10 rounds, for example, there are up to 40 target channels that can be captured in such an experiment. With clever 'barcoding' schemes, this can even scale exponentially, rather than linearly, with the number of rounds.

To accomplish this feat, a single sample must be processed through the labelling and stripping steps repeatedly. Doing so automatically avoids many hours of exceptionally tedious work and ultimately a more precise product. For this a form of multi-channel liquid handling is required. To further avoid spending tens of thousands of dollars on a project that was initially unsanctioned and unfunded, a low-cost solution is certainly a benefit.

Approach

The in situ automated liquid handing needs to be able to move a selected aliquot of solution from one place off of the microscope into the sample holder. Then this aliquot needs to be removed, the sample washed with buffer, possibly multiple times, while removing the waste solution. Then the cycle needs to repeat. Were this done manually, solutions would be pre-mixed in microcentrifuge tubes or a well plate. An operator would then remove solution from each well in turn and adding to the sample holder, interspersing washing and waste removal steps. This would likely be done with a micropippetor and disposable tips.

Recapitulating this closely with a robotics platform is certainly a straightforward approach. The micropippetor could even be mounted on a gantry arm and moved between the reagent and sample locations. Such an action is the basis of many pipetting robots. However, the volume setting and tip ejection are motions adding extra complexity that may not be required. If instead liquid was dosed out of a programmable pump through a reusable tip, the setting and ejection steps would be unnecessary. The remaining motions are then to position this tip into the reagent well and then into the sample chamber with dosing via the pumps. This forms the basis of the design here.

The liquid-handling head (actually made of 3 separate tips, detailed below) is on a carrier head. This head has a servo motor for raising and lowering, essentially toggling between two positions. The carrier is on a long axis that moves it from the reagent well plate location to the sample on the microscope, some distance (~450 mm) away. The well plate is on a holder that places the base of this plate and the bottom of the sample holder in the same plane. The well plate holder is on its own carrier on a shorter axis that allows a given row of the well plate to be selected (the first axis selects the column). An aliquot is drawn into the liquid handling head by a pump, which then pushes to dispense this liquid at the sample. A second tip in this head can dispense buffer from a reservoir, and a third withdraws waste. The first pump operates in a toggle-like mode, with the second and third in a unidirectional motion only. The grand total is then a servo, three "positioning" motors, and two "dispensing" motors.

Turns out this list also makes a 3D printer. The carrier axes correspond to XY, the reagent toggle pump the Z axis, and the buffer and waste pumps taking the role of a dual extruder. The positioning precision of a hobby-level 3D printer is plenty for this application. An open-source RAMPS controller built upon an Arduino Mega supports these 5 stepper motors, the servo, plus a bit of additional functionality, with communication over a USB serial with G code commands. The design can capitalize on the 3D printer hobbyst community and the cheap components available for those projects. These include the controller, motors, bearings, guide rods, and timing belts. A bit of extruded T slot aluminum makes up the bulk of the skeleton, with the remaining parts being 3D printed on a desktop machine.

The bulk of the complex parts can be printed on a standard filament 3D printer. This borrows quite bit again from the hobbyst 3D printer community, specifically the Reprap and Prusa projects. Many of the components were highly inspired by analogous components in these projects.

Controller code is based on Marlin (with configurating settings to work with this build) just as many Reprap printers. The PC communicates with the controller through G code commands in this software. A MATLAB class and demo scripts simplifying these operations will be included though one could imagine a custom fork of something like Repetier to drive the instrument. From our perspective mounting the device within MicroManager or similar instrument-driving software is the eventual goal for integration into a microscope platform.

To complete the liquid handling side of the machine, 3D printable peristaltic pumps were designed. The use of the same stepper motors make these easy to control. The controller is already set up to treat these as either the Z printer axis or a dual-head extruder. The design uses skate bearings against flexible tubing to push along fluid. These have no issue moving an appropriate amount of fluid in a reasonable time under PC control. There is a decent amount of pulsing but it is sufficient for moving fluid from one place to another. One could substitute these for syringe pumps or another, more precise, fluid-moving system if desired. The Arduino has multiple serial ports exposed that could be addressed (or this could be handled on the PC side) to send commands to such pumps if not driving the motor directly.

Design considerations

The use of 3D printed parts and components is not the most precise way to do things. The combination of rough parts and slop in cheap bearings is plenty to have extra motion above the theoretical resolution. To address this, one must focus first on what precision is actually needed. Here the XY positioning needs to be good enough to not hit the wall of the plate well. The chosen steppers, drivers, and belt can theoretically hit 180 micrometer positioning. Our tests show repeatability within 2-3x this, though periodic axis re-zeroing is a good idea to avoid missing step errors. Still that is certainly precise enough to hit the middle of a well that's approximately 5 mm in diameter.

More precision is needed for the up-down motion of the needle carrier head. Or, more correctly, the lower limit of this travel must be precise and repeatable to reach as close of the bottom of the well as possible to avoid wasting liquid (at the other end, as long as the needle is high enough up it doesn't matter where it is past that). The same criterium means that solution removal and washes at the sample chamber can be more efficient. There is an additional wrinkle in that the bottom of the sample chamber is a very thin, fragile glass coverslip. Slamming into that repeatedly will lead to a crack and ruined experiment. So we need a way to repeatably hit the same position without overshooting at the end of the downstroke for the bottom of the well and the bottom of the sample chamber.

The second consideration for a "sloppy" system can be applied to simplify this issue, namely to leave enough adjustment to fine-tune or calibrate any residual imprecision out of the system. The design is intended to hold the bottom of the well plate in the same plane as the bottom of the sample chamber. This removes the need for separate positioning for the two locations, meaning there is only one bottom position for the needle carrier to hit. The transverse X axis can be moved up and down on the vertical support member to roughly position the needle carrier in the proper vertical position for the associated microscope stage. The well plate axis can slide along the same vertical member to bring the well plate in the same plane as the sample. Finally there is a finer adjustment in the carrier head, where the linkage between the servo linkage arm can vertically translate in the needle carrier to bring the stop position in the proper alignment.

Initially the linkage between the servo motor and the needle axis was a cam-follower mechanism. The servo would rotate and push against a pair of springs around the bearing rods to lower the needle carrier. This has the distinct advantage in that an imprecise rotator (a cheap servo) can lower to the same position very repeatedly. If the cam is a constant diameter through a range at the end of the travel, as long as the rotation is somewhere in that range then the translation imprecision is removed. Unfortunately finding appropriate springs of the proper diameter and length and compression force is difficult and time-consuming, so this approach was abandoned.

The alternate approach was a more traditional linkage between the servo and needle carrier. Now the servo rotational position is directly tied to the translation position. The error in this rotatation is also directly linked. In practice the cheap servo used does work within the repeatedly required. When moving long distances there is a considerable amount of rotational overshoot, however, which seems to be proportional to the distance traveled. This may be minimized with a higher-quality motor or proper servo controller, but one work-around is to move in steps. The bulk of the motion can be done in a first step, but stopping early so that overrotation of the servo does not result in overshooting the final target. A second smaller step brings the needle carrier to the final position with much lower overshoot. This effect is visible in the included video of the instrument in action where the vertical motion of the needle carrier is clearly done in two motions.

Motor positions and travel speeds can be set in software. These need to be calibrated for the given build. For travel of the axes this is straighforward and in millimeters. Rotational position of the servo and translation of dispensor distance to volume units will need to be done empirically, but this is relatively straightforward to establish.

Repo contents

.\STEP Files\ - STEP files of full assembly and of the custom base plate to mount to a metric optical table.

.\STL Files\ - All files for 3D printing. These are ready to go into your favorite slicer software to generate 3D printer machine code.

.\Pics\ - Photos and renderings of the completed assembly. A video of the robot motion testing in action is included.

.\Hardware\ - Bill of Materials for all items to be purchased for this build. This includes all fasteners and other hardware omitted in the STEP files. A measured drawing for the base plate is included, ready to be sent to your local machine shop (or give making it yourself a shot).

.\Code\ - Configuration files for Marlin driver for Arduino and MATLAB PC-side MATLAB code included. The PC does a small amount of processing and primarily relays Gcode over a serial connection to the Arduino. Should be straightforward to port to Python, Micromanager Beanshell Java, or whatever other language you may prefer.