Precise Peristaltic Pump




Introduction: Precise Peristaltic Pump

We are a student team from different disciplines of the RWTH Aachen
University and have created this project in the context of the 2017 iGEM competition.

After all the work that went into our pump, we would like to share our results with you!

We built this peristaltic pump as generally applicable liquid handling solution for any project which requires transportation of liquids. Our pump is capable of precise dosing and pumping, providing a wide range of dosing volumes and flow rates to maximize possible applications. Through 125 dosing experiments we were able to demonstrate and quantify the accuracy of our pump. For a tubing with 0,8 mm inner diameter and any flowrate or dosing volume within the specifications we could show an accuracy better than 2% deviation from the set value. Given the results of the measurements, the accuracy can be improved even further if the speed of the calibration is adjusted to the required flow rate.

The pump can be controlled without programming knowledge via the built-in LCD display and a rotary knob. In addition, the pump can be remotely controlled via USB by serial commands. This simple way of communication is compatible with common software and programming languages (MATLAB, LabVIEW, Java, Python, C#, etc.).

The pump is simple and inexpensive to manufacture, with all the parts totaling less than $100 compared to $1300 for the cheapest comparable commercial solution we could find. Besides a 3D printer, only common tools are needed. Our project is open source in terms of hardware and software. We provide the CAD files for the 3D printed parts, a complete list of all required commercial components and their sources, and the source code used in our pump.

Step 1: Check Specifications

Check the specifications and the discussion of accuracy attached below.

Does the pump meet your requirements?

Step 2: Gather Components

1x Arduino Uno R3/ compatible board
1x Stepper motor (WxHxD): 42x42x41 mm, Shaft (ØxL): 5x22 mm
1x Power supply 12 V/ 3 A, connector: 5.5 / 2.1 mm
1x Step motor driver A4988
1x LCD module 16x2, (WxHxD): 80x36x13 mm
3x Needle bearing HK 0408 (IØ x OØ x L) 4 mm x 8 mm x 8mm
1x Encoder 5 V, 0.01 A, 20 switch postions, 360 °
1x Pump tubing, 1.6mm wall thickness, 0.2m
4x Foot self-adhesive (L x W x H) 12.6 x 12.6 x 5.7 mm
3x Straight pin (Ø x L) 4 mm x 14 mm
1x Control knob (Ø x H) 16.8 mm x 14.5 mm
1x Potentiometer/ Trimmer 10k
1x 220 Ohm Resistor
1x Capacitor 47µF, 25V

1x PCB (L x W) 80 mm x 52 mm, Contact spacing 2.54 mm (CS)
2x Pin strip, straight, CS 2.54, nominal current 3A, 36 pins
1x Socket strip, straight, CS 2.54, nominal currrent 3A, 40 pins
1x Cables, different colors (e.g. Ø 2.5 mm, cross section 0,5 mm² )
Heat shrink (suitable for cables, e.g. Ø 3 mm)

4x M3, L = 25 mm (length without head), ISO 4762 (hex head)
7x M3, L = 16 mm, ISO 4762 (hex head)
16x M3, L = 8 mm, ISO 4762 (hex head)
4x Small tapping screw (for LCD, Ø 2-2.5mm, L = 3-6 mm)
1x M3, L=10mm grub screw, DIN 916
1x M3, nut, ISO 4032

3D printed parts: (Thingiverse)
1x Case_main
2 x Case_side (3D print not necessary => milling/cutting/sawing)
1x Pump_case_bottom
1x Pump_case_top_120°
1x Bearing_mount_bottom
1x Bearing_mount_top

Step 3: Post Processing of 3D Prints

The 3D printed parts have to be cleaned after printing
to remove any residues from the printing process. The tools we recommend for postprocessing are a small file and a thread cutter for M3 threads. After the printing process most of the holes have to be widened by using a suitable drill. For the holes that contain M3 screws, a thread has to be cut with the above mentioned thread cutter.

Step 4: Cables & Wiring

The core of the circuit consists of the Arduino and a perfboard. On the perfboard is the stepper motor driver, the trimmer for the LCD, the 47µF capacitor and connections for the power supply of the various components. In order to turn off the Arduino by the power switch, the power supply of the Arduino was interrupted and led to the Perfboard. For this purpose, the diode which is located on the Arduino directly behind the power jack was unsoldered and brought to the perfboard instead.

Step 5: Hardware Settings

There are three settings that need to be made directly on the circuit.

First the current limit for the step motor driver must be set, by adjusting the little screw on the A4988. For example, if the voltage V_ref between screw and GND in the on state is 1V, the current limit is twice the value: I_max = 2A (this is the value we used). The higher the current, the higher the torque of the motor, allowing higher speeds and flow rates. However, also the power consumption and the heat development increases.

Furthermore, the mode of the stepper motor can be set via the three pins which are located on the top left of the stepper motor driver (MS1, MS2, MS3). When MS2 is at + 5V, as shown in the wiring diagram, the motor is operated in quarter step mode, which we used. This means that exactly one step (1.8 °) is performed for four pulses that the stepper motor driver receives at the STEP pin.

As last value to set, the trimmer on the perfboard can be used to adjust the contrast of the LCD.

Step 6: Test Circuit and Components

Before assembly it is recommended to test the components and the circuit on a breadboard. On this way, it is easier to find and fix possible mistakes.

You can already upload our software to the Arduino, to try all functions beforehand. We published the source code on GitHub:

Step 7: Assembly

The video shows the assembly of the components in the intended sequence without the wiring. All connectors should first be attached to the components. The wiring is best done at the point where all the components are inserted, but the side walls have not yet been fixed. The hard to reach screws can be easily reached with a hex-wrench.

1. Insert the power switch and the encoder into their designated hole and fix them to the case. Attach the control knob to the encoder – be careful – once you attached the knob, it might destroy the encoder if you try to remove it again.

2. Attach the LCD display with small tapping screws, make sure to solder the resistor and wiring to the display before assembly.

3. Fix the Arduino Uno board to the case using 8 mm M3 screws.

4. Insert the step motor and attach it to the case together with the 3D printed part (Pump_case_bottom) using four 10 mm M3 screws.

5. Attach the perfboard to the case – make sure you soldered all components to the perfboard as shown in the wiring diagram.

6. Wire the electronic parts inside the case.

7. Close the case by adding the side panels using 10x 8 mm M3 screws.

8. Assemble the bearing mount as shown in the video and attach it to the motor’s shaft using a 3 mm grub screw

9. Finally, attach the counter support for holding the tube (Pump_case_top_120°) with two 25 mm M3 screws and insert the tubing. Insert two 25 mm M3 screws to keep the tubing in place during the pump process

Step 8: Insert Tubing

Step 9: Get Familiar With the User Interface (manual Control)

The user interface provides a comprehensive control of the peristaltic pump. It consists of a LCD display, a control knob and a power switch. The control knob can be turned or pushed.

Turning the knob allows to select from different menu items, the menu item on the upper line is currently selected. Pushing the knob will activate the selected menu item, indicated by a blinking rectangle. The blinking rectangle implies that the menu item is activated.

Once the menu item is activated, it starts depending on the selected item either an action or allows the change of the corresponding value by turning the knob. For all menu items connected to a numerical value the knob can be held to reset the value to zero or double pushed to increase the value by one-tenth of its maximal value. To set the selected value and deactivate a menu item the knob needs to be pushed a second time.

The power switch will immediately shut down the pump and all its components (Arduino, step motor, step motor driver, LCD), except when the pump is connected via USB. The Arduino and the LCD can be powered by USB, so that the power switch will not affect them.

The pumps menu has 10 items, which are listed and described below:

Start pumping, the operation mode is depending on the mode selected at “6) Mode”

