Open Syringe Pump

Deliver small, accurate amounts of liquid. Good for food engineering, CNCs, and bioscience.

Similar projects worth following
[What's a syringe pump?]

A syringe pump pushes out small, accurate amounts of liquid. The application space is huge, from medical applications to food engineering! They're also extremely useful in biological research.

[Why make one?]

I expect this to end up useful in all kinds of places. But I'm making it to scratch my own itch. I work in bioscience, where there's a huge need for low-cost, open-source tools. A syringe pump of this quality costs over $1000, and isn't made to be hacked.

Not only can we do it much cheaper, but we can make it much more versatile. The extrusion rail mounting allows it to physically connect onto other projects or rack-mounts. The Arduino based electronics give immense flexibility for specializing it towards your intended purpose. This syringe pump can be customized to fit into any project.

Demo Video


The video shows basic manual operation. There's a menu to adjust bolus sizes. Also, it can be triggered to push and pull liquid via the digital pin inputs, and it accepts more complex commands via serial over USB.

Bill of Materials

Order one of each thing on the list, and you'll be on your way!

The total cost should come out to about $250 with shipping. So, that's substantially cheaper than a commercial syringe pump; they typically go for $1000+.

Cost is not the only concern, though. What you get with this thing is:

- Hackability: Open-source software and hardware all the way. Customize the hardware and software to do anything you need.

- Modularity: You can swap out each component for another one of your choosing. Exceptions and concerns noted below.

- Extendability: Want to add Ethernet or Bluetooth? Both shields are compatible, just stack them on. This SD card shield is compatible too if you want to add data logging.

- Ease of assembly: Minimal soldering required, and tutorials + vendor support are available for most components.

- Availability of components: Everything's off-the-shelf from stable sources (Adafruit, SparkFun, Amazon, McMaster-Carr). If you're in the US, all parts should arrive in well under two weeks.

Electronic Components:

PurposeProduct LinkVendorCost (not including shipping)NotesAlternatives, if any
MicrocontrollerArduino Uno R3Adafruit$24.95----
Stepper Motor

NEMA 17 stepper motor, 12V, 1.3A, Holding Torque 40N*cm. Model 42HS4013A4.

Adafruit$18.50Plenty of power for pushing even thick liquids.This one's less powerful, but has been tested with the project and works: Stepper motor - NEMA-17 size - 200 steps/rev, 12V 350mA
Stepper Motor Driver

Big Easy Driver


$14.95Attach to digital pins 2 and 3.

If using a low-current stepper, use the EasyDriver instead.

User Interface Shield

LCD button shield

Sparkfun$12.95Uses digital pins 4 through 9.


Much as I love the Adafruit version, it's not compatible with the code for this project, so don't use that.

And whatever you do, don't use this shield, its buttons are unreliable.

Power Source24V 1A power supplyJameco$11.95--This one from Amazon is bulkier but also works.

Avoid this one; it works but produces lots of electrical noise.
Power SwitchInline Power SwitchAdafruit2.50--I actually like the Sparkfun version better, but it's seldom in stock.
Power JackTerminal Power JackAdafruit2.00--Sparkfun carries it too.
EnclosureArduino Project EnclosureAmazon$8.95Fits nicely to the Arduino and to the aluminum rail. Only the bottom half is used.--
Trigger Inputs & Driver MountingProto-Screwshield (Wingshield) R3 Kit for ArduinoAdafruit$14.95A convenient way to expose digital pins so you can send triggers to the syringe pump. Also fits the Easy Driver perfectly.--

Mechanical Components:

PurposeProduct LinkVendorCost (not including shipping)
NotesAlternatives, if any

Mounting Rail

18-inch piece of 1"x2" 80/20 extruded aluminum rail.



Mounting everything on the rail makes the project modular and space-efficient. And the 18" length means your syringe pump will fit into most rack mount setups.

Also available in black, which looks pretty cool!

Motor mount

STL + SCAD file (GitHub)

--3D printed
Syringe plunger attachment

STL + SCAD file (GitHub)


3D printed

Syringe barrel holder

STL + SCAD file (GitHub)


3D printed

Syringe tip holder

STL + SCAD file (GitHub)


3D printed


Nuts and bolts for attaching to 80/20

80/20 Attachment Nuts and Bolts, Economy, 25-pack



Cheap and effective.

There are nicer nuts, if you like.

Shaft coupler

5mm - 8mm Rigid Coupling 25x30mm For CNC Stepper Motor ST-RC03

Stepper Online


Attaches the stepper motor to the threaded rod.

If you don't need bidirectional motion, this shaft coupler works nicely as well:

5mm x 8mm Flexible Shaft Coupler

Threaded Rod

M8 Threaded Rod, Type 316 Stainless Steel, 1m length



Comes as a 1m stick. You'll want to cut this down to around 300mm. There are many ways to do this; I used a chop saw.

None! This...

Read more »

  • Similar Project

    naroom06/01/2015 at 21:08 0 comments

    Another open-source syringe pump is here!

    This one features a 3-axis design. It uses magnets and a hall effect sensor to detect when the syringe is emptied. The DIY shaft coupler is cool too. There's lots of great work here. Check it out and see if it meets your needs!

  • Upgrades!

    naroom03/18/2015 at 01:40 0 comments

    The bill of materials has been updated with a few new tweaks, and there's now full build instructions for the electronics.

    The first batch of pumps has been in daily use and they're working great! I'm about to build 6 more of them.

  • More volts!

    naroom10/22/2014 at 05:16 0 comments

    So, I found a nice way to boost the torque on these guys. If you feed 24 volts into the Big Easy Driver, the stepper runs a lot nicer than it does on 12V.

    But! You can't put 12V directly into an Arduino, so we need to find a way to power that. Luckily, the Big Easy Driver can provide power to the Arduino! You just connect the 24V into the Big Easy Driver, and connect VCC to the Arduino's 5V pin. See picture (wiring could be prettier but hopefully that gives you an idea.) The 24V comes in through the DC barrel jack adapter, and goes to M+ and GND. Then over on the right, VCC connects to the Arduino's 5V.

    Reportedly, this workaround is no good on the regular EasyDriver, because the voltage regulator will overheat on it. But if you're using the regular EasyDriver, you probably don't need to boost torque anyway.

    I'll use this setup over the next week to verify it; it'll go into the BOM if it's as good as I think it is.

  • A new design!

    naroom10/07/2014 at 16:26 0 comments

    A team led by Joshua Pearce at Michigan Tech have come up with another design for an open-source syringe pump. This thing has three axes, uses a Raspberry Pi as its controller, and the syringe screws in instead of sliding in. It's very cool, and whether you're building a syringe pump or designing one, you owe it to yourself to check out their project as well:

    My two cents: The syringe pump I made is easier to pick up and use. Syringe goes in quick, and you have very direct control of the pump thanks to the user interface on it. It'll get you pumping fast. However, the one linked in this post is most likely a more accurate pump, especially for when you're working with volumes lower than a microliter. The three axes also help with stability and consistency.

    Really, the best syringe pump will be the one that combines the advantages of both projects -- and that doesn't exist yet. Maybe you should give it a shot :)

  • A Breakthrough

    naroom08/22/2014 at 20:05 0 comments

    Hackable hardware leads to discoveries!

    Yesterday, I had about an hour before I was going to use the Open Syringe Pump for an experiment. I realized I could do something interesting by adding an additional trigger line from one of our sensors into the syringe pump. That little interesting thing turned out to be a major win. I wish I could go into more specifics, but we might be onto something very cool here, so I'll keep quiet for now.

    There is no way I could have done that using a commercial syringe pump. Hackable hardware is the best way to do research!

  • Demo video up!

    naroom08/20/2014 at 20:43 0 comments

    Shows off the parts and electronics. Enjoy!

  • Control electronics decided!

    naroom08/20/2014 at 07:06 0 comments

    Having gone through many options for controlling stepper motors, I'm settling on the popular Easy Driver from Sparkfun. It's the most readily available thing that can do high-speed microstepping, it's not expensive, and it's super easy to code for. And you can easily upgrade to the Big Easy Driver if you want to sub in a beefier stepper motor, with zero code changes needed.

    I'm also really liking Sparkfun's LCD Button Shield. It works a lot better than the cheaper options out there, and requires almost no soldering -- just attach the pin headers. 

    The last ingredient is the Proto-Screw Shield from Adafruit. This thing is AWESOME. Makes it very easy to attach wires so that the syringe pump can accept trigger inputs from other devices. It also has a lovely proto-area that comfortably fits the Easy Driver with no awkward contacts. 

    I'm also liking the 12V 350mA stepper motor from Adafruit -- it runs a lot quieter than the high-current steppers I've tried, and still has more than enough pushing power.

  • Prototype's good!

    naroom08/17/2014 at 19:29 0 comments

    We've used the prototype syringe pump in several experiments at the lab now! It's been reliably awesome, and fits very nicely into our setups. It has a smaller footprint than all the other syringe pumps we have around. 

    Based on its performance so far, I'm doing a round of improvements. The stepper I chose initially was overkill, so I've subbed in a lower power one. The bill of materials has been updated to reflect all the new changes.

    Building and testing version 2 today -- stay tuned!

  • Pre-alpha!

    naroom07/27/2014 at 04:52 0 comments

    This project is now in pre-alpha. The hardware is about 95% worked out, and I'm almost done writing the software. A preliminary bill of materials has been put up. Note that the posted bill of materials may change between now and release. But if you want to get started ordering and building, don't let me stop you!

View all 9 project logs

  • 1
    Step 1

View all instructions

Enjoy this project?



nando.RQ wrote a day ago point

Hai Naroom

may I know this one

#define SYRINGE_VOLUME_ML 30.0<--- is it Syringe Volume in Mili Litre?
#define SYRINGE_BARREL_LENGTH_MM 80.0 <---- is It Barrel Length in Mili Metre?

If Ya how to calculate ? 
tell me please

from ML to MM = 8.8 isn't?

  Are you sure? yes | no

nando.RQ wrote 6 days ago point

Alhamdulillah I can get make direction CCW when LEFT_KEY press, cause I'm Newbie Arduino + progam

Thanks Naroom

But tell me please about your sketch or coding this part :

long stepperPos = 0; //in microsteps
char charBuf[16];

void processSerial(){
  //process serial commands as they are read in
  else if(serialStr.equals("-")){
        else if(serialStr.toInt() != 0){
          int uLInfus = serialStr.toInt();
          mLDefaultInfus = (float)uLInfus / 1000.0;
           Serial.write("Invalid command: ["); 
           char buf[40];
           serialStr.toCharArray(buf, 40);
        serialStrReady = false;
  serialStr = "";


what's mean about charBuff? and why different among them charBuf [16] and char buf [40];

tell me please, it's injury time for me.

  Are you sure? yes | no

nando.RQ wrote 05/11/2018 at 03:30 point

from this one

void readKey(){
  //Some UI niceness here. 
        //When user holds down a key, it will repeat every so often (keyRepeatDelay).
        //But when user presses and releases a key, 
        //the key becomes responsive again after the shorter debounce period (keyDebounce).

  adc_key_in = analogRead(0);
  key = get_key(adc_key_in); // convert into key press

  long currentTime = millis();
        long timeSinceLastPress = (currentTime-lastKeyRepeatAt);
        boolean processThisKey = false;
  if (prevKey == key && timeSinceLastPress > keyRepeatDelay){
          processThisKey = true;
        if(prevKey == KEY_NONE && timeSinceLastPress > keyDebounce){
          processThisKey = true;
        if(key == KEY_NONE){
          processThisKey = false;
        prevKey = key;
      lastKeyRepeatAt = currentTime;

void doKeyAction(unsigned int key){
  if(key == KEY_NONE){

  if(key == KEY_SELECT){
    if(uiState == MAIN){
      uiState = BOLUS_MENU;
    else if(BOLUS_MENU){
      uiState = MAIN;

  if(uiState == MAIN){
    if(key == KEY_LEFT){
    if(key == KEY_RIGHT){
    if(key == KEY_UP){
      mLBolus += mLBolusStep;
    if(key == KEY_DOWN){
      if((mLBolus - mLBolusStep) > 0){
        mLBolus -= mLBolusStep;
        mLBolus = 0;
  else if(uiState == BOLUS_MENU){
    if(key == KEY_LEFT){
    if(key == KEY_RIGHT){
    if(key == KEY_UP){
      if(mLBolusStepIdx < mLBolusStepsLength-1){
        mLBolusStep = mLBolusSteps[mLBolusStepIdx];
    if(key == KEY_DOWN){
      if(mLBolusStepIdx > 0){
        mLBolusStepIdx -= 1;
        mLBolusStep = mLBolusSteps[mLBolusStepIdx];


can I make direction movement CW after that CCW rotation? 

  Are you sure? yes | no

nando.RQ wrote 05/10/2018 at 07:59 point

Hi Naroom do me a favour please, I asked by someone to make the syringe pump use nema 23 and driver TB600 to be have CW and CCW direction but I can't, I have tried read, and learn about your coding and C LAnguange program but I still can't, tell me please how the way. I'm waiting your helping

Thank a lot Naroom or someone

  Are you sure? yes | no

Steven wrote 02/24/2018 at 05:18 point

The better option 80/20 fasteners are the wrong size. you have chosen a 10 series rail and a 15 series fasteners. They are different sizes as I have found out.

  Are you sure? yes | no

mor wrote 02/04/2018 at 09:31 point

Hi naroom great work.  Can I use the following driver?

Is micro step 1/16 enabled by default on the big easy driver?

  Are you sure? yes | no

jast.itt.biomedica wrote 08/16/2017 at 17:38 point

How are you?
Use the github code, but the variables in the syringe do not quite understand,
It's in this part
can you explain me?
Float mLBolus = 0.500; // default bolus size
Float mLBigBolus = 1,000; // default large bolus size
Float mLUsed = 0.0;
Int mLBolusStepIdx = 3; //0.05 mL increments at first
Float mLBolusStep = mLBolusSteps [mLBolusStepIdx];

Long stepperPos = 0; // in microsteps
Char charBuf [16];

  Are you sure? yes | no

Md. Farhan Naseh wrote 06/06/2017 at 10:04 point

Hi ... Can anyone help me in the following things and please reply asap, only few days left for my submission of project and I am still stuck up due to these:

1. Big Easy Driver was not available but A4988 driver chip was like the one in link
and LCD Keypad Shield 
with Arduino UNO R3. I had tried with a stepper motor taken out of DVD and another BH42SH47- 1504AF (Current: 1.5A,Step angle: 1.8 degrees) . Do I need to change anything in the program bcoz the stepper motor doesn't react to the Push/Pull commands all the time. Sometime it moves acc. to command but later Push or Pull, stepper motor just moves in one direction. How can this be controlled?
2. w.r.t Program: 
(a) triggerPin and bigtrigger pin are pins of big easy driver or LCD? In the pics and schematic DIR and STEP from driver is connected to Arduino pins 2 & 3, respectively. What is being connected to A3 and A4?
(b) "int  adc_key_val[5] ={30, 150, 360, 535, 760 }" :- Are the 5 values inside brackets for push buttons of LCD? Is it same for all LCD 1602 Keypad Shield? 
3. The NEMA17 stepper motor with rated 12V is connected to Big Easy Driver. The power to M+ and GND is 24V. Will it not affect the motor as it was of 12V?
Please help !!!

  Are you sure? yes | no

Gordon Couger wrote 03/11/2017 at 05:03 point

Just as time was dawing in 1993  I wrote the code that drove this syringe pump for "Laboratory Investigation of Boundary Condition Impacts on Nitrate Anion Exclusion in an Unsaturated Soil" fo Barry Allred & Glenn Brown

We used and old computer running a MS-Dos and Turbo C. The project didn't have any money. I drove the Stepper motor with 4 each  1 amp FETs directly off the printer port. I built an array of ones and Zeros that half stepped the stepper mother as pushed the 44 value out the first 4 pins on the printer port.  I fiddled with the clock until it was less than 10 seconds off in a week. I believe it ran with all the interrupts turned off and I turned them on to print or write to the hard drive and fixed up the timer after each operation to make up for the time lost by the clock.

It delivered so much water over time in an amount calculated by an equation.  Once the syringe was calibrated in stepper motor steps per cc of water I kept track of the position in steps of the stepper motor and calculated the next position the plunger should be each time it made a step from where it was not where it should be. 

I forget how slow the computer was but by the time the plunger go to the new position occasionally it should have been one or two steps further out. By always calculating a new goal from where the plunger was and not where it should have been I kept the error to less than 3 steps of the stepper motor. In later project using closed loop stepping motors I found that moving to a goal and accepting 1 or 2 steps error then making it up on the next move was more accurate than hunting back and forth to get dead on the spot. 

if you can close the loop. If you have any load on the syringe it will miss steps. A shaft encoder will catch that problem.

We loaded the syringes by hand. I think the back lash and forces are too much to use a stepper motor to reload a plastic syringe. We ran 1 very large syringe to 5 smaller ones as well as one small syringe.  In later versions we built the drive with timing belts to gear down a stepper motor to increase the the torque. Since in our incantation of the device it only pushed on the syringe backlash was not a consideration. If I remember correctly we got the big stepper motor to be sure we got one big enough as there were few other costs in the project. My time and shop time were free for all practical purpouses.

In Africa I would look at this pump design: DIY Syringe Pump made out of wood. Two stepper motors one on each side will pull a heavier load without jamming. Wood is freely available almost everywhere. You can get great time from any GPS that has a computer readable output. Fora few dollars more you can as good a time as there is form low cost GPS boards.

  Are you sure? yes | no

Luke Weston wrote 02/14/2017 at 11:10 point

Because you've only got one smooth rod, offset from the syringe piston to one side, the same side as the threaded rod, have you experienced any issues with binding because the plunger holder block is trying to torque around with force offset to the bottom? Especially with relatively large, high-volume syringes?

  Are you sure? yes | no

reyestoledo15 wrote 11/04/2016 at 15:53 point

Howdy! I'm working on a project where the Open Syringe Pump will come in handy, I tried to download the .stl files but for some odd reason, they dont download correctly, is there another way for me to have access to those files?

  Are you sure? yes | no

russian211 wrote 10/07/2016 at 23:53 point

Hey, greatest thing ever! Helped me on my research project.

It works great, BUT, the biggest problem is that sometimes when I press a button it gets misread and doing some other button's command. 
What's the problem? It's not EVERY single time, but fairly often (10% or so).
What could I change in the code or library?

Please assist.
Thank you in advance

  Are you sure? yes | no

Md. Farhan Naseh wrote 06/09/2017 at 04:43 point

Hi ... I am facing the same problem. Were you able to resolve the issue? Please share then.  

  Are you sure? yes | no

davidberton wrote 06/03/2016 at 17:49 point

Hi, I noticed your power supply is 24 V and 1 A, but the hook up guide for the Big Easy Driver says "verify that whatever choice you go with is capable of providing up to 2A" ( I've ordered this motor rated at 1.7 A/phase and a power supply rated for 1 A and 24 V. Am I going to run into problems? Thanks!

  Are you sure? yes | no

Guy wrote 04/07/2016 at 22:40 point

Is there any guide for the assymbly portion of the hardware? Thanks!

  Are you sure? yes | no

tevain wrote 05/12/2016 at 21:36 point

Hi Guy,
I have the same issue... Please let me know if you have some tips/updates,

  Are you sure? yes | no

msmunson wrote 12/04/2015 at 03:29 point


I am having trouble resolving the height of all the features in the 3D printed parts as I scale up for a larger syringe. It looks like you have the height of the threaded rod at 1/2 the motor size plus thickness of the mount plate plus 4? What is the 4? That seems like it would be the top of the threaded rod not the center. But then the holes in the other pieces are centered at that height though.

Similarly, why is the smooth rod set to be at the (height of the screw axis - 6.6)/2?

Where does 6.6 come from? I would think you wanted to center it between the base and the bottom of the lead screw.


  Are you sure? yes | no

msmunson wrote 12/04/2015 at 04:09 point

Ahhh, I see. The motor doesn't rest on the base of the mounting bracket... That's what the 4 is.

  Are you sure? yes | no

skielpad wrote 02/12/2016 at 14:54 point

hi msmunson,

I am also trying to upgrade this project with a bigger syringe (500mL). I was wondering if you could give me some tips on how you have done this.


  Are you sure? yes | no

msmunson wrote 12/02/2015 at 00:38 point

Hi! Great project. I'm starting to modify with a pressure transducer at the outlet in order to create a head space pressure controller (and take a bigger syringe). 

Quick observation. 

The threaded rod is available from McMaster in shorter lengths for a little bit less money.

0.5m is $8.70, and 0.3m is $5.42. Don't know exactly how long it needs to be, but it ends up the same length as the smooth rod which is, at most 0.33m

I'll post pictures after it is built!

  Are you sure? yes | no

artur.noole wrote 11/27/2015 at 20:55 point

Hi Naroom. Create project, but I have no luck getting the LCD to display anything. I can send serial commands but the LCD is only displaying black bars. Any idea what could be wrong?

  Are you sure? yes | no

Jason wrote 11/28/2015 at 16:46 point

Hi artur, I was having the same issues as you. 

However, I think I figured out the source of the problem: It looks like the current LCD button shield sold by Sparkfun is in Version 2, whereas Naroom's version was using Version 1. The result of the upgrade is that all of the values for the input voltages are wonky. 

Changing the following lines of code to what is shown below fixed the issue for me:

 /* -- Keypad states -- */

int adc_key_val[5] ={620, 816, 857, 905, 932};


  Are you sure? yes | no

artur.noole wrote 11/28/2015 at 17:01 point

Thank's Jason, this made it to work. I'am rubbish at arduino programming and I was completely lost at what to do. 

  Are you sure? yes | no

Jason wrote 11/28/2015 at 20:23 point

Glad to hear it worked! I'm also rubbish, so it took longer than I care to admit to figure this out. :)

  Are you sure? yes | no

oscarsot34 wrote 07/19/2016 at 13:47 point


Thank you for the information. At least know the motor is moving. However, it still shows only black bars. How did you figure out the correct numbers in the sequence? I also purchased the LCD from Sparkfun. I am still not able to see the commands on the screem.  I will appreciate your help for solving this issue.

  Are you sure? yes | no

Jason wrote 11/22/2015 at 02:22 point

          *see below* : Also, I'm having trouble with getting the stepper motor to actually step. All of the wiring looks good according to your diagram (and everything seems to be receiving power), but I can't control anything using the keypad. 

          If it helps, it looks like I can send commands to the Arduino to turn the stepper motor using the serial monitor. The "Used" value does actually increase on the keypad when sending commands). The "Used" value on the keypad just doesn't correspond to any actual......stepping. Any words of wisdom are much appreciated. :(  

  Are you sure? yes | no

Jason wrote 11/17/2015 at 15:47 point

Hi Naroom! Great project! I'm still a relative newbie with this kind of stuff, so apologies if the answer to this question is obvious: I was curious why the adafruit LCD shield kit was incompatible with this build? Is there something inherently flawed with the shield or is it just incompatible with the coding? Thanks!

  Are you sure? yes | no

davidberton wrote 05/27/2016 at 18:39 point

I'm also wondering this! The adafruit one would be much easier for me to get my hands on, so if it's a simple change in the code I will definitely go with that. Let me know if you ever figured it out!

  Are you sure? yes | no

Taylor Wass wrote 08/24/2015 at 10:08 point

Hey guys! Nice project. Just wondering what is the slowest steady flow rate you reckon you could get? We are looking for 1-10uL/min through 1/16" tubing with Nema 17!

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates