Sunday, July 17, 2022

The CoreXY Belt "Tuning" Myth

I have seen uncountable forum posts, comments, emails, etc., about the need to "tune" belts in a corexy mechanism. The comments usually involve something about phone apps that read the frequency of a plucked belt and how you have to precisely match the tensions of the belts. The concept seems to scare off many would be corexy DIYers, thinking that there is some sort of voodoo required to get corexy machines to work properly. 

It's all nonsense.

There is one primary goal in setting the belt tension. It is to set the tension so that the X and Y axes are square. If they aren't square your prints won't be square- i.e. they will be distorted. What is more important to you, getting perfect middle C from the belts, or getting undistorted prints out of your machine?

It is apparently not obvious why tensioning the belts can affect the squareness of the axes so I have prepared some diagrams, below, that illustrate the concept. They are based on a diagram I have used a lot in the past so they may look familiar. I used UMMD's stacked belt layout, but the same concepts apply to any other belt layout you may use.

Fundamental assumption- you built the machine so that the X and Y axes are square when there are no belts on the mechanism. Don't assume you can use belt tension to correct for sloppy construction! If your axes aren't square without the belts, no if, ands, or buts, it's wrong. Fix it.

There are different ways to tension the belts, but adjustment must always be done on each belt, independently. If you move P3 or P4 in the Y direction, you tension both belts. That's not what we want to do. I illustrate tensioning by moving the motors. You could tension this belt by adjusting the attachments at the extruder carriage, or by having pulleys pressed against the belt between P3 and P4 or between the A motor and P4. 

Note: In the examples I use moving the motors to tension the belts because that's how I do it in my printer. It doesn't matter how you tension each belt- screw adjustments at the extruder carriage, moving motor, etc., the effect of the increased tension on the belt will be the same on the X axis.

When you move the A motor, P1 and P2 will experience forces created by the tension in the belt. There will be X and Y components of the forces at those pulleys, but we can ignore the X components because they don't affect the position of the X axis. The Y components of the force, illustrated by the green arrows are equal and in opposite directions. That is what causes the X axis to tilt out of square with the Y axis.

If everything is made of metal and bolted together tightly, how can the X axis possibly rotate out of square with the Y axis? Let's see... the Y axis bearing blocks to which the X axis rail is attached are not perfectly rigid and will deform slightly. The Y axis rails and whatever they are mounted on will also flex a little (especially if they are end-supported round rails). The X axis itself will also flex a little. All those little imperfections add up and will allow the X axis to tilt relative to the Y axis. Don't believe it? Try this experiment before you put belts on the mechanism:

Hold one end of the X axis against one of the mechanical stops at one end of the Y axis. Now grab the opposite end of the X axis and try to move it along the Y axis. Of course it moves. The X axis acts as a long lever arm against the opposite, fixed end of the axis. A little force applied at the free end turns into a big force at the opposite end of the axis, causing all those little flexures to occur. Notice that it doesn't take a lot of force to move the free end of the X axis. Now imagine what belt tension might do:

2nd belt in place before it is tensioned...

Now tension the 2nd belt by moving the B motor.

Notice the forces created (red) are opposite those created when the first belt was tensioned (green). Also notice that the arrows representing all the forces are longer because tensioning the second belt (red) increases tension on the first belt (green).

The X axis rotates back into square with the Y axis and your printer will now be able to make undistorted prints.

 If your printer's mechanism were built with absolutely perfect mechanical symmetry, the belts would be equal in tension when the axes are square. No one builds printer mechanisms with perfect symmetry, therefore when the axes are square, the belts tensions will not be exactly equal. It doesn't matter. Belt driven linear positioning mechanisms work well over a wide range of belt tensions. 

I've put the above illustrations together into an animated .gif file:

Some manufacturers, such as Gates, have phone apps to set the belt tension based on the type and size of belt, the length of span, etc., so you can use it to set the tension to the manufacturer's specified optimal tension value (assuming you know what that value is, and can convert it to frequency). I wouldn't assume that all belts have the same optimal tension, so if you're using no-name Chinese belts and adjusting them to Gates specs, you may or may not be getting what you are expecting. OTOH, it's nice to have some objective indication of belt tension, even if it isn't optimal. The good news is that belt tension isn't critical al long as you set it high enough that the belts don't flop around but not so high that they cause excessive wear on the bearings in the motors or binding of the mechanism. "Tight, but not too tight" applies.

I hope this clears up some of the silliness that the internet always seems to provide a home for..

Sunday, May 8, 2022

Bank Account Protection Circuit for Servo/Stepper Motors

Update 6/11/22

The parts I ordered from Mouser finally arrived, after 6 months of delays in getting the connectors. Here's one of the boards, fully assembled, using the 1W wirewound resistors and including the connector:

If you decide to build some of these circuits, you can skip the connectors and just solder the power in and out wires to the board.

Now back to the original post...


I wrote most of this post a couple months ago but didn't publish it because I was waiting for the connectors I ordered from Mouser Electronics. When I first ordered them, one piece was out of stock and due to be back in stock in a couple weeks. In a couple weeks I got an email informing me that the back ordered parts wouldn't be in for another month. A month went by and I got notice that the backordered parts were in stock but one of the other pieces was now out of stock. They're telling me that the parts should be in stock at the end of May. 

I decided to try using the servomotors in my corexy 3D printer, Ultra MegaMax Dominator and wanted to have protection for the controller board and all the other stuff that connects to the power supplies that power the XY motors, so I went ahead and wired in the protection circuits without the In/Out connectors.