Set the dosing volume, is only considered if “Dose” is selected at “6) Mode”

Set the volume unit, options are:
“mL”: mL
“uL”: µL
“rot”: rotations (of the pump)

Set the flow rate, is only considered if “Dose” or “Pump” is selected at “6) Mode”

Set the volume unit, options are:
“mL/min”: mL/min
“uL/min”: µL/min
“rpm”: rotations/min

Choose pumping direction: “CW” for clockwise rotation, “CCW” for counterclockwise

Set operation mode:
“Dose”: dose the selected volume (1|Volume) at the selected flow rate (3|Speed) when started
“Pump”: pump continuously at the selected flow rate (3|Speed) when started
“Cal.”: Calibration, pump will perform 30 rotations in 30 seconds when started

Set calibration volume in mL. For calibration, the pump is run once in calibration mode and the resulting calibration volume which was pumped is measured.

8|Save Sett.
Save all settings to Arduinos EEPROM, values are retained during power off and reloaded, when the power is turned on again

9|USB Ctrl
Activate USB Control: Pump reacts to serial commands sent via USB

Step 10: Calibration and Try Dosing

Performing a proper calibration before using the pump is crucial for precise dosing and pumping. The calibration will tell the pump how much liquid is moved per rotation, so the pump can calculate how many rotations and which speed is needed to meet the set values. To start the calibration, select the Mode “Cal.” and start pumping or send the calibration command via USB. The standard calibration cycle will perform 30 rotations in 30 seconds. The volume of liquid pumped during this cycle (calibration volume) should be measured precisely. Ensure, that the measurement is not affected by drops sticking to the tubing, the weight of the tubing itself or any other interferences. We recommend using a microgram scale for calibration, as you can easily calculate the volume, if density and weight of the pumped amount of liquid is known. Once you measured the calibration volume you can adjust the pump by setting the value of menu item “7|Cal.” or attaching it to your serial commands.

Please note that any change after calibration to the tubing mount or the pressure difference will affect the precision of the pump. Try to perform the calibration always at the same conditions, at which the pump will be used later. If you remove the tubing and install it again in the pump, the calibration value will change up to 10%, since to small differences in positioning and force applied to the screws. Pulling on the tubing will also change the positioning and therefore the calibration value. If the calibration is performed without pressure difference and the pump is later used to pump liquids at another pressure it will affect precision. Remember even a level difference of one meter can create a pressure difference of 0.1 bar, which will have a slight influence on the calibration value, even if the pump can reach a pressure of at least 1.5 bar using the 0.8 mm tubing.

Step 11: Serial Interface – Remote Control Via USB

The serial interface is based on the Arduino’s serial communication interface via USB (Baud 9600, 8 data bits, no parity, one stop bit). Any software or programming language capable of writing data to a serial port can be used to communicate with the pump (MATLAB, LabVIEW, Java, python, C#, etc.). All functions of the pump are accessible by sending the corresponding command to the pump, at the end of each command a new line character '\n' (ASCII 10) is required.

Dose: d(volume in µL),(speed in µL/min),(calibration volume in µL)'\n'

e.g.: d1000,2000,1462'\n' (dosing 1mL at 2mL/min, calibration volume = 1.462mL)

Pump: p(speed in µL/min),(calibration volume in µL)'\n'

e.g.: p2000,1462'\n' (pump at 2mL/min, calibration volume = 1.462mL)

Calibrate: c'\n'

Stop: x'\n'

The Arduino environment (Arduino IDE) has a built-in serial monitor, which can read and write serial data, therefore serial commands can be tested without any written code.

Step 12: Share Your Experiences and Improve the Pump

If you have built our pump, please share your experiences and improvements in software and hardware on:

Thingiverse (3D printed parts)

GitHub (software)

Instructables (instructions, wiring, general)

Step 13: Curious About IGEM?

The iGEM (international Genetically Engineered Machine) Foundation is an independent, non-profit organization dedicated to education and competition, the advancement of synthetic biology, and the development of an open community and collaboration.

iGEM runs three main programs: the iGEM Competition - an international competition for students interested in the field of synthetic biology; the Labs Program - a program for academic labs to use the same resources as the competition teams; and the Registry of Standard Biological Parts - a growing collection of genetic parts used for building biological devices and systems.

2 People Made This Project!


  • Mason Jar Speed Challenge

    Mason Jar Speed Challenge
  • Bikes Challenge

    Bikes Challenge
  • Remix Contest

    Remix Contest

39 Discussions


4 months ago

i have problem with the circuit, mine doesn't work


Reply 4 months ago

I replace the m7 diode on arduino and plug the electric supply in but it doesn't work


Question 7 months ago on Step 1

About the accurancy, why havent you use magnetic encoder on stepper motor to count rotations?


10 months ago

Hello! I’m trying to put together this project but I think I’m soldering everything wrong. The first one I did, the LCD only displayed white squares on top. The encoder and potentiometer worked though. I did a second one without using the female pins and nothing works. The lcd turns on but there are no displays, the encoder isn’t working and neither is the potentiometer. Is it possible to get in contact with one of you guys?


11 months ago

Awesome Project !

Thanks for sharing and making this open~source, being such really helps so many more people in the world, those with low income budgets & those who have a need for such devices but dont have the opportunity in their own country to obtain such technology !

i want to make a similar device, a peristaltic pump but a forearm-wearable & battery operated medicine delivery system so it can be portable/NOT Mains Powered but will have the feature to be mains adapter pluggable & be able to administer upto 2 different medicines at the same time or at different times for those who need a daily dose !

When ive collected enough parts, i will also be keeping my design open source too :)

