One of the necessary pieces for bringing up the moteus brushless controller and for ongoing development with it is being able to communicate with the device on the desk. There aren’t many options for desktop FDCAN communication currently, and certainly none that are in the affordable range occupied by the CANUSB family of devices which I’ve used before and was very happy with. Thus I created “fdcanusb”, a USB to FDCAN converter that allows one to communicate with FDCAN devices via a USB interface using a documented protocol, no drivers necessary.
The notable features:
USB 2.0 full speed host interface
ISO 11898-1: 2015 FDCAN interface on industry standard DB9 connector
Standards compliant bitrates up to 1/5Mbps supported
Software controllable termination
Frame sizes up to 64 bytes
Non-standards compliant bitrates allowed
Documented CDC ACM based host protocol (virtual COM port)
Apache 2.0 licensed firmware based on the STM32G474 controller
All for an expected sales prices of around $100.
This does come with some caveats: For one there is no galvanic or optoisolation, you get a common mode range of around +- 12V. Another is that using just a USB 2.0 full speed interface means it may not be able to keep a FDCAN bus fully saturated at high bitrates. Finally, the firmware will start out with just the bare bones capabilities, but can be extended to support features such as error injection, triggers, buffering, and more compact protocols in the future.
I’ve got the first functioning prototypes of these boards in hand now:
As the first part of the new moteus servo mk2, and continuing in my seriesoflearning about CNC by building parts for the quadruped, next up I machined the input to the planet gears on my Pocket NC V2-50. This was a part, that for my quad A0 build, I used a 3d printed part in PETG as it is probably the least stringent part in the gearbox in terms of tolerances and load, although I still expect the plastic ones will likely wear and fail after some time with heavy use.
In the gearbox, this planet input interfaces to a number of different sub-assemblies:
The planet output inserts into its studs, the planet shafts insert into recessed holes in the face, and the planet input bearing fits into its center. Bolts fit through the back to pull the planet output towards the input. There is also an indexing cutaway on the outside for an eventual absolute position system.
I made these from round stock, 1.75in in diameter cut to 1″. The machining was done in two setups, each using the Sherline 4 jaw chuck mounted to the B axis of the Pocket NC.
In the first setup, the back side was roughed out, the center hole was cut out, and each of the holes for the bolts was bored along with a countersunk region.
The second setup, flipped over, first roughed, then proceeded to finish each of the necessary surfaces. There were two more interesting bits here. First, I made an alignment fixture so that I could get the holes from the back and front half to align. That consisted of a cylindrical shell that fit into the mounting pattern on the B table of the pocket NC and a thin plate that fit under the part. The thin plate just stays in place during the machining operation, where the shell pulls out.
The other interesting part was that I ended up clearing away a bit of the inside of each stud so that my bit could reach down to finish the bearing mounting surface. That way I could get away with just using an 11mm flute, which already gave a terrible enough surface finish that going longer would have only made worse.
As I’ve observed in the past, I had yet another problem with tool pullout during this part. Here, the problem was very similar to my past incident, when Fusion left a thin wall, then tried to punch through it. My fix from then was doing the right thing, however the wall was just too thick I believe, causing the toolholder to lose grip. In this clip, you can see that after it breaks through the wall, the mill cuts through some stock as it repositions over. The slip was only about 0.3mm, but that’s enough to mess things up.
However, this time I think I figured out an even better solution. Simply lie to Fusion 360 about the diameter of the cutting tool and say it is slightly undersized. That results in fusion leaving the adaptive passes closer together, and thus no thin walls or foils are left behind. It would be nice if that were just an option in the adaptive settings. I suppose you could override it in the “Compare and Edit” window, but creating a faux “tool” just for roughing makes it easier for me to see that I’ve applied the override correctly.
Here’s a video showing the different tool paths for the finished part:
The stock cut of 1″ is oversized in this part and adds a bit more than an hour to the cycle time over a minimum sized piece of stock. I need to get a setup for cutting stock smaller than an inch here soon.
As described in my roadmap, making a new revision of the moteus servo is up there on my list of things to do. The initial servos were a work of art, yes, but also pretty fragile, very labor intensive, and still not all that robust. My goals this time around are:
Manufacturability: The servo mk1 took about 2 or 3 man-days of manufacturing time per servo once all the steps were factored in. I’d like to get that down to an hour or two at most per servo.
Robustness: The planet input, outer housing, back housing, and controller cover of the mk1 servo were 3d printed, mostly to save cost and time. This necessitated adding reinforcing rings on the outer housing, as it is nearly impossible to 3d print something with the required material properties in a single print. At this point, all of these components should just be made of aluminum like the others.
Repairability: Once the mk1 was assembled, there was no way to disassemble it, as installing the stator interfered with the ability to remove the outer housing, and the outer housing in place interfered with the ability to remove the stator.
Convenience: The mk1 servo used the r3.1 moteus controller, which had RS485 connectors sticking straight out the back, and bare power wires coming out the back. That orientation for connecting things was not terribly convenient in the full rotation leg design, and required making extension cables. The newer moteus controller has the connectors sticking out the bottom, so the servo needs to accommodate that.
Changes in moteus servo mk2
The current design for the moteus servo mk2, as the exploded video above shows, has a number of changes.
First, the outer housing has been changed to be purely cylindrical. This allows it to be machined out of round tube stock, and also assembled and removed in any order. Thus the front housing now has a slightly larger outer diameter, and has threaded holes around the perimeter and 8 primary mounting holes instead of 6.
The rotor is custom machined, so that the sun gear holder assembly is no longer required. A not shown in the explosing mini 3d printed adapter will hold the magnet and fit inside the rotor bearing on the back.
The planet input now has a small indexing slot to eventually register a magnet holding assembly that can be used to sense the position of the output stage, and a position sense board is installed in the front housing to sense it.
The back housing has been updated to mount a newer moteus controller, provide heatsinking to it, and also be slightly slimmer due to being manufactured from aluminum.
The overall dimensions are approximately the same as the mk1, with the depth increasing by a few millimeters (largely because of the connectors on the new moteus controller), and the outer diameter decreasing by a few millimeters. I believe I should be able to get the weight to be about the same as the mk1, around 430-450 grams.
First, I’ll make a functional prototype to verify that all the parts fit together and work. Then I’ll work to get the weight back down to closer to the mk1, after which I’ll start producing enough of these to make more robots.
While not perfect, now that I have flux braking in place, I have now succesfully pronked around for a while without faulting! There are a number of outstanding problems that still need to be addressed:
Sometimes the landing phase is erroneously cut short
There is occasionally a grinding like noise that sounds like some controller is unstable
I think the lateral movement is not working correctly
The gait needs to be smarter about moving the legs past the center point when in mid-flight, and changing the gait period to achieve different speeds
And probably a bunch of other problems I haven’t even identified yet
That said, it is still fun to watch it romp around!
When I was trying my first pronking, I kept having over-voltage issues when the servos were trying to dump power back onto the DC bus, no matter how high I set the voltage limit. During that test, I was running with a nearly full battery, so my working theory is that the battery protection circuit was disconnecting the battery either because of too high a charging current, or too high a system voltage. When the battery was disconnected, and the servos were still putting power onto the bus, that resulted in the voltage spiking arbitrarily high, followed by a total loss of power when they all faulted and then nothing was powering the bus at all.
Clearly I needed somewhere to dump the power during those transient events. One option would be to build a brake chopper, sticking a power resistor somewhere and using that to burn off the extra. But, why bother with that when I already have 12 big power resistors attached to the robot! Errr… motors that is.
Anyways, my solution for now is to create a “virtual resistor” in the moteus firmware i.e. “flux braking” that just dumps current into the D-axis of each motor proportional to the magnitude of the DC bus voltage above some configurable threshold. That results in each servo working independently to keep the overall system voltage from getting too high in a hopefully stable manner.
I ran the programmable power supply through a voltage sweep while commanding zero velocity on all 12 joints to verify this was working as expected. It did get pretty audibly noisy at the higher voltages, probably because of some feedback with the voltage sensing so I added a little filtering after which the noise was manageable.
Now that I can do controlled jumps, and have a UI which allows me to use the joystick, I finally started actually working towards pronking gaits. Too bad for you, this post doesn’t have any details, merely a video snapshot of my learning and debugging process…
Now that I had a controlled jump with the quad A0, I wanted to chain those jumps together into a pronking gait. The first part of that was creating a mechanism by which I could actually command varying motion commands. For the previous full rate experiments, all I had built was a CLI that allowed you to type commands. That sufficed for initiating a single jump, but not really for moving around in space with a dynamic gait. Something with a joystick would be necessary.
For Super Mega Microbot, we had a Mech Warfare dedicated client application which, for various reasons is something I want to get away from and its control protocol isn’t even that suited to the things that the quad A0 is capable of anyways. For the quad A0 I want to eventually have 2 command and control systems: a high bandwidth one that uses wifi, and a low bandwidth robust one that uses a spread spectrum RC style transmitter. For now, I figured I would start by making a first minimum viable product of the high bandwidth diagnostics tool, since it would be more useful initially.
The intended system roughly looks like this:
Initially, I spent a half day making a standalone proof of concept server and client. The server was based on boost::beast / boost::asio and the client was vanilla JS using the gamepad API. All it did was render the state of the joystick into a text string at 10Hz, stick that into an HTML element and send it over the websocket connection. Anything it received over the websocket connection it stuffed into a different HTML element. The server just sent an incrementing number over. Once this was working mostly well enough, I felt confident enough to move on and integrate it into the actual robot control application.
For that, I implemented a more generic “WebServer” class which just serves the static files and accepts websocket connections at configurable endpoints. Then a separate “WebControl” class uses WebServer to report the quadruped status and send commands. For now, I just exposed the raw C++ status and command structures over the websocket interface as JSON, so the control class doesn’t have a whole lot of work to do.
On the client side, I spent zero effort on presentation, and just dumped raw JSON into HTML elements for now. There is minimally enough logic to command the robot through the states that are implemented now based on joystick commands. The result is just about the ugliest web application you can imagine, but it gives me a place to start from both to make it more functional, look nicer, and more importantly lets me once again use the joystick to command variable gaits.
There were a few minor post-modifications I had to make, which were all much faster than printing the pieces again. All the holes for M3 bolts were slightly undersized, so I drilled them out. The battery holder had a channel to let the power wires out, which inexplicably terminated before reaching the edge of the holder. I also had to install all the heat set inserts.
I did attempt something new, which was to post-process the printing by smoothing out a corner by sanding. An experiment it was. I spent about 2 hours on it, of which 45 minutes was on the coarsest paper I had, about 80 grit. I eventually gave up on that coarsest grit and started moving on, so there are still a few blemishes in the final result.
Needless to say, until I get really bored, I probably won’t spend the full day required to do the other 3 corners of the chassis using this method.
There are a few other minor changes I’ll make before installing legs, which will be the next step!
As described in my roadmap, the chassis for the quad A0 was on the verge of failing, or causing the shoulder motors themselves to fail, after only a few hours of walking around. Also, it was nigh impossible to assemble, disassemble, or change anything about it. Thus, the chassis v2!
More than one piece
The old chassis was a single monolithic print that took about 35 hours of print time. Because of its monolithic nature, there were lots of interference problems during assembly. For instance, the shoulder motors could only have 4 of the 6 possible bolts installed, and 2 more of the bolts extended beyond the chassis entirely. I decided to break it up into multiple pieces, which uses a lot more inserts and bolts, but should allow for a feasible order of assembly and manageable repair.
Now there are separate front and back plates, to which the shoulders can be attached in isolation. Then the top plate can attach to that, followed by the side plates, the battery holder, and eventually the bottom plates.
Enclosing the electronics
V1 had the primary computer sitting on top of the chassis. That was a legacy from the first Mech Warfare configuration, where the primary computer sat in the turret. I’ve decided that for Mech Warfare, I’ll just put a second independent computer in the turret, which frees the robot computer to be placed inside the chassis where it is much less likely to get mangled.
The power distribution board is now mounted to the other side opposite the computer, instead of on the now top-plate.
Power switch and strap
I’ve left room for a recessed top mounted power switch on the top plate. This should remove the need to unplug and re-plug the battery any time that power needs to be cycled. That hole is marked in red below.
Also, while I’m at it, I left holes in the top through which a carrying strap can be threaded (marked in blue above). The old chassis had some M3 inserts that I screwed eye bolts in and then threaded some cord through. That didn’t work terribly well and was unsightly.
As mentioned in the roadmap, I was going to try and replace the battery with something with a smaller form factor. I looked through a number of batteries, and got a Milwaukee M18 as the best of the options, but ultimately decided that the Ryobi style was the best compromise for now despite the wasted space. All the lower profile ones required insertion sliding in from the side, which would have required that the chassis be much longer than it was already.
Thus, I still have the 3D printed Ryobi battery holder, only now it attaches to the top plate with just some bolts instead of a complicated dovetail arrangement I had previously.
Since this is being printed in multiple pieces, I wanted a separate piece to increase the longitudinal stiffness. That is now just two plates which bolt to the front and back plate, and to the battery holder.