Skip to main content
Posts tagged:

engineering

Fixing the inlet on my Ryobi Pressure Washer

Some posts I write to inform others of cool stuff. Others posts I write to save someone else time when they google. This post is just a story of frustration, written to look like the second example. You have been warned.

Several years ago, I bought this pressure washer and then let it sit unused for far too long—a bad move. The Ryobi RY80940B, powered by a Honda GCV190 engine, delivers 3,100 PSI at approximately 2.5 GPM, more than enough force for serious cleaning but also enough to punish neglected hardware. For anyone working on one of these, the operating manual is available here: Ryobi RY80940B Service Manual (PDF).

When I finally tried to remove the hose, the metal fitting was stuck. The smart thing would have been to leave the hose stuck in there forever. I didn’t do that. I wanted to get the old hose out and, well, I’m an arrogant engineer and this was a battle of wills not of wits. I’ve spent the better part of an afternoon fighting with a broken brass fitting fused inside the outlet coupler of my Ryobi RY80940B pressure washer. What should have been a simple hose replacement turned into a problem. The brass insert from the old high-pressure hose sheared off cleanly, leaving a ring of corroded metal wedged inside the plastic spindle. I tried everything — prying, tapping, a bolt extractor — but the brass just spun or smeared instead of breaking free.

Eventually, I realized I was wasting time trying to rescue a part that costs less than lunch. The black collar that covers the quick-connect doesn’t unscrew; it slides over a spring and bearing set. Once you see the parts diagram for this model, it’s obvious the spindle (part #642058001) and collar (part #310993003) are meant to be replaced together.

Part 64 is wicked

Per the service manual, I first tried an 8 mm hex key to back out the fitting, but it immediately began to strip, producing nothing but a rain of metal shavings.

Prying out the Brass was a huge pain

After exhausting every polite method of extraction, I escalated. Since I knew the brass and aluminum had fused completely, I cut most of the seized coupler off with an angle grinder, then used diagonal cutters to peel the remaining sleeve away from the spindle. With the bulk removed, I applied heat from a torch, clamped a pair of vice grips onto what was left, and added a four-foot cheater bar for leverage. The grips slipped off more than once, but eventually I felt the faint give of motion—the threads finally broke free. Sometimes the “fix” isn’t surgical precision; it’s controlled brutality, executed carefully enough not to destroy the surrounding parts.

Because this took so much work. I’m going to show you two pictures.

Tech Details

So what happened here? The failure wasn’t merely mechanical — it was electrochemical and thermomechanical. The brass hose insert (nominally Cu–Zn alloy, ≈ \(Cu_{60}Zn_{40}\)) had been pressed into a steel spindle (Fe–C alloy with minor Mn, Si). Over years of intermittent water exposure, this dissimilar-metal couple set up a galvanic cell with the water acting as electrolyte. Brass is more noble than steel in the galvanic series:

$$E^\circ_{\text{Cu}^{2+}/\text{Cu}} = +0.337\text{ V}, \quad E^\circ_{\text{Fe}^{2+}/\text{Fe}} = -0.440\text{ V} $$

The potential difference,

$$\Delta E = E_{\text{cathode}} – E_{\text{anode}} \approx 0.777\text{ V},$$

was sufficient to drive anodic dissolution of iron and the formation of iron oxides/hydroxides.

The local electrochemical reactions were:

Anode (steel):

$$\text{Fe} \rightarrow \text{Fe}^{2+} + 2e^-$$

Cathode (brass surface):

$$\text{O}_2 + 2H_2O + 4e^- \rightarrow 4OH^-$$

The resulting \(Fe(OH)_2\) and \(Fe_2O_3\) corrosion products expanded volumetrically, wedging the interface tighter. The growth strain of oxide formation can be expressed as:

$$\varepsilon_v = \frac{V_{\text{oxide}} – V_{\text{metal}}}{V_{\text{metal}}}$$

For iron oxides, \(\varepsilon_v \approx 1.9\), meaning nearly a doubling in volume. This expansion induced radial compressive stress at the interface:

$$\sigma_r = \frac{E \, \varepsilon_v}{1 – \nu}$$

With \(E_{\text{Fe}} \approx 210\,\text{GPa}\) and \(\nu \approx 0.3\), localized stresses easily exceeded hundreds of MPa, enough to plastically deform the surrounding brass and produce microscopic cold-welding through diffusion and oxide bridging.

At the same time, dezincification occurred in the brass:

$$\text{CuZn} \rightarrow \text{Cu} + \text{Zn}^{2+}$$

leaving a porous copper-rich layer with high surface energy. Under compression and mild heat cycling, solid-state diffusion across the Cu–Fe interface promoted the formation of intermetallic compounds such as \(CuFe_2\) or \(Fe_3Zn_{10}\), effectively brazing the two metals together.

The end state was a compound joint bonded both by corrosion-product expansion and diffusion adhesion — a quasi-metallurgical weld. The torque required to shear it loose later had to exceed the yield strength of both alloys plus the adhesion energy of the oxide layer:

$$\tau_{\text{break}} \ge \frac{\sigma_y A + \gamma_{\text{adh}}}{r}$$

where \(\sigma_y\) is the yield stress, A the contact area, \(\gamma_{\text{adh}}\) the oxide interfacial energy, and r the effective radius. I estimate I needed breakaway torque of in the neighborhood of 80–160 N·m, danger close to the ~200-250 N·m that will break a Grade 8.8 M16 bolt — and this was a thin walled threaded tube. The geometry also doesn’t help. Since brass (CuZn) was threaded into the aluminum/steel pump body at M16 scale, the fine 1.5 mm pitch meant very tight thread flank contact. Over years of water exposure, galvanic corrosion products grew in the tiny 60° V thread roots, effectively cold-welding the joint.

So the “fused” fitting wasn’t rusted in the casual sense — it had become a galvanic, mechanically locked, diffusion-bonded composite system, obeying the same physics that make bimetallic corrosion joints and accidental cold-welds in space so hard to undo.

By One Comment

Shapeoko Troubles

I recently encountered an issue when generating a grid of holes for workbench. I had recently planed down an old workbench from our house in New Jersey. I was planning on 20 mm holes spaced in a grid with 96mm spacing to match the festool MFT table. I’m hoping to use the available array of cool attachments and eventually add the aluminum profile to the side. For example, an MFT table can be used as a bench with a variety of different attachments, such as clamping elements and stops.

Unfortunately, the holes didn’t create a proper grid and the spacing was off. I used a CNC machine to cut the holes, but I noticed that they were off. Just looking at it showed that each row had fairly consistent spacing, but the start of the rows varied in the X direction.

To accomplish a 96 mm grid, the g-code was programmed to start at the bottom of the workpiece and move across in a row. This process was then supposed to be repeated until the entire grid was cut. However, as I mentioned earlier, I encountered some issues with the spacing of the holes and had to troubleshoot the problem.

One theory I became aware of online (thanks gdon_2003, Julien, LiamN, SLCJedi and WillAdams) is that set screws are a part of Shapeoko drive system and a loose set screw can cause this type of behavior. That’s because the set screws transfer motion from the motor shafts to the pulleys, which rotate against the belts. They are intended to be pushed tightly against the flat spot on the motor shaft, causing the pulley to turn with the motor. If the set screw becomes loose, the pulley may turn independently of the motor before snapping into place, which can cause issues with the motion of the machine. This may show up as flat spots on circles or other imperfections in projects. You can see why a loose set screw is bad as captured in the screenshot below from this youtube video by See-N-C.

Screenshot that describes how set screws work

Doing some Math

In order to do some analysis on what happened, I needed to register the image and get the location of the points.

The drawpoint command in MATLAB is a function that allows you to draw a single point on an image or plot. You can specify the coordinates of the point on an image using the mouse to record position. Using drawpoint, I recorded the coordinates of the center point of each circle and put this information in a struct. I then wrote code to turn the struct into two arrays: one for the x coordinates and one for the y coordinates. This allowed me to easily analyze the variance in the x coordinates for each column and the variance in the y coordinates for each row.

I was also able to use the drawpoint command in MATLAB to mark points on the ruler captured in the image. This allowed me to easily record the coordinates of the points and then do the math and convert the distances between the points from pixels to millimeters.

I used the pdist2 function in Matlab to calculate the Euclidean distances between my two sampled points and then converted the distances to the desired units through a conversion factor of 610 mm/523.4087 px.

Since the job started at the upper right and progressed down and across, we could look at the variance throughout the job. The variance in the x direction seemed to increase in the last four columns:

x1.2610.36030.58540.76563.24253.963
Variance of X in each Column (in mm)

The variance in the y direction was much bigger across the rows and also increased as the job progressed. I used this MATLAB to generate this: makemm(var(y(:,:),0,2))

y24.753724.573630.623235.246736.3425
Variance of Y in each row (in mm)

To generate the ideal points based on a 96 mm grid, I wrote a function that takes in two inputs, iX and iY, which represent the starting x and y coordinates, respectively. The function first initializes two matrices, X and Y, to store the calculated x and y coordinates for each point. Then, it defines a conversion factor, cf, which is used to convert the units from millimeters to pixels.

Next, the function uses a nested for loop to iterate through each column and row of the matrices. For each iteration, the function calculates the x and y coordinates of the current point by adding the starting coordinates (iX and iY) to the appropriate offsets, which are determined by the loop variables and the conversion factor. The calculated x and y coordinates are then stored in the corresponding elements of the X and Y matrices.

To calculate the root mean squared (RMS) error, I subtracted the actual coordinates from the ideal coordinates to find the error in both the x and y directions and then took the square root of the mean of the squared errors in both directions.

123456
103.64134.867812.579612.847612.0532
21.29864.71474.923613.636513.884112.3934
31.6041.47845.26213.272213.526513.8716
42.61142.536214.100214.219514.898816.2787
56.15646.040717.367317.355818.812919.6045
RMS errors for each hole

You can see the error increasing as the job progresses, but the major error starts in column 4-6, supported by a big jump in column 3, row 4, which supports the idea that the screw isn’t seating well resulting in slippage.

Overall, doing this math allowed me to see what was really going on. By adjusting for the variance at 4,3:

Pattern in Holes
By 0 Comments