Also @ NataliaT;

A good way to share 3D Designs is to upload them to places like, like the example page below which is my own humble projects page

Or i think these files can also be uploaded too, but im not 100% sure on that !

Keep up the inspiring projects to all and thanks again for sharing this awesome information !


Question 2 years ago


I really like this project. I have sourced the parts and and waiting for them to arrive

However, I am having trouble uploading the ino file to my Ardunio

I have installed both library files but get the following error message:

Arduino: 1.6.11 (Mac OS X), Board:
"Arduino/Genuino Uno"

failed MSpanList_Insert 0x310000
0x66fd094baff2 0x0

fatal error: MSpanList_Insert

runtime stack:


+0xad fp=0x7ffeefbff430 sp=0x7ffeefbff400


+0x8f fp=0x7ffeefbff458 sp=0x7ffeefbff430

MHeap_FreeSpanLocked(0x2cad60, 0x310000,

+0x163 fp=0x7ffeefbff498 sp=0x7ffeefbff458

MHeap_Grow(0x2cad60, 0x8, 0x0)........and so on.


Answer 2 years ago

Update: I updated Arduino software to version1.8.5 but now get the following errors:

Arduino: 1.8.5 (Mac OS X), Board: "Arduino/Genuino Uno"

warning: deprecated conversion from string constant to 'char*'

menu[0].suffix = "RUNNING!";

.....followed by a stream of similar errors


Reply 1 year ago

Con elL IDE 1.0.,6 no tendras problemas


Answer 2 years ago

We are glad that you build our pump - if you like, let us know when your pump is working :)

The warnings point out that we did a problematic conversion from one data type to another. Some char* varibales were initialized with string constants (char* var = "text"), which can cause errors if one tries to write to the variables afterwards. The program worked fine despite the warnings, since we never changed these variables.

With some small changes the problem seem to be completly solved. I uploaded the new code as v1.01 on GitHub.


Answer 2 years ago

Sorted, just re-installed library files and uploaded fine!


1 year ago

Este es mi nuevo boceto para el mismo sistema ,pero con la ampliacion de utilizar un mega2560 y DS3323

peristaltica - copia.jpg

Question 1 year ago on Step 13

I did it! I made some changes to stl files to adapt my parts but it´s done! The thing now is that it´s not pumping....I´ll remove the micro step to full step to guarantee torque firts, but it seems that the rotor+bearings are not colapsing or pressing the tube as required to pump. I tried to lower down the adjustable part (like a bridge) but the pressure was stopping the motor at all or losing steps. How did you ensure the tube compression to have positive displacement of product? Did you experience this? I tried to manually purge the tube or prime it but no news....I need to fix it to have it operational. Thanks for ideas and support.


Answer 1 year ago

Do you have nice soft squishy silicone tubing? What sized tubing did you go with?


Reply 1 year ago

it´s silicone based, 9mm external diameter and 6mm internal diamter, and it feels soft


Reply 1 year ago

I have the exact same problem. Have been trying different tygon tubing, but the pump does not make a good seal. If I drop the top fitting down tighter, the pump cannot turn. The driver is set to max amps, sure wish I could get it to work like the videos.


Reply 1 year ago

Problem solved after redisegning rotor part (green tube housing)

sudhir laxman
sudhir laxman

Reply 1 year ago

Hello guys trying to work on this project but my lcd screen goes blank and shows some weird symbols can u help me. if u can give me ur email it will be really helpful


Reply 1 year ago

Nice! Do you have STLs for the new part? Is that the 9mm/6mm tubing?


Reply 1 year ago

Yes, it´s for A 9x6mm tubing, silicone type 60A shore. Not sure how to share the part here, but send me a message or leave me your mail and I´ll forward it to you.
I want to highlight that it´s pumping perfectly but still having issues with dosing and calibration...I think I´m doing something wrong. the 30 complete cycles are delivering 50gr of water, I adjust this on calibration mode stating the exact amount weighed on a balance, but when dosing later, I´m not getting the exact volume. Will continue trying and come back here just in case. Question, where in the code am I have to change from 30 cycles to 10 maybe?


Tip 1 year ago on Introduction

Tubing specs from the attached image (I had a hard time finding them)
- Up to 4mm ID
- 1.6mm wall thickness