Next time I order parts, I guess I'll have them ship as they arrive in stock instead of holding shipment until all parts are available.

Why Does My Bank Account Require Protection?

A while back, when I was working on the Arrakis sand table, I discovered that one really needs to take some special precautions when driving servomotors (or steppers) at high speed and acceleration. I had a Duet controller board, a couple buck converters to power LED strips, and servomotor, all connected to a single 200W 24V power supply. I made the mistake of driving the mechanism into the end of an axis at 1500 mm/sec. The sudden stop caused the motor's kinetic energy to be converted to electrical energy which ended up on the power supply line, blowing up the controller board, power supply, and buck converters, about $200 worth of electronics, hence the title of this post.

Motors generate voltage that opposes the voltage trying to make them turn. Under certain conditions, they can generate more voltage than the driving voltage. Those conditions include driving them at excessive speed, manually turning them (such as when sliding around the extruder in a 3D printer by hand), and slamming into physical stops while they are moving at high speed (like I did). In the Arrakis sand table, a simple error in generating the pattern file that's a little bigger than the actual table dimensions (combined with an incorrect axis maximum definition in the config file) can cause such a sudden stop. In servomotors like the iHSV series parts I used in Arrakis, the specified maximum rotational speed, 3,000 rpm, is limited by the self-generated voltage. When generating a pattern file for Arrakis, it's easy to make a mistake that will drive the motor beyond the 3,000 rpm limit.

Protection can take different forms. In Arrakis, which runs RepRap firmware on a Duet WiFi 3D printer controller board, I can program speed, acceleration, and travel limits in the Duet's configuration files. In theory, the fault condition should never occur. However, all that assumes that the controller hasn't lost its mind, that there are no mechanical failures, and that the dumbass (specifically, me) experimenting with the mechanism remembers to set the correct software limits in the controller.

What is really needed is a device that will protect my bank account from my stupidity, an insane controller board, or a mechanical failure in the mechanism. Preferably it will be a circuit that will sense a fault condition and keep it from damaging the electronics that might be sharing a power supply with the motor.

Someone on a web forum pointed out a protection circuit in an app note from Gecko Drives, a company that makes stepper and servo motor drivers. 

The circuit is pretty simple- the 1,000uF cap absorbs small current spikes that may occur under normal operation of the motor. Normally, motor current from the power supply goes through the diode to the integrated motor/driver. In the event of a sudden motor stop due to hitting the limit of an axis, or a bearing seizing up, or some object blocking the motion, the motor will put a reverse current spike on its power line. That will cause the voltage on the capacitor to rise above the power supply voltage, reverse biasing the diode (switching it off) which will turn on the transistor, dumping the current coming from the motor to ground via the 33 Ohm resistor. The power supply and anything else connected to it will never see the voltage/current spike from the motor.

I ran a simple simulation in LTSpice to see how it works. The voltage source on the left is the 24V power supply and the current source on the right stands in for the motor.

It's not much of a model, but it roughly demonstrates what happens in the circuit:

The green trace is the current in the motor. It starts at -3.4A, which represents the loaded motor current supplied by the 24V power supply (V1). When the current reverses direction (the fault condition) the voltage across the motor (blue trace) rises. Current through R3 (33 Ohms) starts at about zero because the transistor is off. When the voltage across the motor rises above 24V, the transistor turns on and current through R3 (red trace) rises. The power supply voltage is the light blue trace- notice it barely moves.

I decided I needed to build some of these circuits as I have 4 more of the motors waiting for projects (in addition to the two that are in Arrakis). I thought about hay wiring them, but it didn't seem like a good idea, so I needed a printed circuit board. I asked around the makerspace and a couple people recommended KiCAD, so I gave it a try.

Parts Selection

When you lay out a PCB, you need to know exactly which parts you're going to use in order to select appropriate footprints. The app note doesn't say too much about the parts so I made some calculations of basic specs then went shopping. I decided to use through-hole mounting for all the parts because they're easy to handle and solder.

The motor current normally flows through the diode so it has to be rated to handle it. The data sheet on the motors seems to indicate that the nominal load current for the motor is 3.4A  (3.4A x 24V=81.6W, and the motor is advertised as a 78W motor, so the current seems about right) and that the driver will alarm (and hopefully shut down?) at 300% of that. 300% of 3.4A is 10.2A, so I chose a 15A 100V Schottkey diode (SMC 15SQ100). In normal operation, with 3.4A going through the diode and voltage drop of 0.5V, the diode will have to dissipate about 1.7W, so it's going to get warm/hot (assuming the motor is loaded and drawing full current).

In the "Arrakis Incident" the motors were brought to an abrupt stop which is what caused the voltage/current spike that blew up the power supply and other electronics. If there had been a protection circuit like the one here, after the stop and current spike, the motor might have started up again (the power supply wouldn't have been dead) and run until it slammed into another hard stop. And it might have kept going, over and over. Hopefully, I'll be there watching it and will shut off power before the repeated slamming around does any damage.

The iHSV motor's integrated drivers appear to monitor the motor speed and/or supply voltage and will shut down the motor/driver if you try to drive it so fast that the self generated voltage exceeds the power supply voltage by some unknown amount. Other motor and driver combos may not do that.

If you try to drive a motor beyond it's spec rpm limit, the voltage at the motor will rise, Q1 will shut off, and the motor will slow down or stop until Q1 turns off again, and then the motor speeds up again repeating the cycle (again, the iHSV motors don't seem to do this). In some mechanisms it might keep doing that until someone notices that something is wrong and shuts down the machine. That means R1, R2, R3, and Q1 will all be working to dissipate energy from the motor on a repeated basis.

