3D printed quadruped with a tiny BOM

Similar projects worth following
Tardygrade is a plucky little robot that's easy to build with components that most makers have readily at hand.

It employs an unconventional mechanism which requires only two motors, yet allows for full mobility. It walks forward and in reverse, turns left and right, and pivots 360° on the spot. It also does well on uneven terrain.

Tardygrade is designed specifically for FDL manufacture:
• The robot body is entirely 3D printed. No screws needed except for mounting the servos.
• All parts prints without support.

The Tardygrade controller PCB connects to an ESP32 dev board:
• You can use your phone to remote control Tardygrade through a web based UI.
• The PCB can be fitted with laser distance sensors, which lets the robot explore autonomously.

Everything required for building it yourself will be open sourced. See details further below.


Tardygrade is my attempt to leverage some tried and true mechanical linkages into a simple yet capable robot walker. Rather than trying to emulate gait and leg articulation from biology, I started out with a mostly clean slate.

My only two guidelines were: 

  • Minimize the number of servo motors. 
  • If possible, use only 3D printed parts.

The design philosophy has been strictly utilitarian—function over form in every case. It was only after the fact I noticed that the thing ended up being rather cute, and looking a little bit like a tardigrade.

Two peas in a pod. (Left image is creative commons, courtesy of Bob Goldstein and Vicky Madden, UNC Chapel Hill)

I've put a great deal of effort into making the robot body entirely 3D printable. Instead of screws or glue, Tardygrade relies on a combination ridges, snap fits and printer filament to keep itself together.  

All in all there are 37 printed parts. Assembly should take about half an hour.

The 3D model is being developed using Free-CAD and OpenSCAD.


Automation control is based around the ESP32 µC. I'm designing a 5x5 cm printed PCB that acts as a shield for an ESP32 dev-board. The PCB has two pairs of pin headers, for compatibility with both the "Adafruit HUZZAH32 Feather" and the "Tinypico" form factors.

The shield has three main functions:

  • Allows the ESP32 to perform motion control via four hall sensors, which detects the position of a magnet mounted inside the main gear.
  • Voltage regulation for the servo motors.
  • Hardware interface to laser distance sensors.

I'm also planning to add a downward-facing rgb led, to illuminate the robot body from within. There's no practical utility in doing that. I just think it would look cool.

I'm designing the PCB using KiCad EDA. Prototype boards were made by Aisler.

My first attempt at a printed PCB, complete with botch wires. The shield on the right is rocking the excellent Tinypico dev-board.


The automation software is being written in MicroPython. 

For web server on the ESP32 I use Microdot. User interface is written mainly in JavaScript, for remote control via a phone web browser. In addition, the web server provides HTTP endpoints for accessing all automation functions. 

I will probably add some simple AI boilerplate that lets a Tardygrade fitted with distance sensors walk about autonomously. The boilerplate code can then be extended by users who want to experiment with their own AI code.

At some point I might start working on an Arduino port as well.

"Steering wheel" prototype for the web UI. Controls for direction and speed.

Open source, Tindie

For those who are interested in building this robot themselves, all relevant files will eventually be available for download. This includes:

  • 3D printing files in .stl format.
  • KiCad project or gerbers for PCB fabrication.
  • MicroPython code for ESP32 automation control.
  • BOM
  • Assembly manual

Tardygrade will probably also show up as a kit on Tindie at some point, if I can figure out a way of doing international shipping that doesn't cost more than the thing itself. 

In that case people will have the option to get just the shield PCB and print the robot themselves. Or get the full kit if they don't have access to a 3D printer. The prints I'll offer on Tindie will use some higher quality materials like carbon fiber infused nylon, and maybe flexible filament for the legs.

Portable Network Graphics (PNG) - 220.10 kB - 07/05/2021 at 16:25


Portable Network Graphics (PNG) - 248.86 kB - 07/05/2021 at 16:25


Portable Network Graphics (PNG) - 42.75 kB - 07/05/2021 at 16:25


Portable Network Graphics (PNG) - 39.14 kB - 07/05/2021 at 16:28


Portable Network Graphics (PNG) - 58.35 kB - 07/05/2021 at 16:28


View all 7 files

  • Switching switches

    Dejan Ristic09/01/2021 at 17:12 0 comments

    Quick recap

    The global chip shortage snatched away the "ultra high sensitivity" hall switch I was planning on using for the Tardygrade controller pcb. So now I need to make do with a non-ultra alternative. 

    What the consequences are

    Due to the lower sensitivity of the new IC I needed to move the magnet in the main gear closer to the controller pcb in order for it to be detected. The old design had the magnet embedded inside the body of the gear, which allowed me to place it at any angle with respect to the cams. This allowed me to layout the pcb as I pleased, since the magnet position could be adjusted to fit the layout of the hall switches.

    The only way to get the magnet closer to the pcb is to slot it into the upper cam. But that also means I'm committing to a specific radial placement of the magnet, which leaves me with only one way of placing the hall switches.

    New position of the magnet.
    New position of the hall switches. Layout of the pin headers and all other components will need to change as a consequence.

    What to do about it

    For the next pcb prototype I'll turn the pin headers for the ESP32 board to a 45° slant in order to make room for the hall switches. But before ordering new boards I wanted to test the whole concept in practice by retrofitting one of my current prototype boards. 

    With the use of hot glue and some tricky soldering I transplanted the hall switches to coincide with the new magnet path. I then mounted the pcb at a diagonal to simulate the new hall switch placement.

    Shoddy as hell.

    The result

    I'm happy to report that this setup worked out well in testing. The magnet was being detected consistently, which was the main thing I was worried about. Accuracy seems to be as good as before or perhaps even a bit better. Maybe that has to do with the "edge" of the magnet field being less diffuse at a shorter distance, but that's just my speculation.

    In conclusion 

    Crisis is averted. Project still alive and kicking.

  • I didn't think it would happen to me

    Dejan Ristic08/12/2021 at 00:03 0 comments

    I'm now officially a victim of the component drought of 2021. But I will persevere.

    The PCB for Tardygrade is as simple as can be. The most exotic components on it are four surface mounted hall switches. They detect the position of a magnet embedded in the main gear, which lets the uC know the position of the robots legs. 

    When designing the first PCB prototype I had whittled the choice of hall switches down to two options:

    These were both hand solderable and not too expensive when bought i bulk. Since the magnet is fairly far away from the sensors (almost 9 mm) I went with AH9246, which is branded as having "ultra high sensitivity".

    Two weeks later I received the PCBs and after having added some botch wires everything ended up working as expected.

    I then started working on a new improved PCB. I browsed Mouser for components, and noticed that the stock of AH9246 was down to 3000. 

    Didn't there use to be around 8000 last time I checked? And factory lead time was 18 weeks. Hmm, better stock up before they run out. 

    Naah, I'll do it tomorrow. 

    Next day it was down to 0.

    I checked on my second option AH1815. They were running low too so I cleared out Mousers remaining stock of about 1000 units. They were a bit cheaper anyway and required fewer external components. But at this point I had somehow forgotten all about the difference in sensitivity and just assumed that the AH1815 would work as a drop in replacement for AH9246.

    Well, turned out it didn't. The AH1815 wasn't even close to detecting the magnet at that distance. And at the time of writing factory lead time for the AH9246 is almost a year ( ! )

    But I think the situation can be salvaged with a minor redesign of the main gear and PCB.

    Instead of being embedded inside the gear body, the magnet will be slotted into the upper cam of the gear. This puts it right up against the ceiling of the chassis, and much closer to the hall switches. Seemingly close enough for the magnet to get detected.

    There's and issue with that solution however: 

    With the old magnet placement the hall switches could be placed along the front, rear, left and right edges of the board. But a magnet placed in the cam will be at a diagonal of the board for each of the four relevant leg poses. This, in combination with the fact that the magnet now traces a smaller circle, means that the hall switches would overlap the uC pin headers, using the current layout.

    So what I may need to do is to rotate the headers for the uC boards, to make just enough room to fit the four hall switches on the bottom of the PCB.

    Well, it's not the worst thing in the world. Might even look cool. And at least I'm now stocked up with hall switches for the foreseeable future.

  • Misadventures in warp zone

    Dejan Ristic08/02/2021 at 23:07 0 comments

    I'm planning to do some automated endurance testing of Tardygrade later in August. I want to find out if it can whitstand a few hundred hours of movement without breaking down. I'm actually more worried about the drive servo than the 3D printed mechanism, but it remains to be seen which will buckle first.

    I think PETG is a reasonable material choice for the 3D printed gears. It's quite tough and will probably not wear down easily. That being said, nylon would be even better. So I decided to try it.

    I used Filamentum nylon FX256 for the tests. Not sure what is different in that formulation compared with other nylons, it's simply the one I happened to have at hand.

    The small drive gear printed fine in nylon without any warping. But the main gear was another story. Most of the gear teeth would loose grip and start warping halfway through the print. I switched to a glass bed with glue stick but still got similar results. I also tried a range of different extrusion- and heat bed temperatures to no avail. 

    The thing was that the smaller drive gear printed with no issues despite having identical teeth. Could main gears tendency to warp have to do with its larger area? 

    I decided to test that theory by modifying the gear by cutting ditches all through the gear. The idea was to avoid having a big slab of material in the center pulling on the the perimeter, and thus avoid warping.

    The experiment wasn't as successful as I had hoped, if at all. Although there were fewer warped teeth on the modified gear, I only printed one so it might have been a fluke. Either way the warping was not eliminated.

    A straight PETG gear is much preferable over a warped nylon gear. But I might still give nylon another go in future.

  • Carbon copy

    Dejan Ristic08/02/2021 at 14:18 0 comments

    While waiting for the new Tardygrade PCB to get shipped from Germany I passed the time by trying out some more exotic filaments for the chassis.

    I had wanted to try using nylon CF (carbon fiber) filament. This makes for very strong parts. And they also come out considerably lighter than ones printed in PLA or PETG. Both of these properties are of course desirable. The drawback with nylon however is its tendency to warp.

    Luckily Nylon CF doesn't seem to warp as much as regular nylon, but still it does warp noticeably even after getting printed perfectly flat on a glass bed.

    Because of this I decided to alternate nylon and PETG parts in a layer cake fashion. Once assembled, the nylon parts gets more or less bent back into shape due to the rigidity of the PETG parts. I used nylon CF for the floor-facing parts with thin walls. This should make the robot tougher and more resistant to fall damage. Also the material looks very nice with its matte finish and almost invisible layer lines.

    Initial prints had quite a bit of stringing. With other materials that's pretty easy to clean up. But with nylon CF I found the stringing tends to form shaggy carpets that are very tough and resistant to knife blades, especially inside corners. Since I rely on tight tolerances this stuff would seriously interfere with the mechanism.

    After a few more tries I managed to get rid of almost all of the stringing by enabling the "Avoid crossing perimeters" option in PrusaSlicer and bumping up the retraction to 4 mm. I wouldn't generally recommend that much retraction since it can mess up the extruder on some printers, but my Prusa I3 seemed to be able to handle it.

    I also lowered the extrusion rate to 95% which resulted in a smoother surface finish in my case.

    The other problem was the abrasiveness of the material. To avoid friction I shaved 0.5 mm off the main hull floor to make sure neither the main gear nor the drive gear would come in contact with it. 

    I then added a little washer for the drive gear to rest on. It's made to have circular layer lines and can be printed separately with a low friction filament (in this case nylon FX256).

    The main gear only makes contact with the eight little protrusions around the well leading down to the bottom actuator. 

    The steering gear doesn't move nearly as much as the two other ones, so I think a little bit of friction is ok in that case.

    The leg parts were printed in black nylon FX256. Nylon is of course especially suitable for the snap fit parts. They were much easier to unsnap once inserted and should withstand many more cycles than ones made with PLA.

    Next I want to try and print the legs with flexible filament. I'm waiting for two spools of TPU that should arrive next week. Let's see how that goes. 

  • Solve for Gen X

    Dejan Ristic07/27/2021 at 13:57 0 comments

    I did study some math while at university. But like many (most) of my compatriots I didn't learn math so much as I learned how to take exams. I've since lived under constant threat of that laziness coming back to bite me.

    Even one of the issues I faced in this very project was dangerously close to turning into a math problem. 

    The issue had to do with the robots legs. 

    One pair of legs is attached to the upper body of the robot and the other pair to the lower body, meaning that they need to have different lengths. 

    So far so good. 

    Additionally, all four feet needs to touch the ground both when the robot is standing and when it's crouching. And hmm... There seems to be quite a few variables to take into account:

    • Length of the leg.
    • Length of the lever.
    • The travel of the actuator that pushes the lever.
    • Point on the leg where the lever hinges.
    • And more...

    There appeared to be no way out of it this time. I resigned myself to the grim fate of actually having to solve an equation. 

    It ended up not being all that bad though. After some initial teeth grinding I realized I could just have the FreeCad constraint solver do all the the hard work for me. 

    I drew up a sketch of the linkages for both versions of legs, both in their standing and crouching positions. I set all external dimensions and then added "equidistant from ground" constraints.

    I left all leg and lever lengths undefined. I set a constraint for how tall I wanted the robot to be while standing, but left it up to the solver to decide how deep the crouch would be. (8.28 mm as it turned out)

    First time around the solver returned no solution. 

    I then added another degree of freedom by allowing the longer leg to attach to the lever at an arbitrary point.

    That did the trick and the sketch turned green, meaning it was fully constrained, and a solution had been found.

    For some reason I was still a bit skeptical of this working—I guess it's harder to convince yourself of that when you're cheating. But after printing and assembly, the legs worked out great and the robot didn't wiggle at all while standing nor while crouching.

    I couldn't have hoped for a better turn out. And more importantly I had once more managed to keep my grey matter in its natural flabby and inert state.

    Crisis averted. This time. But it was too close for comfort.

  • A case of engineers pareidolia

    Dejan Ristic07/20/2021 at 08:15 0 comments

    I'm not yet very far along on my journey as an amateur cad monkey.

    Something I've noticed is that oftentimes (or maybe most of the time) dimensions in my drawings are dictated by some external constraint. But once in a while necessity doesn't demand one unique set of dimensions. I'm suddenly free to choose based on aesthetics or gut feeling. I find those choices disconcerting, because who's to say what THE right dimension is.

    Anyways, at the end of this long and winding design process I noticed that the bounding rectangle of the robot frame somehow felt weighty and significant. Is that... the golden ratio? 

    Well it turned out to be off by a little bit, but still pretty darn close. I will take that as a sign that god is 99% percent satisfied with my homework.

    Also, now I think I know what it feels like to recognize the face of Jesus in a piece of toast.

  • Cable management

    Dejan Ristic07/14/2021 at 16:53 0 comments

    In evolution, the term exaptation describes the shift of function of a trait. One example is the feathers of birds, which may have evolved as thermal insulation, and were later adapted for flight.

    That's a poncy way of saying I found a secondary function for one of Tardygrades parts.

    The original part was devised for mounting the PCB.

    Since I've been trying to avoid using any screws in the robot design, I didn't want to use any for mounting the PCB either. Instead I made a sliding block, a pair of which are used to secure the PCB on top of the robot. 

    Sliding blocks (orange). Servo cables are a mess.

    A separate issue was that I hadn't come up with a good way to manage the servo cables, which are about five times as long as they need to be.

    But after making the sliding blocks I realized I could re-purpose them to house the cable slack as well:

    1. The excess cable is pulled through a hole on top of the block and folded up inside.
    2. The block is slid in from the side. It has flanges at its base that fits cutouts in the upper body lid.
    3. The block snaps in place thanks to a small protrusion that fits a corresponding notch on the back of the block.
    4. The blocks overhanging lip holds the PCB in place. Neat!

  • Leg day

    Dejan Ristic07/12/2021 at 13:49 0 comments

    "A clever man climbs the stairs. A wise man rides the escalator. An enlightened man turns his feet into stairs."
    Quote: some crazy biohacker

    As far as I'm concerned the concept of a walking robot is just cool, and its existence needs not be justified beyond that. 

    What would be even cooler though, is if that robot were actually useful in some way.

    In that spirit, a goal I've had for Tardygrade was to make it able to negotiate rough and undeven terrain. After all, that's the main USP of having legs rather than wheels.

    The articulation of the robots legs couldn't be simpler, with only 1 DOF. But since the legs lifts off the ground it does lend itself quite well to climbing.

    That's only half the battle though. If the legs can't retain grip on obstacles the robot will just slide back to where it started.

    I had to go through several iterations before I ended up with a foot design that was suitable for climbing.

    Evolutionary steps in leg design.

    Here's the solution I ended up with and why I found it to be effective:

    1. The sole of the foot has a stair-step profile with steps of increasingly large size toward the end.
    2. When the leg is retracted, the stairs are perpendicular to the ground, to give the foot good purchase on obstacles.
    3. As the leg extends, the stair shape turns steeper and more claw-like, which helps the foot retain its grip on the obstacle.
    4. The backward facing leg has a spur on its heel. When that leg is extended the spur maintains purchase on the obstacle while the forward facing foot retracts for its next step.

  • How to print a hole

    Dejan Ristic07/10/2021 at 17:51 0 comments

    Here's a useful 3D printing trick I picked up from Maker's Muse:

    When 3D printing something that has a hole parallel to the XY-plane, you'll end up with a flat or drooping spot in the "ceiling" of that hole.

    To remedy this a teardrop shaped cutout can be added to the top portion of the hole. With this method there's no need for using overly loose tolerances.

    I found that an angle of 100°-120° at the edge of the teardrop works well.

    Maybe this is common knowledge, but it was new to me so I thought I'd share it here.

    Well, that's all for now.

  • Threading the needle (lenghtwise)

    Dejan Ristic07/09/2021 at 20:26 0 comments

    I was on a quest to rid the robot assembly of screws.

    Eventually it was down to just the one. That was the screw that mounts the main gear axle to the robot upper body and essentially holds all parts of the body together. 

    It was a straightforward construction, but it came with a tradeoff. Since the axle is quite thin—and is parallel with the Z axis when 3D printed—it inevitably turns out somewhat brittle. 

    Old design for main gear axle.
    Old design. Battery cord goes around the left side of the body.,

    Meanwhile, I had also wrestled with how to gracefully route the leads from the battery located on the bottom of the robot up to the electronics on top. The current solution was to have the leads run up and around the left side of the body. That's ugly and also impractical since the wires would be prone to get tangled up on stuff. 

    So I started to noodle on if it actually would be possible to route the leads inside the main axle, since that happens to be the only path trough the body with no moving parts. The eye of the storm so to speak. 

    But that's where the screw needs to go! Now how do I attach the axle to the upper body?

    New main gear axle design.

    It took a while figuring out, but finally I ended up with this solution:

    1. The main axle now consists of two mirrored parts, split lengthwise along the axle. This way they can be printed lying down for maximum strength.
    2. Each part of the axle has a groove that fits a 1.2 mm lead. The groove gets gradually deeper along the upper part of the axle.
    3. The base of each axle part has a slot that fits the edge of the rectangular cutout in the lower body. The parts gets attached by folding them into the cutout. 
    4. To pin the axle to the upper body, a short length of 1.75 mm filament is slid horizontally through the axle, between the two leads, and is held in place by a 3D printed ring nut.
    5. A thin sleeve is fitted over the assembly to prevent the filament from sliding out.
    6. The PCB fits snugly on top, which in turn prevents the sleeve from getting loose.
    Step by step attachment of main gear axle. Ring nut => yellow. Sleeve => purple.
    Guess I didn't need that screw after all. Great success!

View all 13 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

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