Arcus-3D-P1 - PnP for 3D printers

Open source, mostly 3D printable, lightweight pick and place head for a standard groove mount

Similar projects worth following
Part rotation and bottom looking vision using two 9g digital hobby servos.

Bottom vision is currently implemented by using the top vision and a flying set of mirrors.

At 59 grams including the camera and mirrors, it weighs about the same as an E3D v6 hotend.

Standard groove mount, so you can just replace your hotend.


A pair of 9g digital hobby servos are utilized for part rotation and swinging a set of mirrors in front of the top vision to allow it to also provide the bottom vision.

360 degrees of part rotation is implemented, has an accuracy of about 1.6 degrees, and a best case rotation speed of 0.13sec/90 degrees.

The mirrors should be able to extend or retract in 0.19sec.

Full rotation and clearance for parts up to 21.5x21.5x12mm is implemented. 

The current design including the camera weighs 59 grams which is lighter than an assembled E3D v6, and the goal is to allow this to fit in its place.

This should allow adapting any existing 3D printer with decent accuracy, Z axis speed, and a stable build platform for small scale pick and place.

Other parallel projects are addressing some of the remaining requirements such as an inexpensive vacuum source and 3-way valve.


It should be noted that the cheap, knock-off version servos will not work here for part rotation.  The measured accuracy of the knock-offs was almost 5x worse and they had significant backlash as well. This almost killed the project before it started as that was my original servo for testing.  

However, I was pleasantly surprised when I tried some still relatively inexpensive, but genuine manufacturer servos.  In this case, they were Tower Pro.  They exhibited basically zero backlash (as the potentiometer is tightly coupled to the output shaft), and accuracy within 1 degree for most of the scale.  As I'm using a 2:1 drive, that puts the overall accuracy at about 2 degrees.

There would need to be compensation for linearity if I used these for absolute positioning and temperature/timing issues could cause drift, but the nature of this task is relative if approached correctly.  You pick up a part, rotate, check the positioning, and then rotate it relative to the previous position.  This pattern will inherently correct for drift related errors.  They should perform that task just about as well as the common Nema 8 stepper solution.

Another caveat is that if the requested motion is less than 2 degrees, the servo sometimes doesn't move at all.  So I'm anticipating needing to code a minimum move size which backs off and then rotates to the target to compensate.

Lastly, a flying bottom looking camera doing vision during moves requires special sauce to work in OpenPnP.  It does have a defined path for implementation though.

A couple of these things may require modifications to OpenPnP to work, but I think the result will be worth it.

  • Scrapping the endoscope, and all that means.

    Daren Schwenkea day ago 2 comments

    I've been mulling over ditching the endoscope for a more mainstream camera module.

    The S/N ratio sucks, the quality sucks, and I have no control over exposure on the one I have.  The exposure is a big deal as I switch from bottom to top vision the brightness changes causing a delay until it adjusts... every time.  It also has started to intermittently fail, like the imaging portion is losing bits.  This is probably due to the sheer number of times I've had to mess with it as the USB cable also had an issue at the attachment point.

    So I've been researching replacement cameras.  The statistics for the other USB endoscope cameras have been really hard to pull together and determining if any of them supported control over exposure has been... impossible.  I think I'm going to go with a more mainstream camera.

    I've settled on either the Raspberry Pi mini camera version 1.3, or the ELP super mini 720P 45 degree version.  Both would fit my current design with some modifications..

    The ELP has a little larger footprint at 26mm square, and the camera is centered on it, which would cause an issue with my current layout as the mirror arm linkage passes through that space.  However it would plug right in where my endoscope was going into the current plans of using the BBG as my platform.

    The other plan using the Pi mini camera is a radical departure from 'the plan'.

    Obviously this requires me to move my vision processing to a Raspberry Pi.  However, the Pi would actually be faster at vision, and the entire image pipeline is much faster as well since it doesn't have to traverse the USB bus.  But the Pi can't do step generation with hardware real-time accuracy like the BBG can using the PRU on Machinekit so I lose the ability to have a single board solution.  I'm also partial to kinematics other than cartesian for which there wasn't really a good inexpensive solution, until recently.

    Through the use of klipper and a couple cheap arduinos I get the best of both worlds, mostly.  The arduinos (yes, you can use more than one synchronized) handle the hard real-time stuff and are just passed a queue of things to do, whereas the motion planning and actual interpretation of gcode happens in python on the Pi.  That is a step up from the old way of trying to squeeze the motion onto an 8 bit AVR with varying levels of compromise required.

    The downsides of switching to klipper:

    • No S-curve motion planning, just trapezoidal.
    • I would need to write the kinematics module I need from scratch, but at least I could do it in Python.
    • There is an inherent delay from when you issue a command to when it executes due to the queuing which needs to happen on the arduinos.
    • It's brand new and still experimental, whereas Machinekit has been rock solid and I've used it for... years.
    • Hardware changes, as my current solution uses a custom cape plugged into a BBG.

    The upside:

    • I could use a standard, cheap, RAMPS board and get basically the performance of a Smoothie board.
    • Faster vision with a better, widely tested, and well documented camera checking all the boxes.
    • More cores on the Pi, for less contention for when vision starts to suck down the processor.
    • Possibly hardware accelerated OpenCV performance via the GPU?

    I'm mulling it over.  

    If you made it this far, feel free to weigh in.

  • And now stop..

    Daren Schwenke3 days ago 0 comments

    I'm switching to an adjustable stop for the mirror arm.

    I've printed a couple mirror arms and scraping each one for final adjustment of the angle is getting old.

    I figured out how/where I could put the adjustment screws without adding weight to my arm.  Of course this means reprinting everything.

    Doing that now.

  • Ring light, or light ring..

    Daren Schwenke4 days ago 0 comments

    I printed the light ring.  That's what I'm going with.

    It was too small because I modeled the strip length based on the outer surface, I'm actually using the inner surface, so.. the strip is too long and doesn't fit.  It's important that the strip goes all the way to the end in my ring as I'm already down ~2 LEDs and about 70 degrees from the gap required to clear the arm.

    Instead of reworking the model math to fix my error, I just added a negative offset to the variable which held my end clearance to match how much more length I needed.

    I also tested the mounting slots, fitting them to my newly printed mounting arm wings.  The light ring split along the layer lines fairly easily.  I made that area thicker, wider, and taller in the model, so my weight is now up to 1.3 grams.  

    Mounting the tabs into a channel on the surface with super glue instead of modeling a proper socket would probably work better here and was actually the original plan until I got going on the idea of a socket.  

    I reprinted the ring with the length and socket changes.  

    The strip length is right now, and the socket is strong enough, but it is a real pain to clean up.  Short ledges right next to short bridges doesn't work so well.  I was thinking about going back to the surface channel/super glued version, but then snapping it on and having it stay put was a little satisfying.

    Time to sand it and give it two coats of paint, on the outside.  First coat will be white primer so the inside doesn't turn black as it's so thin, then over that will go some black camo paint to reduce the light going through it.

    EDIT: My painting sucked, so just reprinting it in black and calling it good.

  • Bottom vision lighting.

    Daren Schwenke5 days ago 0 comments

    You are supposed to light the bottom vision parts from the side, at between a 45 and 60 degree angle.  This is usually accomplished with four LED strips in an angled box, soldered together, etc...  Seemed complicated for putting on the arm.

    So to keep things simpler, I decided to just use the strip light as a single part, on edge, wrapped into in a cylinder. 

    Of course I have to leave a gap for the arm to swing over nozzle/parts, and for it to lay flat so it clears already placed parts.  Then the remaining inside circumference also has to be a multiple of 50mm as that is where you can cut the strips..  The simplest way was to actually write it out as an equation and solve it.

    It ended up being a rather complicated shape, but used less code to do it than most..

    Here is what that looks like, for three 50mm light sections.

    The LED strip will go inside the outer cylinder.  I added the sloped inner ring to reduce glare.  It shields the main mirror from being directly lit by the LEDs.

    The entire light ring is a single wall print except for the attachment point and weighs less than a gram.   The LEDs I'm using are pretty strong, so If I left the lights on for too long, it might melt...

    Assembled view.

     I had to move my 'wings' up a little bit as the light ring didn't clear the servo's otherwise.

    Reprinting the mirror arm now.

  • Now, with wings.

    Daren Schwenke5 days ago 0 comments

    Worked on the mirror arm, a lot.  Most dimensions are now direct multiples of the nozzle diameter, the camera area is based on rotating a model of the camera, there is a mask beyond the top of the main mirror now, and I added....


    The wings give me a place to snap on a little bracket. The little bracket will let me mount some strip lights at the appropriate height and angle for the bottom vision.  It can't be printed as one piece as the lights would need to be below the bed here and I'm not giving up the strength I'm getting from printing this flat.

    I'm doing this because it will just be easier and less problematic to have proper lighting instead of trying to get backlighting of the parts working, for now at least.

    The hood over the main mirror is a single width extrusion.  It printed great, and the weight is now back down to 3.1 grams.

    Going to paint it camo black tomorrow and make some new mirrors.

  • How to destroy a mirror.

    Daren Schwenke7 days ago 0 comments

    Everything was looking good.  My mirrors cut perfectly.

    I figured out a better way to cut straight lines in glass.  A Post-it note.

    Previously I used a straight edge and they were a hot mess.  Just the thickness of the post-it was enough for the carbide wheel in the glass cutter to stay on track and sticks just well enough to stay put (a fresh one that is).

    All my cuts were within 0.2mm, and all oversized.  About 2 minutes of wet sanding on each edge and they looked gorgeous.

    Then I got the bright idea to scuff the backing paint to make the paint remover work faster.

    Fast forward to the end, my ever so light scuffing of course went through in spots and I have scratches through the silver.

    I installed them anyway.  Figured I could at least see how my mask was working.

    I don't like it.  The mask is all around the mirror here, but extends into the viewing area across the bottom.

    I'm going to remove that part of the mask.  I think I'll also paint the rest of the mask with camo black paint next time..

    The optics were pretty well aligned right out of the box now though.  I did nothing to the above other than press the mirrors in and assemble it.

    Oh... I scratched the plastic cover on the end of the endoscope... so I removed it.  Thought it was glass.  Nope.  In the meantime, I got a shot of my horribly skewed endoscope camera and gob of UV cure fix.

    That, is where it is optically aligned to the case.

    You get what you pay for.

  • Happy accident?

    Daren Schwenke02/18/2018 at 06:37 0 comments

    Dropped the head today, on carpet.

    I think the mirror broke so easily due to my haste in cleaning up the edges.  I'll do a better job next time.

    I'll be reprinting the arm as removing the mirrors is probably impossible without damage.  So I made a couple changes.

    I noticed in my camera view the areas past the edges of the mirror could be pretty distracting, so I decided to mask it.  This probably won't matter for OpenPnP as it does this in software for vision, but humans will be looking at it too and it may reduce glare from other light sources as well.  I already had the beam path as a pyramid, so this was relatively easy.

    I also realized that the only thing limiting it now from rotating larger parts was the width of the arm.  Previously the first mirror would interfere first.  So I changed the arm geometry to be wider in the middle and I can now clear parts up to 25mm, as long as they are lower profile.

    The bent elbow shape isn't as strong/rigid as the straight path, so I made the arms a little thicker as well which increased the weight to 4 grams.

    So does that make this a happy accident?  I'll take it..

    New arm is printing now.

    Need to make new mirrors too.

    Edit: Printed.  

    The bridge portion of the mask I added had some nozzle width lines spanning to keep the aperture square and they were a PITA to clean up due to the small size.  It might be simpler to make this a second part attaching to the mirror.

  • Accuracy.

    Daren Schwenke02/16/2018 at 23:18 0 comments

    The mirror arm has to stop at exactly the same angle/place every time for this idea to work.  

    I've tried to plan for this:

    • The mirror arm and servo linkage are designed so the servo arm approaches the apex of it's travel when the mirrors are deployed.  This results in the mirror arm extending rapidly, but then slowing down just before seating on the hard stop.  It also gives me a huge range on the servo for fine tuning the pressure applied to the stop.
    • I have the option of making the linkage spring loaded, or just using a digital servo as well.  I'm seeing how well the cheap servos work first.
    • A large area, hard stop is included for the extended position.
    • I used press fit real bearings with a little preload.
    • Stainless pins anchor the arm, also press fit.
    • The optics were aligned and then UV cure glued into place.

    This seems to have worked.  For the video I was swinging the arm itself by hand from one side and driving the servo unpowered in the process to a random angle.  If you look carefully at the video, I was still looking right down the bore of my 2mmx50mm shaft straight enough nearly every time to see the circle of light from the other end.  

    EDIT: I noticed the circle of light wasn't quite a circle.  Turns out I still had flashing from cutting the tubing on the end inside the brass bit.  Now.. it's a circle...  :)

  • Take it to the limit (one more time)

    Daren Schwenke02/15/2018 at 20:49 0 comments

    The nozzle needs to give way a bit in the event that the PCB you are placing is warped to prevent breaking components.  There are two trains of thought on this.  You can either implement the spring in every nozzle, or implement it in the nozzle holder.

    I decided to use luer lock syringe needles for my nozzles as they are a precisely machined and commonly available standard.  The luer lock itself at least is usually precisely machined.  It seems to be hard to find them with the needles actually centered with no runout, but I'll deal with that later.  So I implemented the required springy-ness by spring loading the holder and allowing the hypodermic tubing which is the shaft to slide in the bearings.

    The spring loading also has the nice side effect of preloading the bearings for reduced runout.

    It also gave me a place to put a Z limit switch which can then be used for leveling and to detect nozzles of varying length.

  • Genesis

    Daren Schwenke02/14/2018 at 21:58 0 comments

    Exactly one month ago this idea was born on the OpenPnP forum.

    It's not often I can trace the origin of something I've built to more than a vague recollection of events, but not this one.  

    This idea was born Jan 14th at 12:48pm when it was suggested in reply to my original post by the aptly named TheCunningFellow.  So this is a shout out to him and the folks over at the OpenPnP forum for their help and support fielding my vague and often uneducated questions over the last month.

    Thank you.

View all 24 project logs

Enjoy this project?



Marc Peltier wrote 6 days ago point

Hi Daren!
I had guessed the organization of gear train, and the need for a 90° gearbox, between the servo output and the actuator gear.

I recently experimented with gears in POM, very cheap on aliexpress. com. There are all kinds of models, straight, in crown, or at 45°, with different numbers of teeth. The bore is generally 1.95mm, when they are designed to be pressed together on a 2mm shaft, or 2.1mm, when they are designed to rotate freely on the shaft.

I was able to resize the bore with my lathe, according to my needs. For the small series we use, it is better to base the design on existing gears, to be modified at the lathe. Moulds are very expensive!

You can probably also make the splines for coupling with the servo output by heat, deforming an existing POM part with a brass servo output coupler, used as a heated punch. A hijacked hot-end will be perfect for that...

  Are you sure? yes | no

Daren Schwenke wrote 6 days ago point

That is pretty much exactly the path I took and the parts I used.  The fitment depth is critical though to prevent backlash and binding which took some iteration.

  Are you sure? yes | no

Marc Peltier wrote 5 days ago point

Just an idea this morning:
Dismantle the servo. Mount the potentiometer directly on the Pick&Place rotary tube, and try to directly link the last pinion of the servo gear train to this tube, with no 90° deflection, making it a part of the servo system. By the way, you will probably be able to improve the transmission ratio, and in the whole the precision in rotation. The very short stroke of the Z-Probe should make it possible to find a pinion thick enough to take up this movement without loss of link.

Of course, this will completely call into question the beautiful symmetrical architecture that you currently have, but I'm sure you will be able to quickly find a new layout logic, just as satisfying !

  Are you sure? yes | no

Daren Schwenke wrote 5 days ago point

Yep.  If I can't get the accuracy I need with just the digital servo, reading the output shaft angle directly is one way to move forward.  The servo potentiometer is still only 180 degrees though and a rotary encoder of sufficient resolution to actually improve the situation would greatly increase the cost.  

Rolling your own encoder you would need at least 400 cuts in a disk to improve here.  3D printing that at even 1 nozzle width per cut is still too large to fit nicely in the current design.

I toyed with the idea of drilling some holes in the third to last gear inside the servo and adding an optical gate there (with the servo re-wired for continous rotation).  The PID loop would move to Machinekit which is well suited to do a good job at it out of the box. That would work and I even have a suitable gate in my parts bin.  I would rather not though.

There are even existing multi-turn servos which are not continuous rotation designed for RC sailboats too, but again... many times the cost.

In the end, I'll probably just live with whatever accuracy I can get here.

  Are you sure? yes | no

Marc Peltier wrote 5 days ago point

Many RC servo potentiometers have a 270° stroke. These 9g servos are very economical, and trying to make your P&P head with just two digital servo controls makes sense. It's attractive because it's simple. And you could make a speed daemon with that, installed on a delta robot !

