Skip to content
Switch branches/tags


Failed to load latest commit information.
Latest commit message
Commit time
Jan 14, 2019
Oct 8, 2018
Apr 22, 2021


contributions welcome

poseidon: Open source bioinstrumentation

An easy-to-use, highly customizable, and open source syringe pump and microscope system.


Paper: A. Sina Booeshaghi, Eduardo da Veiga Beltrame, Dylan Bannon, Jase Gehring and Lior Pachter, Principles of open source bioinstrumentation applied to the poseidon syringe pump system, Scientific Reports 9, Article number: 12385 (2019).

The tl;dr

The poseidon syringe pump and microscope system is an open source alternative to commercial systems. It costs less than $400 and can be assembled in an hour. It uses 3D printed parts and common components that can be easily purchased either from Amazon or other retailers. The microscope and pumps can be used together in microfluidics experiments, or independently for other applications. The pumps and microscope can be run from a Windows, Mac, Linux, or Raspberry Pi computer with an easy to use GUI.


What is included?

  • Computer Aided Design (CAD) files of the 3D printed components.
  • Controller software (Python) and a graphical user interface (GUI) to control the pumps.
  • Arduino firmware to send commands to the motors and receive commands from the GUI.
  • Bill of materials for sourcing and purchasing materials.
  • Detailed assembly instructions of hardware components.
  • Single click executable files for Mac, Windows, Linux, and Raspberry Pi systems.

Getting Started

3D printing components and purchasing hardware

The 3D printed components can be fabricated on any desktop fused filament fabrication (FFF) 3D printer. They were designed using Autodesk Fusion 360, a proprietary CAD software that offers free academic licenses.

  • Fusion360 interactive view of poseidon microscope CAD.
  • Fusion360 interactive view of poseidon pump.
  • STL, STEP, IGES, Fusion 360 archive files, and bill of materials are available in the HARDWARE/ folder.
  • Bill of materials with prices and vendor links on a Google Spreadsheet.

Build Videos

Syringe Pump:
Microscope :
Arduino :
Raspberry Pi:

Running poseidon:

Setting up the Arduino

We use the Arduino CNC shield to allow for up to three pumps can be controlled from a computer or from the Rapsberry Pi microscope.

The software is configured to run the stepper motors with 200 steps per revolution at 1/32 microstepping, which translates to 6400 steps per rotation. To configure this, it is necessary to add 3 jumpers between the M0, M1 and M2 pins of the Arduino CNC shield. More information about microstepping can be found in the product page for the DRV8825 Stepper Motor Driver, which is used by the CNC shield. See the build videos for more detail.

The Arduino should be flashed with the arduino_serialCOM_v0.1.ino sketch, available in the SOFTWARE/ folder.

Make sure to download and install the AccelStepper library. To install, unzip the zip file to the libraries sub-folder of your sketchbook, if you get stuck here is a how-to.

The pumps are driven by an Arduino board that interprets commands sent via USB and sends the signals to control the stepper motor movement. For directions on how to flash an arduino please refer to the official guide:

Installing software

The Python scripts are available in the SOFTWARE/ folder. The GUI was created using Qt designer, a drag and drop application for organizing buttons that allows the used to easily make modifications. This GUI is used to interface with a Python script that controls both the microscope and Arduino via USB.

The software you will need to run on your computer in order to control the Arduino is the script located in the SOFTWARE/ folder (also included is which is needed).

You have the option of either (1) running from the source code in Python or (2) choosing the appropriate binary file below for your operating system and executing it. Before you run the controller code, MAKE SURE YOU HAVE INSTALLED THE ARDUINO FIRMWARE!!

Startup Checklist

Before starting the Python controller, make sure

  1. The Arduino has the firmware uploaded to it
  2. The Arduino is connected via USB to the computer or Rapsberry Pi microscope
  3. You have appropriately placed jumpers on the CNC Sheild to allow for microstepping and hardware enabling (discussed in build video).
  4. The CNC shield is powered, and that all motors are plugged in to the CNC sheild

Running the software and Testing the pumps

There are two ways to run the controller. The easiest way is to just double click the executable available below. Simply download the executable, double click it, and begin using it. Navigate to the Releases tab at the top to find the following executables.

  • Windows
  • Mac OS
  • Ubuntu (coming soon)
  • Raspbian


Things that we have learned along the way that may help with your build.

  • Basic tests indicate that pressures up to 4 MPa can be acheived with 1 microstep and a 1 mL syringe.

  • Set the current limit on your motor controller to vary the stall torque. Increasing the current to the motor increases the stall torque and increases the max pressure that your syringe pump can run at. How to set the current limit.

  • We recommend changing the password on the Raspberry Pi for added security.

  • The speeds and flow rates of the system are limited by the microstepping and the syringe size used.


If you want to run the system from the source code then follow the instructions below.

Windows, Mac, Linux

First make sure you have Python 3 installed on your machine. Then install PyQt5. To install PyQt5 use brew install pyqt5 or conda install pyqt if you are using anaconda. If you are on Linux you can do sudo apt-get install python3-pyqt5. Now we need to add a few packages:

pip3 install --upgrade -pip
pip3 install pyserial
pip3 install opencv-python

On Linux opencv requires extra binaries

sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev
sudo apt-get install libqtgui4
sudo apt-get install libqt4-qt3support
sudo apt-get install libqt4-test

Now you can run

# now the script can be called

Raspberry Pi

To run on a Raspberry Pi with a fresh install of Raspbian, Python 3 with pyqt5 need to be installed, together with a few packages.

sudo apt-get install python3-pyqt5

# now need to use python3.5 to invoke the python3 that has pyqt5!
pip3 install --upgrade -pip
pip3 install pyserial
pip3 install opencv-python

# opencv requires a some extra binaries 
sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev
sudo apt-get install libqtgui4
sudo apt-get install libqt4-qt3support
sudo apt-get install libqt4-test

# now the script can be called

Now that you have everything installed, go ahead and test it out!

(1) Select the port that your Arduino is plugged into. If you don't see the right port, press update port. (2) Set your microstepping (3) Input appropriate settings (4) Select connect to controller (5) Select Send all settings to controller (6) Go to the controller tab, select all three checkboxes and press Jog +

If the sleds are not moving in the right direction simply rotate the relevant stepper motor plug (that connects to the CNC shield) 180 degrees and plug it back in.

How does it work, and how to modify it. (Very easy!)

The poseidon system was designed to be customizable. It uses the Raspberry Pi and Arduino electronics boards, which are supported by a strong ecosystem of open source hardware and software, facilitating the implementation of new functionalities.

The pump driver uses an Arduino with a CNC shield to run up to three pumps. Each pump has a stepper motor that drives lead screw which in turn moves a sled that is mounted on linear bearings. The displacement of the sled moves the syringe forward or backward allowing the user to dispel or intake liquid.

The controller station uses a Raspberry Pi with a touchscreen to connect to the Arduino and microscope via USB. Because the microscope and Arduino use USB connections, they can alternatively be connected to a computer instead of a Raspberry Pi.

To modify the 3D models, users can either use Fusion 360 or any other CAD software. Simply open up the components, located in the HARDWARE folder, and get editing! Once you're done, go ahead and print out the parts and assemble them.

Most of the modifications to the code will be done in and to the GUI. If you want to edit the GUI, first make sure you have installed PyQt Designer (which should have been installed when you downloaded and installed PyQt5, so you can search for it on your computer Designer.exe (Windows) or Designer in your applications folder (Mac). Open up the poseidon_controller_gui.ui in Designer and make whatever modifications you'd like. Then when you are done, you need to convert the modified .ui file to a .py file. Go to the terminal, navigate to the folder where you have poseidon_controller_gui.ui and run the command pyuic5 poseidon_controller_gui.ui >

When you are done editing the you can recreate the single click executable files by following the instructions below.

Installing pyinstaller on Windows 7 and making a single executable for the Python controller

Using Python 3.7 (installing pyqt5 form pip) or 3.4 (installing pyqt5 from executable) on Windows 10 did not work. Python 3.7 yields terrible dependency errors from pyinstaller and with Python 3.4 after making the executable pyqt complains apparently because of windows 10. The solution was to use a machine with Windows 7.

After installing Python 3.5.4 (, using the Windows x86-64 executable installer, these dependencies should install without problems:

python -m pip install pyqt5
python -m pip install pyserial
python -m pip install opencv-python

To compile a binary you should write PyInstaller, instead of pyinstaller...

python -m PyInstaller --version
python -m PyInstaller

Just doing python -m PyInstaller with Python 3.5 on windows 7 threw up some errors, the following line solved the issue. Described here:

python -m PyInstaller -F --hidden-import PyQt5.sip

Safety Considerations

Please review the license before using/developing/distribution poseidon.

The poseidon syringe pump system uses 3D printed PLA plastic and standard off the shelf components which do not pose a health hazard if handled correctly. Improper handling of plastics however can create hazards when working with organic solvents. Initial tests of the poseidon syringe pump showed excessive bending of the syringe pump body. We mitigated this by reinforcing the body with set screws and a thicker base. To mitigate the possibility of catastrophic failure due to clogging we set the reference voltage on the motor controller such that the motor stalls when the pressure in a 1 mL syringe reaches 4 MPa.

Before using the poseidon system in a wetlab environment, please ensure that you have thoroughly tested its functionality for your use case in a dry lab. Once the poseidon system has been moved into a wetlab, it should not be moved back to a drylab or dry workbench.

If you plan to build on the poseidon system, ensure that you communicate any safety concerns that you may have with your design to potential users and collaborators.


The poseidon system was developed by the Pachter Lab at Caltech by:

Prior work and references

The poseidon project is based on a number of other open source projects and papers.

The pump design was based on the open source syringe pumps published by the Pearce Research Group:

Open-Source Syringe Pump Library
Bas Wijnen, Emily J. Hunt, Gerald C. Anzalone, Joshua M. Pearce
PLOS One, 2014.

With subsequent refinements published on

The microscope was based on a design published by the Satija Lab:

Single-Cell Single-cell RNA-seq of rheumatoid arthritis synovial tissue using low-cost microfluidic instrumentation
William Stephenson, Laura T. Donlin, Andrew Butler, Cristina Rozo, Ali Rashidfarrokhi, Susan M. Goodman, Lionel B. Ivashkiv, Vivian P. Bykerk, Dana E. Orange, Robert B. Darnell, Harold P. Swerdlow, Rahul Satija
Nature Communicationsvolume 9, Article number: 791 (2018)

All necessary files are available on Metafluidics