I point out the different types of faults because it affects the component selection. When Q1 is off, the normal state, R1 and R2 have very tiny current passing through them. In a fault condition, the current goes up and depends on the magnitude of the voltage/current spike produced by the motor. A 20V rise will cause 20 mA to go through R1 and R2. A 76V rise (which puts us up to 100V, the rating of capacitor C1) will drive 76 mA through them. 20 mA will dissipate 0.4W and 76 mA will dissipate 5.8W. Unfortunately, I can't really predict how the iHSV motors behave. There's no way to know what the voltage/current spike will look like under different fault conditions, and I'm not prepared to risk destroying a motor to find out. I chose to use 1W resistors for R1 and R2 and hope that will be sufficient. I used wire wound resistors because they can tolerate power surges better than other types. The ones I used are good for 10x their rated power (=10W) for 5 sec.

The app note specifies a TIP147 Darlington PNP transistor, so I chose one in a TO-220 package. Does it need a heatsink? This also depends on the magnitude and duration of the fault. I think it will only operate for a few seconds at a time under fault conditions, so I think it is safe to dispense with a heatsink.

This is a relatively high current circuit, so I chose a 4 pin Molex MegaFit connector rated for 23A per pin. I also ordered crimp terminals and shell for the plug that mates with J1.

I put together a BoM with part numbers from Mouser and Digikey here. You can make all sorts of substitutions and find the same or similar parts from other dealers. Prices in the BoM are approximate, of course. 

Designing the PCB

I watched a few youtube tutorials on using KiCAD, and dove in. One thing I found out is that if you're going to have PCBs made by OshPark or other board maker, it's best to set up the board maker's design rules before starting the board layout. 

I went to the OshPark website and looked up their design rules and checked them against the defaults in KiCAD. It turns out there were no issues so I didn't really have to change anything. A more complex board or using surface mount parts might require some of the changes.

Next I drew the schematic diagram:

Once the schematic was entered, I selected footprints for the parts. I checked data sheets for part dimensions and selected appropriate footprints from the KiCAD libraries. Then I just dragged the parts into position, paying attention to the net connections, defined the outline of the board, placed mounting holes, and started putting down traces. I used a filled area on the top of the board for a ground plane and put the rest of the wiring on the bottom of the board.

I had to change the connections to the connector a few times before arriving at the final pinout. Some pinouts led to difficult arrangement of the components on the PCB that required jumpers, etc. I found that by playing with the connector pinout I could create a very simple layout for the board.

The diode will carry the full motor current under normal operation, so the metal traces on the board need to be pretty wide to ensure low resistance and heating. There are a bunch of on-line PCB trace width calculators that will give a pretty good idea of the required trace width for any given current, trace length, and temperature rise. I used this one. I put the diode very close to the connector pins to minimize the high current trace lengths and used 10mm wide, filled areas for those connections for the same reason. They should be able to handle the fully loaded motor current and even the peak current without burning up, even with 1 oz copper.

The capacitor and transistor CE loop are the only other places that are likely to see much current so I used wider traces for those to minimize resistance/heating.

The final steps before ordering the board are to run a design rule check, fix any problems that it reveals, and then export Gerber and drill files.

This is the final layout which I have named REDump for "returned energy dump":

The board layout just before design rule check. The outline of the connector extended beyond the edge of the board so I had to edit it back to pass DRC.

The board is relatively large, 60 x 65 mm, due to the large sizes of the capacitor, 33 Ohm resistor and the connector. I used 4 mm mounting holes set at 50 and 55 mm spacing. I kept the edges of the board clear so that it could be mounted in slots in the walls of a case instead of using the screw holes.

I deliberately hung the connector beyond the edge of the board so that if I print a case for it the connector can protrude through the wall and mechanically support the connector. This overhang was flagged during the design rule check so I edited the footprint silkscreen layers so they wouldn't be drawn beyond the edge of the board.

I ordered a prototype run of 3 of the boards for about $30 from OshPark.

You can download the gerber and drill files in a zipped archive here if you just want to order boards, or the entire set of KiCAD project files is here if you want to do some editing for other parts/footprints.

And here it is:

I probably should have used bigger holes, pads, and pad spacing for the diode and the 1K resistors. When I order more boards I will make the changes to the files.


There are no tricks- just put the leads through the holes and solder them down. Pay attention to polarity of the diode and capacitor, and make sure you put the transistor in the right way- the heatsink tab should be toward the connector. 

Note- the 1W resistors and connector are all still back-ordered after about 4 months, so I built it using 1/2 watt resistors and no connectors.


I did some static tests to verify operation- first just applying supply voltage to the input and making sure it appeared at the output with a resistor substituting for the motor. Then I applied a voltage to the output to make sure sure the diode turned off and the transistor turned on. 

Finally, as I was preparing to install the servomotors in UMMD, I made a test video that indicates the protection circuit will indeed protect the power supply and other circuits from a voltage spike generated by the servomotor.


When you connect potentially high current wires it's best to avoid ground loops. That means each ground wire should go all the way back to the power supply. That's how I wired this into UMMD. The REDump board ground has a wire back to the power supply ground, and the ground from the motor goes back to the supply ground, not to the REDump board ground.