If you give up this approach, then why not just use this type of stepper motor Ø15mm, with directly usable output pinion and integrated planetary reduction: 

2 PCS high torque 5 V dc 2 phase 4 fil Dia 15mm moteur pas à pas avec micro planétaire réducteur avec engrenage conique(China),searchweb201602_2_10152_10151_10065_10344_10068_10342_10343_10340_10341_10084_10083_10618_10630_10305_10304_10307_10306_10302_5722316_5711211_10313_10059_10184_10534_100031_10629_10103_10626_10625_10624_10623_10622_10621_10620_10142,searchweb201603_25,ppcSwitch_5&algo_expid=17e14cc8-4653-4261-ab15-56833755b9ca-4&algo_pvid=17e14cc8-4653-4261-ab15-56833755b9ca&transAbTest=ae803_5&priceBeautifyAB=0

You will get more than 2000 steps per revolution, about 2 turns/sec, with a backlash of about 5°, which can be cancelled by a spring. It is probably easier than using a position encoder and MachineKit...

  Are you sure? yes | no

Marc Peltier wrote 7 days ago point

Very well done !

I'm very happy to see this, because it's totally in line with what I imagine as equipment for my own Zatsit delta robot, very soon on KickStarter:

Zatsit does not need the standard mount. Do you intend to publish the STL files, or better, the design files, so that it is easier to make the necessary adaptations?

You can get very cheap front surface mirrors here :

Congratulations again!

  Are you sure? yes | no

Daren Schwenke wrote 7 days ago point

Thank you.

The source is a mess right now and I'd be embarrassed to release it.  I rushed it and most of my scaling and dimensional dependency best practices for OpenSCAD files went out the window. It's also started as an offshoot and is dependent on the code for the C1 so it would need to be split.  Eventually.

There are a couple bits like the right angle drive gears for rotation which require accuracy/fine detail beyond what any 3D printer can handle though.  I made the gears for the prototype by hand from existing injection moulded nylon gears, but it took a lot of patience and a couple tries to get them right.  If it works well, I'm going to look at getting them injection moulded with the servo splines built in.  Even then I think the only way to make the molds will be EDM.  Tiny stuff.

Thanks for the link.  I should be able to get a perfect set of mirrors here next time.  Still learning.  I got about 3 more tries here before I have to go spring for another $1 mirror.  Long term I'd definitely just source them cut to size, but this is something that people with a lot of patience can DIY to cut costs if I figure out how to do it and document it.

  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