Low Cost "Dial" Indicator Compliant Mechanism
by Pingu80 in Circuits > Arduino
144 Views, 2 Favorites, 0 Comments
Low Cost "Dial" Indicator Compliant Mechanism
Dial indicators are high precision instruments used for comparative measurements. They are metrology instruments often used in machine shops to get really accurate measurements and tolerances of parts in the order of a few micrometers (or of the order of 0.0001 inches). However, to get such accurate measurements there is a need for very expensive equipment. For example, Mitutoyo sells their 0.001mm resolution dial indicators for around 150 Swiss Francs (almost 200USD), which is on the cheaper side.
But what if there was a way to get the same resolution and precision for much cheaper? In this article we will see how this might be doable using a strain gauge Wheatstone bridge for around 20 CHF (25USD) total!
Supplies
- A microcontroller of your choice (here I will use an arduino Micro which I had on hand)
- 1 or 4 strain gauges depending on if you want a full or quarter Wheatstone bridge (though plan to get more since you will break many)
- 3 Potentiometers if you choose to make a partial Wheatstone bridge
- Polycarbonate 3D printing filament
- M3 heat-set inserts, bolts, nuts
- HX711 weight measurement module
- Breadboard
- Jumper wires
Understanding a Load Cell
At the core of this build is a load cell, which is a sensor designed to measure force. Most load cells work by slightly deforming a flexible blade under load. While this deformation is extremely small it can still be measured very precisely using strain gauges attached to the load cell’s structure.
A piezoresistive strain gauge is a sensor whose electrical resistance changes when it is stretched or compressed. It is typically made from a thin conductive material arranged in a zigzag pattern. This geometry allows even tiny mechanical deformations to produce measurable changes in length and therefore resistance.
When a force is applied to the load cell, it flexes slightly. The strain gauges bonded to its surface experience the same deformation:
- If the material stretches, the strain gauge becomes longer and thinner, increasing its resistance.
- If it compresses, it becomes shorter and wider, decreasing its resistance.
You may know from electronics class that it's possible to very accurately measure the electrical resistance of a resistor using a Wheatstone bridge. The way this type of circuit works is that, when it is excited by a voltage on its voltage input a differential voltage can be read between the two outputs. If we very accurately know the resistance of all the resistors but one then we can measure a voltage which tells us our resistance and therefore the strain measured by the strain gauge! However, the change in resistance of a strain gauge is often extremely small but there are a few ways to increase the sensitivity read by our load cell. The first big idea is to use an amplifier which simply takes our signal and amplifies it to a readable range by our Arduino. While this is great, it means we need to amplify our signal by a lot. Another issue is that we amplify a bunch of noise from our strain gauge, mainly thermal noise.
This can be mitigated by populating our entire Wheatstone bridge using 4 strain gauges. The key idea is to place gauges so that two experience tensile strain (+ΔR) while the other two experience compressive strain (−ΔR) under the same applied load.
Let each gauge have nominal resistance R and fractional change ±ΔR. For a bridge excited with voltage V_exc, the differential output voltage is, to first order:
V_out ≈ (V_exc / 4) ·( (ΔR_1/R) − (ΔR_2/R) + (ΔR_3/R) − (ΔR_4/R))
Therefore this will natively amplify our signal by a factor of 4 while completely eliminating thermal noise since all strain gauges work to counteract each other's thermal noise. Furthermore, nonlinearity is minimised in this case.
In this project, the load cell effectively converts mechanical displacement (from the dial indicator tip) into strain, and then into a small electrical signal. By calibrating this signal, it becomes possible to map voltage changes directly to displacement, allowing the system to function like a precise digital dial indicator.
In summary:
- Mechanical movement → causes deformation in the load cell
- Deformation → changes strain gauge resistance
- Resistance change → converted to voltage via Wheatstone bridge
- Voltage → interpreted as displacement after calibration
Since I am just making a prototype I will simply settle for using a single strain gauge and replace all the strain gauges by potentiometers that I will calibrate myself in my circuit but I will be aware that my measurements may suffer from thermal drift. You can feel free to follow this or simply use a fully populated Wheatstone bridge (which is more tedious but is still recommended)
Load Cell Design
The goal of the dial indicator is to get a roughly linear movement to correctly guide the indicator tip. The way this is done is by putting two thin flexible blades in parallel. Thin blades by themselves have three natural degrees of freedom : they can pivot by their base, they can twist and they can flex (pseudo) linearly. I invite you to try all of these degrees of freedom by making your own blade using a paper rectangle, you will see that it is much easier to bend in these three axes.
By placing another blade in parallel to the first we can see that we are now unable to twist the two blades at the same time since their natural axes of rotation do not coincide. Furthermore they cannot pivot along their base for the same reason. However, they can translate up and down as they flex in a very linear motion. This motion is not 100% linear since the blades get shorter as they bend. It is possible to get perfectly linear compliant mechanisms basing yourself on this parallel blade flexure as seen here. This is a nice bonus but not necessary to make a dial indicator for simple differential measurements, a slight parasitic motion is acceptable.
The most important part is to determine the wanted displacement out of your load cell to compute the length of the blades as well as their thickness. You can use the following formula to get the admissible displacement of your load cell according to blade geometry and material choice:
f_adm = (σ_adm*l^2)/(3*E*h)
- f_adm [mm] is the allowable displacement
- σ_adm [MPa] is the allowable tensile stress of your material
- E [MPa] is the Youg's modulus of your material
- l [mm] is the blade length
- h [mm] is the blade thickness
The great thing about compliant mechanisms is that they naturally have a preload so they go back to their zero-position naturally which is perfect for a dial indicator. However, compliant mechanisms are very hard to manufacture since they need to be made out of low-creep materials such as metals. That's why they are usually cut using wire EDM or other advanced manufacturing techniques. It is possible to 3D print them but you must use low-creep materials with high dimensional stability such as polycarbonate or fibre-filled polymers. PLA is probably the worst material choice here since it creeps so much. Using an additive such as carbon fibre helps to lower creep thanks to its added dimensional stability but keep in mind these can be dangerous if mishandled. Here I will use non-filled Polycarbonate filament since my local makerspace had it in stock.
I used a 1.2mm thick, 75mm long blade geometry which meant my maximum displacement was 38mm on either side though I decided to limit myself to just 15mm displacement since a certain safety factor is needed. Flexure print best using at least 2 wall hence the 1.2mm thickness from a 3 wall print.
Building a strong base is very important to limit flex from the frame that holds the dial indicator. You can use a simple screw to mimic the tip from an indicator.
We can also measure the maximum strain of the system by using the equation from above knowing that the relationship between stress, strain and Young's modulus is:
ϵ = σ/E
To get σ you simply replace the allowable displacement in the formula from before by the actual displacement you expect and solve for σ.
Electronics Design
Knowing the strain and the gauge factor of your strain gauge you can get the resistance change of your strain gauge according to a strain:
∆R = (G*ϵ)
You can plug this change in resistance into the Wheatstone bridge equation to get the output voltage of the bridge and therefore the needed amplification to correctly measure in a 0-5V range. In my case, I had a maximum strain of 1.1%, though the measured strain will be smaller since this strain value is only maximum in a very thin slice of the blade. Therefore for a gauge factor of 2.11 I will get a ∆R of around 2.47ohm.
In a quarter bridge we can compute the maximum excitation voltage as:
ΔV=Vex⋅(GF⋅ϵ)/4
In my case this Voltage is 29mV. Using a full bridge yields a ∆V of 116mV so less amplification is needed and thermal noise is kept to a minimum. Here we can use the HX711 module which measures and amplifies this differential voltage directly off a Wheatstone bridge and sends digitally a 24bit signal to the Microcontroller so no need for an analog pin with a very high bit resolution. You can use the circuit I included to make your own circuit. If you choose to make a quarter-bridge make sure to calibrate your potentiometers to the nominal value of the strain gauge and if you use a full bridge simply replace all potentiometers by your strain gauges.
In this circuit the voltage supplied to the bridge is given by the pins E+ and E- while pins A+ and A- get the differential voltage which will be amplified. SCK gives the amplification value while DT sends the data to the microcontroller. The HX711 lets us choose between an amplification of 32, 64 or 128 so choosing an amplification of 128 for my case yields an output voltage of 3.7V which is within 0 and 5V so works great. Using a full bridge changes the needed amplification which is even better for noise.
Software
Code is boring to explain but it should be easy enough to understand from the code I've pasted below. It basically follows the computations we did above but in code and defines the correct calibration procedure. Basically, first we must let the load cell measure nothing to get the zero position. We measure for a total of 20 seconds to minimise error due to creep. We then take an average of 100 samples to get a very accurate 0 position. Since the probe floats when it's in rest we must measure the height of two parts in order to solve the equation y=mx+p where m is the slope of measured displacement against strain, x is the strain and p is the initial height of the probe.
3D Printing and Assembly
As I've alluded before, using a low creep material is crucial, which is why I chose to use polycarbonate. However polycarbonate has its drawbacks, namely warping. If you don't have a heated enclosure you can fuhgeddaboudit, you would be better off using carbon fibre filled PETG filaments thanks to its dimensional stability. Apart from PEEK (as always) would be a carbon fibre filled Nylon filament though it's relatively expensive and hygroscopic. It's easier to print thanks to the carbon fibre since it reduces warping. To minimise warping in my print I was able to use a Prusa Core one in my local makerspace. I added a healthy brim around the main bases of the part while making sure to avoid putting a brim around the blades. I set the chamber temperature to 50º to minimise temperature deltas in the part itself.
An important detail to consider is the position of the seam. While often it doesn't matter here it's better to avoid putting a seam on the blade as seen on the included picture. This ensures that no extra unwanted strain is felt throughout the blade.
A great thing about using polycarbonate is its ease of post-processing. As we're going to stick a very thin strain gauge of our 3D printed part we need a very smooth surface. By sanding the layer lines off the blade we can minimise bumps and allow for better adhesion. A perfect surface isn't needed but will yield better results. You can start with 200 grit sandpaper and go up to 400 and finally 600 which will yield a great surface finish. Be sure to remove and dust by blowing air on the part and cleaning it with Isopropyl alcohol.
The next step is to attach the strain gauge to the blade. This is... a whole ordeal. Usually strain gauges are really small, the one I bought were 4x7mm and came with no cable soldered to them which made them very easy to break. To attach the strain gauges to the blades use the following procedure:
- Place the strain gauge on a table with the shiny face up
- Cover the zig-zag pattern of the strain gauge with transparent tape
- Transfer the strain gauge to the blade. Be sure to place it such that the center of the gauge coincides with the quarter length of the blade as that is where strain is maximum. Also align it along the direction of the blades. You can use the faint image of the remaining layer lines to guide you.
- When you're satisfied with the position of the gauge lift the tape from one side and place a small bead of CA glue or superglue (something very runny). Place the gauge back quickly and apply pressure using a piece of foam for around 1 minute. (watch this video for more details)
- Solder a very small bead of solder on the pads. Be very quick as to not overheat the Kapton backing tape. Since the pad is so small there is very little chance of cold soldering so as soon as you place the solder on the pad it will stick. Usually you only need to place the solder for half a second for this to work correctly. Use a low temperature (around 300ºC or less). (look at this video for more details)
- Remove the enamel off a very thin copper wire (Ø0.3mm works great for this) and solder it without adding any solder to the pad, just so it sticks to it. Solder the second wire the same way. Then add a piece of tape that holds both wires in place and glue them with a small bead of superglue (don't use too much). The goal is to create a strain relief such that if we may pull on the copper wire we don't pull on the pad directly and destroy it but instead simply pull on a wire which probably won't break or is easy to repair.
- Once the glue has dried add more solder to the wire and pad to ensure correct adhesion between wire and pad while making sure to not heat the gauge for too long (just like before).
- Once everything is in place wait 5 minutes before removing the tape. This must be done slowly and carefully as to not destroy the strain gauge
- After breaking 10 strain gauges get one passable result and DON'T TOUCH IT even if it's not perfect unless you want to spend a whole day soldering strain gauges and destroying load cells
It's also possible to do all the soldering before placing the strain gauge on the load cell. However, it can be tricky since the copper wire pulls on the gauge and deforms it, which can break it.
If you choose to make a full bridge you will have to repeat these steps a total of four times, so good luck.
The rest of the circuit can be assembled on a breadboard, the copper wire easily enters the terminals.
Assembling the printed parts is quite easy, simply insert a few heat-set inserts, screw a few nuts and bolts and screw the entire assembly on a stiff and heavy base and you're done!
Now you can upload the code onto the arduino and enjoy your dial indicator!
Using the Dial Indicator
The dial indicator is currently used through the Serial monitor of the Arduino IDE. Following the instructions is quite simple. In the beginning you should just leave the indicator alone while it calibrates the zero position for around 20 seconds. Then place an object of known length under the probe tip and press enter for another 20 seconds of calibration. Place another object of known and different length under the probe tip and recalibrate. You can continue placing more objects if you wish to refine the calibration but once you're satisfied you can simply press "y" on the serial monitor to start reading actual values.
Here is I showed a test of me measuring an object of 19.93mm and then an object of 16.00mm. We can see that there is a settling time to measure the correct value but after a few seconds the measurement reflects reality accurately within a few hundredths of a millimetre which is great for such a low budget! However, as time goes on and temperature changes more and more calibrations are needed due to thermal drift.
I'm sure that using a full bridge would solve most of the issue of this build and would yield a much better indicator with no thermal drift, lower noise and better accuracy. I'm sure that sub-10 micron accuracy is possible, surpassing the capabilities of many commercially available dial indicators while having a longer measurable range of values.
However, one thing where traditional dial indicators will always excel is speed : strain gauges need at least 10 or 20 seconds to settle while dial indicator give essentially immediate measurements.
Conclusion
We have seen how one can use strain gauges to creates a low-budget but very high accuracy indicator. I think that, while there are some things that could be improved such as using a bull Wheatstone bridge, the project as it stands works quite well. In the future I hope to use this project to make a profilometer to measure really accurately the surface of an object. I hope to improve my soldering enough to be able to use a full Wheatstone bridge.