That means a 3 wire cable is required at the REDump connector. The crimp terminals listed in the BoM are for the plug that fits the jack on the PCB, and are for 14 or 16 gauge wire. If you're going to use some other gauge you'll need to order a different part number for the crimp terminals.

It's also a good idea to twist high current wire pairs, so when I installed the REDump boards in UMMD, I twisted the ground and supply leads from the REDump board back to the power supply, and twisted the motor ground lead around the supply wire from the REDump board together, then continued twisting the ground lead from the motor around the ground and supply leads from the REDump board back to the power supply.

In the future I'll be installing these boards in Arrakis so I can start experimenting with really high speed drawing without having to worry about what might happen if there's a mechanical failure.

Tuesday, March 8, 2022

New 3D Printed Sci-Fi Lamp Design

For some reason, I find myself designing and printing a lot of lamps. Here's the latest, designed in Fusion360 to fit a Feit Electric G63 vintage LED filament bulb that is 8" in diameter.

I like combining the antique look of the bulb with a "modern" base- it looks like something out of an old Buck Rogers movie (the movies from the 30s and 40s, not the awful TV series from the 80s).

The lamp base prints in vase mode. I printed it using PETG, a 1 mm nozzle, 1.2 mm line width, 0.5mm layer height, in about 4 hours at 30 mm/sec. Prusa Slicer vase mode has been broken for years and leaves a seam down the side of the print, so I sliced with Cura. No seam at all!

The overall height is 400 mm, the print is 300 mm tall. The bulb barely rises above ambient temperature, even after hours of operation, so there's no danger of melting or softening the PETG print.

A look down inside the print. You can see the tiny facets that make up the "curved" surface of the print. Maybe I need to export the STL file with even smaller segments.

Power off.

Power on- the bulb socket is quite visible at this angle. View it from a little higher or lower and the socket all but disappears due to the way the print layers scatter light.

Bottle for scale...

I'll probably print a cone using opaque white filament to cover the socket for this lamp. I'm also going to try printing the whole thing in opaque filament to see what that looks like. I'll post pictures when I do.

The Fusion360 Step file is here. You'll need a 280x280x300 mm (or larger) print capacity machine to print it, and I recommend a 1mm nozzle. You'll find the lamp is saved as a solid object. In the slicer you will use vase mode which will have no infill, a single wall, and no top layers. I printed in PETG, used 3 or 4 bottom layers, and set the line width to 1.2 mm. The resulting print is quite sturdy and very tough. I drilled a hole between the fins near the bottom of the lamp to feed in the line cord because I thought it would look better than running the cord out through a hole in the edge of one of the fins.

Thursday, February 17, 2022

Ultimate 3D Printed Wire Twister

Update 3/20/22

You can now find this design at the Wago Creators web site:

"Let's Do The Twist"

When you're wiring things like 3D printers, sand tables, model train layouts, and almost anything else, you often need to use wires to connect things that are separated anywhere from a few cm to a few meters. If you want to do it neatly, you want the wires twisted together, especially if they carry motor or bed heater currents. Twisting wires carrying high currents helps prevent them from inducing currents in adjacent wires.

A few years ago I designed a wire twister and posted it on It was a simple, two-part 3D printed tool. The spinning part had screw clamps to hold two wires and a hex shaft to fit in an electric drill/screwdriver. The fixed part was intended to be held in a bench vise. The wire clamps in both parts used screws to hold the wire tightly, so you had to use a screw driver to secure each end of each wire, creating four opportunities to stab yourself with a screwdriver in the process. Operation was simple- just pull the wires tight and pull the trigger on the drill. Bob's yer uncle, instant twisted wire pair!

A few days ago, I got an email notice that my old wire twister design was added to someone's collection at That same day I had demonstrated Wago lever nuts to my boss who is getting into model train layouts. And then, just like this old commercial...

...something clicked and I realized I could redesign the wire twister to use Wago lever nuts so all you'd have to do is lift the levers, shove the wires into the holes, snap the levers down and spin. No more screwdriver, no more risk of stab wounds! Wagos and 3D printing are the greatest combo since peanut butter and chocolate! The Wago 221-412 lever nuts are good for 24-12 gauge wire, solid or stranded, so they're good for almost any wires you'll ever need to twist.

The New Spinning Clamp Design

I previously designed some printable screw-down mounts for the Wago lever nuts and they worked very well. The lever nuts snap into the mounts so securely you have to use a screw driver to pry them back out. This is the basic unit I started with for the screw-down mounts, and for the new wire twister design:

I grabbed the design for the Wago holder above and reworked it to include a hex shaft to go into a drill:

The model for the Wago lever nut came from and is supposed to be accessible from inside Fusion360 (Insert>Insert a manufacturer part). It refused my login name/password when I tried to insert the part that way, so I just logged into the site in a web browser, downloaded the .stp file, then "uploaded" it to Fusion360. The model isn't very detailed, and doesn't include the concavity on the sides of the part that allow it to be held in place by the bumps inside my holder design. This is why it is sometimes better to make your own models or at least to measure the parts you want to use in CAD.

The New Fixed Clamp Design

My initial design was for a fixed clamp that you'd use with a C-clamp to hold it on the edge of a table or shelf, or in a bench vise. Then I decided it would be better if the fixed wire clamp actually was a C-clamp so you wouldn't need another tool. Here's what it looks like:

The fixed wire clamp is a clamp! Printed in 3 parts, the thumbwheel, the end cap, and the clamp body.

You can still use a vise to hold the C-clamp, if you prefer, or skip printing the fixed clamp and just hold a Wago in a bench vise.

The hardware consists of a 5/16"-18 bolt, 3-4" long, two nuts, and a washer. Those of you who live in the civilized world (you know, metric) may have to edit/scale the design file a little to use 8mm hardware. Assembly is obvious.


I used PETG filament for this one because it's pretty tough stuff and can take a lot of abuse. I arranged the parts on the print bed like this:

I have a 1mm nozzle on UMMD and the print came out OK, but I recommend you use a smaller nozzle and print in 0.2 mm layers. The extra cylinder is there to help the hex shaft of the spinning clamp print nicely. You could just print 2 or 3 of the spinning clamps (your friends are going to want one of these tools when they see it) instead.

I printed a bright color so I'd be able to find the thing in the bottom of a bag or toolbox.

The Result

The clamps were printed in 0.2 mm layers. I used contact cement to glue a piece of rubber to the fixed clamp to keep it from slipping when you pull the wires tight. I also used a drop of hot melt glue under each Wago to ensure they'd stay put. Shown here in "storage" mode- a piece of wire will keep the two parts together in your tool box so they don't get lost/separated. 

The Wago lever nuts snap into the tool, but dimensions are critical for retention and depend on your printer settings, so you may find that they will pop out of one or both clamps when you twist thick wires. The solution is as easy as a single drop of glue on the bottom of each Wago when you assemble the clamps. If you use ABS to print, superglue will work. You might want to use other glue depending on the plastic you use to print the clamps. Hot melt glue seems to work well on the Wagos.

It's a good idea to glue a little piece of rubber to the fixed clamp so it's less likely to slip when you clamp it to a smooth table top and start pulling on the wires.

The CAD File

You can download the .stp file here and open it in almost any CAD program you like.

Video, or it didn't happen!

How to Use It

In case it isn't obvious from the video above, just cut two wires to equal lengths, strip the ends, and insert them into the Wagos, and snap the levers down. Put the spinning clamp in the chuck of your drill/screwdriver, clamp the fixed clamp to a table or or shelf or put it in a vise, pull the wires tight, and pull the trigger. Keep tension on the wires as they twist, and when you feel you have enough twists in the wires, let go of the trigger. Give them one last tug to "set" the twist and then release the wires from the Wagos.

Monday, December 20, 2021

Plex Sucks! or Building a Better Media Server

I've been using Plex Media Server to stream video from a computer on my home network to my TV for years. It started out OK, but sometime in the last few years they decided to become a media streaming empire, requiring annual fees and connection to their servers even if I just want to stream stuff from my local HDD. The real kicker is the frequent re logins required. I use TFA with a Yubi key to access my passwords stored in Lastpass. That makes re logging in to Plex a major PITA, especially if I'm sitting in front of the TV with only my phone. To make matters worse, the web address that appears on the TV for logging into Plex doesn't actually work. I don't want any of Plex's streaming services. Why should I have to keep re logging into Plex and paying them an annual fee to access media on a computer on my own network? 

I was frustrated, and tried using VLC on my main computer to cast video to the Chromecast With GoogleTV dongle on my TV, but it was very unreliable. 

I decided to look for an alternative to Plex and casting via VLC. Searching the term "plex sucks" brings up many hits. It seems I'm not the only one who dislikes Plex. After a bit of digging, I found a pretty good replacement that will stream video from a local HDD to the Roku and Chromecast dongles I have on my TVs. It's called Jellyfin

With a media server there are a few things to consider: 

Can it stream high bit rate video/audio reliably to the targeted receivers? Does the audio (i.e. surround sound) work when streaming video? How do you get media files into the server?

I'll consider each below.

1) Streaming high bit rate video

I did some searching for Jellyfin hardware requirements and couldn't find much specific info, but did find several comments in forums from users who were using relatively low performance computers (even RPi!) to stream 4k video successfully. 

The old Plex server was an ancient desktop PC that used a lot of power, took up a lot of space, and had a bunch of noisy fans. For the new server I decided to try a Dell Optiplex 3020 Micro that I picked up at work when they swapped out all the desktop computers. It has a core i5 processor and 4 GB of RAM.

The server with cover off. The HDD is supposed to fit into a plastic carrier that snaps into place, but this 15mm thick drive won't fit into the carrier.

The server closed up. It's about 7" square and 1.5" high (180x180x38mm)- very small!

Before springing for a big HDD, I wanted to test the whole system to see how hard it would be to set up and if it would reliably stream video to my TV, so I installed an old 250 GB HDD. The Jellyfin web site listed compatible operating systems, and I chose Ubuntu Server 20.04.3 LTS to minimize OS overhead (no GUI, no office apps, etc.). 

I downloaded Ubuntu server using a torrent, then made made a bootable USB thumb drive with the disk image using Rufus. I'm not linux master, so I followed instructions for installation on the ubuntu web site, then updated all the OS software, and finally followed step by step instructions at this site to install Jellyfin.

As soon as I got Jellyfin working I put a few media files on the OS HDD and set up the libraries in Jellyfin and tested it. Yes, it worked. In fact, the defaults for everything except audio worked without any messing around. The UI on a web browser and on the TV was great! Jellyfin pulls metadata on the media files from the web and displays everything as well as Plex ever did.

2) Does audio work when streaming video?

I ran into one problem when sending files to a Chromecast dongle on one TV. Chromecast couldn't understand the DTS surround audio streaming from Jellyfin. Chromecast is OK with Dolby Digital (AKA AC3), and Dolby ATMOS. I had to set Jellyfin to mix the DTS surround audio down to stereo for Chromecast to play any sound from files that had DTS audio. Files that used variants of Dolby encoding worked fine as direct stream. It would be nice if there was an option to have Jellyfin do that mix down automatically. The audio mixdown is selected from the Jellyfin home screen settings menu, so it's easily accessed when needed.

3) Getting files to the server

The server is located in the basement at my house and operates headless, so I need to transfer files to it from another computer via the network. The other computer is a Windows machine so I installed filezilla and used sftp to transfer files from my desktop machine to the server. It works perfectly, and very fast.

I use Secure Shell in a web browser to log into the server remotely to do things like update software, etc.

Additional notes:

The Dell computer I chose to use is very nicely made. It's really small, and everything snaps in securely without tools, and there aren't any cables to mess with. Very nice! Except.... the HDD fits into a plastic carrier that snaps into the enclosure. The carrier can only accommodate 2.5" drives up to 9 mm thick, like those used in laptops. The 4TB drive I ordered is 15mm thick. It fit the connector just fine, and didn't prevent the case from closing, but wouldn't fit the bracket, so I cut a piece of foam rubber and put it under the drive to support the free end, then closed the case. I probably wouldn't want to pick up the case and shake it, but short of doing that, the drive isn't going to move.

The computer has a couple USB3 ports, so if I need to go beyond 4TB of storage, I'll add it externally.

I ran into one problem after I installed the 4TB drive and Ubuntu and Jellyfin. When you install Ubuntu server it uses as much HDD space as it needs and leaves the rest of the drive unprovisioned. I discovered this when I tried to transfer a bunch of media files to the drive and transfers kept failing. It was running out of space! Once I realized what was happening, I reinstalled Ubuntu server and this time, when it was provisioning the storage, I made sure to include the empty space on the drive. Yes, I know, there are several ways to do it without reinstalling the OS, but that was easier and faster than trying to figure out how to do it using Grub or other disk manager.

I am sure there are ways to do it, but I did not attempt to set up remote access/streaming from my server across the web. 

Thursday, November 11, 2021

A Stand for the LG SN11RG Sound Bar

 My TV is mounted on the wall using a corner bracket thing. That means it's not sitting on a piece of furniture on which I could put the sound bar. After about a month of having the sound bar sit on the box it came in, I decided I had to do something better.

The SN11RG sound bar on the finished stand.

Someone at the makerspace was kind enough to leave a box of 1" iron pipe and fittings in the up-for-grabs pile, so I grabbed it, initially thinking I'd use it to make shelf brackets. I considered the possibility of creating a shelf in the corner under the TV, but decided it would be better if the thing was a stand-alone thing that I could move easily in case I decided to move the TV out of the corner.

I measured the sound bar and realized that a piece of 1"x6" wood (actually 3/4" x 5 1/2") would be perfect for it, so I bought a piece of maple at Home Depot, cut it to length (1415 mm), drilled some holes for the flanges, sanded,  stained, and finished it. Then I assembled the pipe and fittings and bolted it all together.

1/4-20 flathead screws, washers, and nuts were used to mount the board on the legs.

One of two identical legs, including printed TPU feet to protect the floor.

I decided that it would be a good idea to have some sort of feet to protect the floor, so I designed and printed some using black TPU.  I didn't want the feet to be visible, so I made them smaller than the bolt circle of the flanges. They are 2 mm thick, and I added crush ribs to hold them in the pipe.

CAD rendering of one of the feet. The crush ribs have a 28 mm outer diameter to fit into a 1" pipe. 

The printed black TPU feet (yes, I know, they aren't perfect, but they're good enough). The crush ribs hold the feet inside the pipe but allow easy removal.

The stand is rock solid so I don't have to worry about Ms. Kitty knocking it over if she jumps up on it. 

Thursday, October 28, 2021

Arrakis: "This is part of the weirding way that we will teach you."

The Spice Must Flow (referred to hereafter as TSMF) sand table was a fun and interesting project that went through many changes to the mechanism, electronics, and software. I made several posts about the changes made.

TSMF had three main problems - it was too big to use at home, a little too noisy, and didn't look like furniture that would be acceptable in my living room. I decided to build a new, smaller table, with a more presentable finish, that I could use as a coffee table. It would have to be the right size, the right height, and as quiet as a mouse. I think I succeeded, though you may not care too much for the finish...

The result is "Arrakis", named for the sand covered planet in the Dune novels by Frank Herbert.

Arrakis, in all her glory! I gave her a haircut after this photo was taken, trimming off the fur peeking out from under the glass top inside the box.

Here's what I did that is different from TSMF.

The Mechanism

The Arrakis mechanism is smaller, and closer to the floor to make it more usable as a coffee table. 

TSMF's mechanism had a couple problems. The 45 mm square t-slot frame was a little flexible. I found that the belt tension was sufficient to cause the Y axis frame rails to bow outward. When X direction motion reversed, especially near the center of the table, the entire X axis would shift in the Y rails and make a clunking noise. I made a partial fix by bracing the frame with crossbar made of wood that helped prevent the rails from bowing, but it was still a problem.

I wanted a definitive fix for that problem in Arrakis so I spring loaded one of the Y axis bearings so that the X axis couldn't move back and forth between the Y axis rails, even if they bowed outward. I had also had a failure of one of the Y axis blocks due to poor design (the X axis tube was tight fit to the blocks and tended to split the printed layers apart). The new block design was made in two pieces, with screws that clamped it together over the X axis guide tube.

Here's the bearing/pulley block that has the sprung bearing. The light orange part is a PTFE bearing that fits in the t-slot of the XY mechanism's frame. The block at the other end of the X axis is identical, except the PTFE bearing is screwed to the block instead of sliding on pins.

The right side Y axis bearing/pulley block that has the sprung bearing as seen in the video, above. The three screws hold the two printed pieces together, clamping the X axis guide tube (black). One screw passes through holes drilled in the X axis guide tube. The pulleys are made from stacked F625 bearings and held in place with 5mm steel pins (you can see one pin sticking up a bit at the top).

This is the left side Y axis pulley/bearing block. In this one, the PTFE bearing that fits into the t-slot is screwed to the block. There's a flag for the Y axis opto endstop glued to the top of the block.

Another view of the right side Y axis bearing/pulley block.

TSMF's magnet carriage was also a problem. The magnet fit into a square hole with a light spring that kept the magnet pressed against the bottom of the sandbox. Dragging the magnet against the wood was noisy (and created dust under the table). It got even noisier when the motion changed direction. The magnet would rattle in its hole in the carriage and against the bottom surface of the sandbox.

In Arrakis, I wanted the quietest possible operation, so I redesigned the magnet carriage. Now the magnet is glued to the carriage so it can't rattle, and it is separated from the bottom of the sandbox by an air gap. 

The magnet carriage. The screws that hold it together also help anchor the belts. The belts are folded over the screws and clamped against themselves with teeth interlocked in narrow slots. You can just see the PTFE bearings contacting the X axis guide tube. There are four such bearings and their contact pressure on the guide tube is adjusted using shims made from soda cans.

The magnet is glued to the top of the carriage using silicone glue. The "blade" is the flag for the X axis optical endstop. In order to home the X axis, the Y axis must be homed first. 

This video shows how the pieces of the magnet carriage go together. There are four screws that hold the printed pieces together at the corners and serve as part of the belt clamping system. The blue parts are PTFE blocks that act as bearings to allow the part to slide on the X axis guide tube. I used shims made from soda cans to adjust the pressure that the bearings apply to the X axis guide tube.

Here is a video of the mechanism running at 200 mm/sec with plenty of close-ups of all the parts:

The Electronics

When I switched from steppers to servomotors in TSMF, I used two power supplies- one 150W supply powered one motor and a 200W supply powered the other motor, the controller board, and the LEDs (the LEDs had two buck converters to step the 24V down to 12V).

The schematic is the same as TSMF, except that I added a separate power supply (not shown) for the Duet controller board:

As I was working on the Arrakis mechanism I learned something about servomotors the hard way. I had finished putting the mechanism together and wanted to test the motion so I loaded a TSMF pattern file and started it up. I didn't consider what might happen running a large pattern on a smaller table. The magnet took off and quickly slammed into the end of one of the axes, coming to a loud and abrupt halt. The machine stopped dead and wouldn't respond to commands.

I did some research and found that that is a well known/understood problem among people who use servomotors. The problem is the kinetic energy of the system gets turned into electrical energy when the mechanism is blocked. That causes a voltage spike on the power supply line which, in this case, killed a power supply and the Duet WiFi controller board. Shortly after this, the small buck converters that were powering the LEDs from the same power supply also failed. I was lucky that the voltage spike didn't also kill the integrated driver in the motor.

I replaced the power supply, Duet WiFi board, and the buck converters (this time using higher power units), and added a separate power supply for the Duet board.

I found a protection circuit that will prevent power line spikes coming from the motor from doing that sort of damage, and have all the parts in hand, but need to come up with a circuit board for it. Watch for a blog post on the circuit board. In the meantime, I have provided the controller board with its own power supply to keep it separate from the motor.

Protective circuit for servomotors. If the voltage at the motor gets higher than the voltage from the power supply, the transistor turns on and shunts the voltage to the 33 Ohm resistor. When the motor voltage drops back to the supply voltage the transistor shuts off and everything operates normally.

In TSMF the electronics were mounted in a box that was attached to one of the table's legs. In Arrakis I mounted all the electronics on an aluminum plate screwed to the mechanism's frame. I used a Duet WiFi controller board so I wouldn't have to have a control panel on the table. Power on/off is controlled with a foot switch on the line cord. I used a white line cord because the table is best viewed in the dark and I didn't want to be tripping on the cord in a dimly lit room.

Electronics mounted on aluminum panel that's bolted to the t-slot frame. Left to right, 150W 24V power supply, Duet expansion board, Duet WiFi controller board, 200W 24V power supply. The other side of the plate has a small 24V supply for the controller board and two buck converters to power the LED strips in the sand box.

CAD rendering for positioning electronics.

Expansion board (left) that provides step/dir/enable to servomotors, Duet WiFi controller board, and 200W 24V power supply. 

The Sandbox

TSMF's sand box was made with 1 x 8" pine sides and a 1/2" plywood bottom. Pine isn't very good for much besides coffins, and is too soft- it will show every little bump. I wanted a different look for Arrakis so I ordered some red and blue fur that matches the LED lighting inside the table. I also wanted to use a thinner bottom panel so I could put an air gap between the magnet and the box to reduce noise.

I found that running TSMF at high speed would throw the sand with some of it sticking to the cover because the cover was too close to the sand. I had to open it up to clean the cover frequently. I designed Arrakis with the mechanism close to the floor and the glass cover about 230 mm above it, at coffee table height, to minimize cover cleaning.

As you may have seen in some of my photos and videos, I have a cat. She has one bad habit- she likes to chew on wires. I designed Arrakis so the sandbox would come down very close to the floor to keep Ms. Kitty away from wires and belts. If you build something like this you might also want to design it to keep pets or little kids away from wires, belts, pulleys, and motors.

The sides of the sandbox are made of 1/2" Baltic birch plywood. The corners are held together using aluminum corners of the type used to make musical instrument cases, and rivets. That's one decision I regret for reasons I'll explain below. 

The bottom of the box is made of 1/4" Baltic birch plywood. That allowed me to put the air gap between the magnet and the bottom of the box which reduced noise. During construction and testing the mechanism with the unfinished sandbox in place I noticed that the steel ball rolling on the plywood bottom of the sandbox made quite a bit of noise. I wanted to try to reduce ALL noise, so I did some experiments and found that a rubber coated steel mouse ball was very quiet (unfortunately, large diameter). Then I tried a steel ball rolling on a rubber sheet- also very quiet. 

I ended up gluing a sheet of black EPDM rubber roofing membrane to the bottom of the sandbox. That created another problem- it caused the plywood to warp. Eventually I got that under control and it went into the sandbox without any problems. The corners of the sandbox and the bottom edges are sealed with black silicone and the inside of the box is painted with matte black paint. 

Gluing the rubber sheet to the plywood caused the wood to warp! The PVC pipe was used to roll out bubbles trapped under the rubber. I later added staples to the edges of the rubber sheet, in case the glue ever lets go. I was able to get the warp out by putting a couple pieces of wood under the ends of the board and standing on it a few times.  It also seems to have settled a bit with time.

The outside of the sandbox was finished by gluing on pieces of high density 1/2" upholstery foam covered with blue and red striped fur cloth to match the LEDs that light up the table. The cloth was folded over/under the side walls and stapled to the plywood. The seams were hidden by cutting the cloth on the red/blue lines and carefully matching them up before stapling. As each piece was mounted, I glued the edges of the cloth to the foam, then carefully matched up the red-blue lines on the cloth so there would be no break in the pattern all the way around the table.

One corner of the sandbox showing the aluminum extrusion, rivets, printed spacers.

The sandbox was assembled on the granite counter top so the edges would all be in the same plane. The narrow strips are the supports for the plywood bottom of the box.

Installing the fur cloth. I painted the inside of the box black (well, more like charcoal grey), then cemented high density upholstery foam on the sides using a spray foam adhesive, then cut four pieces of the fur cloth (note the fuzz on the floor and in the sandbox), then stapled the cloth to the wood. You can see some printed neoprene spacers (red) that lift the box just enough to create the air gap between the magnet and the bottom of the box. The neoprene spacers were later replaced with printed TPU parts.

The box with the bottom in place and the cloth stapled down. LED strips are not yet mounted. I cut each piece of cloth along the red/blue lines and glued the edges to the foam so that there would be no visible seams where the different pieces of cloth meet. The fur hides the seams perfectly and I have a difficult time finding them even though I know they are there.

The top of the table is a piece of tempered glass that I bought for $6 via Craigslist. I made a frame for it out of oak by cutting the boards to length, milling in 1/2 lap joints at the corners, gluing them together, rounding the corners, sanding, staining, and finally finishing with oil based polyurethane. There is a black painted pine subframe that supports the glass. Eventually, I'll seal the glass to the top with silicone so that if some dope (probably me) spills a drink on the table it won't end up in the sandbox.

Staining the frame. The wood is 1"x4" oak cut to length and sanded smooth, with half-lap joints at the corners. The corners were rounded with a couple cuts with a pull saw and then sanded. After staining, I applied a few coats of oil based polyurethane, then added a sub frame to support the glass top. 

The LEDs are the same strips used in TSMF, cut shorter. The printed plastic clips to hold the LED strips in contact with the aluminum L channel heatsink did not inspire confidence, so I drilled a bunch of holes at every third LED and used zip ties to hold the LED strips down. They are covered with some black painted polystyrene trim boards that hide the aluminum heatsinks and prevent direct view of the LEDs.

I discovered that the black paint didn't stick to the aluminum corners of the box very well and quickly chipped the paint when installing the LED strips. I touched up the paint afterward, but I expect it will probably start peeling soon. I may need to put some sort of primer on aluminum when it's time to fix the paint again.

CAD File

You can access a STEP file of the Arrakis table here. I can't promise that everything is perfect in the file, so study it well before you try to duplicate anything based on it.

Mistakes made during this project:

  1. cutting fur cloth with scissors- next time (?) cut from the back with a razor knife instead, and keep the vacuum cleaner close by.
  2. aluminum corners for the sandbox, and the rivets used to hold them- paint doesn't stick well and the rivets take a lot of space. I think it would have been better to use 2x2 wood pieces and screws.
  3. black EPDM rubber on the bottom of the sandbox- should have used white, and maybe faux leather instead of EPDM. Contact cement would have probably been better and caused less warping of the 1/4" plywood, too.
  4. LED wiring- I need to put more effort into creating contacts on the sandbox and frame mechanism to connect LED strips just by dropping the sandbox into position on the frame. Maybe adapt some battery contacts...