Introduction: Force Sensitive Resistor Delta Auto Leveling System
Trying to stuff a depth probe on a Delta printer is frustrating to say the least. Thre really isn't much room on the hotend for sensor mounting.
I opted to use FSRs. They work by sensing when the nozzle touches the build plate. We aren’t going to do damage to the nozzle. They are sensitive. Sensitive to the point they will trip from the vibrations of the steppers moving the hot end up and down if the sensitivity is to high.
At the end of the video I do a close up of the plate. If you notice there aren't any marks on the tape from the nozzle hitting it. Hard to see. It is sensitive enough to touch that lightly.
Screen shot from the vid from the end of the cycle.
Step 1: Force Sensitive Resistors
FSRs work by detecting the amount of pressure applied to them. The more pressure, the less resistance they have.
For a really in depth explanation Adafruit can do it way better than me.
For this project we are going to use FSR402 with a half inch face. The 402 is the most sensitive. It has a range of 0 to 100 Newtons (0 to 20 lbs.) Accuracy can fluctuate among them. They are rated at +-10%. So do pay attention and buy decent quality ones. Also just realize they are all going to read just a tad different, don’t expect them all to read exactly the same. On my original design I tried to compensate by adding a trimmer pot to adjust the out put of each one to compensate. But in the end I just wound up maxing them all out any way.
WARNING: The tabs are very fragile and soldering them can damage them very easily. Please don’t try to solder directly to them. The terminal blocks I used fit very well and are a much better way to connect them.
Their only drawback is the temperature range. From the data sheet the temp Rnge is -30ºC to +70°C. That puts PLA right on the edge. And ABS, at 110°C, is over range. I don’t have a heated bed (yet.) So it’s not a big deal so far.
Step 2: Parts List
I'm not going to give links. All this stuff is easy to find. A quick Google search should bring it all up. And there really isn't much of a difference, except for price. I believe there is only one company making the FSRs. So if you find them cheap, no fret about quality.
You will need:
An already functioning 3D printer. Duh.
Arduino Pro mini or Micro 5v/16mhz. Really any Arduino should work. But these are small and we dont really need much.
(8) KF301-2P 2 Pin Plug-in Screw Terminal Block Connector 5.08mm Pitch M211
(3) 1/4-20 bolts
(3) 1/4-20 nuts
(3) 1/4”-1 1/4" fender washers
If you are OK with non adjustable FSRs
(1) 110K OHM Trimmer Trim Pot
(3) 10k OHM resistors
If you want to be able to fine tune each FSR
(4) 10k OHM resistors
If you want an extra led.
(1) LED and it’s resistor
Something to mount the bits to. Proto board, bread board, what ever you prefer.
Some lengths of wire. Enough to reach from each FSR to the Arduino, the Z limit to Arduino, and power/GND.
Soldering iron and solder
Step 3: HOW IT WORKS
Three bed mounts attach to the frame of the delta. The ones I supplied are set up for an 180 mm diam plate. Feel free to edit them if your plate is different. Even if you decide not to use the FSRs these are really great mounts on their own.
The FSRs sit in a small recess on the mount.
A small button sits on top of the FSR. The build plate sits on top of the button.
The mount has a recess to hold a ¼-20 nut (7/16 wrench size.) The thumb knob allows for easy loosening of the bolt. The bolt uses the fender washer to clamp the build plate so it doesn't’ wiggle around while printing.
Loosen the bolts to level the bed. Tighten them to print.
During auto leveling, the nozzle is slowly lowered to the bed. When it touches the FSRs will read a slight increase in pressure.
The Arduino attaches to the Z Limit on the printer control board. When the pressure is great enough, the signal line to the Printer control board will be drawn from high to low briefly. 50 ms is the default. More than enough time for most boards to recognize the signal.
Once the pressure is released on all FSRs the signal line is drawn back to HIGH., releasing the Z limit stop signal.
The 10K pot is used to set the amount of force need to trigger the limit. To high and you will smash the hot end in to the plate. To low and it will react to the smallest of vibrations. Just running a stepper slowly will do it. Yes they are that sensitive.
The LED is just a simple indicator if the Z limit is triggered. It can use either the on board LED on the Arduino or an external one. Triggered it’s on. Released it’s off.
Step 4: Print the Parts
Print out the mount, the buttons, and the thumb knob. You will need three of each.
I wanted them really solid. I printed mine at 75% infill, .4mm layer height and PLA.
The mount is a remix of one from Thingiverse. Thank you VespGareth.
Step 5: The Sketch
Open the fsr_auto_level sketch in the Arduino IDE.
It's a really simple sketch.
First read the FSR analogue values
Read the sensitivity pot.
If any FSR is above the sensitivity pot reading, trigger the Z limit.
If all three are belowit, release the Z limit.
Throw in some debugging out put for setup.
Lather, rinse, repeat....
Step 6: Assembly of the Electronics
Use the terminal blocks to connect the FSRs to some jumper wires. Solder the wire jumpers to the blocks. Then use the screw terminals to connect the FSR.
Follow the schematic and place all your electronics on a bread board or solder them to a perf board or how ever you want.
Each FSR will connect one side to 5v.
The other side to a voltage divider.
There are two ways here.
For simplicity, a 10k OHM resistor tee'd to A0,A1 or A2. The other end of the resistor to GND.
If you want to be able to adjust each FSR replace the resistor with a 10k pot. One outer leg to the FSR. One outer leg to GND. And the center tap to A0,A1 or A2.
On the sensitivity pot, one outer leg to 5v. The other outer leg to GND. And the center tap to A3.
D13 to the led resistor, then the LED, then GND.
5v on the Arduino to a 5v power output on your main control boar. Be sure it’s 5v out put voltage. This is the unregulated side and higher will fry the board.
GND to GND on the controller board.
D3 on the Arduino goes to the Z Min end stop on the controller board.
Step 7: Marlin Setup
I assume your adding this to an already running printer and are just adding an auto leveling system.
Load up your Marlin Firmware in the Arduino IDE and find all the following lines and set them to match:
#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle]
The default probing speeds are like just way to fast. So let’s slow them down. But they are in MM per MINUTE. So they are slower than what they look. Find and change these lines too.
// X and Y axis travel speed (mm/m) between probes
#define XY_PROBE_SPEED 4000 // default 8000
// Speed for the "accurate" probe of each point
#define Z_PROBE_SPEED_SLOW (150) //default (Z_PROBE_SPEED_FAST / 2)
Compile and upload to your printer board.
Step 8: Assembly
First take a 1/4-20 nut and insert it into the small slot in the side of the mount. It’s a tight fit.
Now run a bolt through the nut. It might be a little tight. You may need a wrench to get it started. The hole for the bolt goes all the way through the mount. So if the bolts a little to long don’t worry about it. As long as it doesn’t stick out the bottom, your good.
Remove the bolt.
Put a 1/4-20 bolt through the knob. It should be about flush on top when inserted all the way. Put a fender washer on the bolt. Screw the bolt through the nut in the mount.
Attach the three mounts to the frame. But leave them slightly loose.
Put your build plate on the mounts. You need it to be able to wiggle just a slight amount.
Adjust the mounts so the build plate cam be moved slightly in the mounts. Tighten them and set the build plate to the side..
Place the FSRs in the holes on the mounts with the sensing surface up. A drop of super glue will hold them in place.
Place a little button on top of the FSR.
Place your build plate on top of the buttons. There should be a slight bit of play in the build plate with out the thumb screws being tight. If not, adjust the mounts so there is. Don’t tighten the clamps yet.
Step 9: REZERO YOUR BED!
Rezero the build plate. These clamps are taller than the stock ones.
Step 10: Firing It Up.
Connect your board and open the Arduino IDE.
Open the Serial Plotter. (Wow, there is a use for it!)
The sketch is setup for a baud of 115200.
You should be seeing four lines in the plotter. One line for each FSR. One line for the Sensitivity pot.
Slightly tap near one of the FSRs. You should see a spike on the lines. A big spike for the one your close to. Smaller for the others. The harder you push, the more the lines should change. Turn the Sensitivity pot and it’s line should go up and down.
When it goes over ANY of the FSR values the LED light should come on. The signal line to the control board should be pulled low too, but you can’t really see that.
The light should go off only when the pot sensitivity is below ALL of the FSRs.
It only take one to trigger the led. But all of them to release it.
If you notice the pot has way more adjustment than we will ever need. Make a note of the smallest reading from the FSRs while the plate is just sitting empty. Then tap lightly by each FSR again and note the maximum value for that. You will need a little room to play with. So on the lower value subtract 75 and on the higher one add 100.
Go back in to the sketch and find the lines:
#define POTSENSITIVITYLOW 1
#define POTSENSITIVITYHIGH 1024
If you want, you can make the range as tight as you want. As long as the FSR reading goes above and below it. The more narrow the range, the finer adjustment you will have.
And replace the numbers with what you came up with. Re upload the sketch.
Now you should have a more usable pot. You can fiddle with these numbers and tighten the range up as much as you want.
Now go back into the Serial plotter. Make sure the pot can be adjusted past the high readings on the FSRs. Set the Pot so that when you very lightly tap on the center of the build plate the LED goes on and off.
Run the homing cycle on the printer. If you notice, these FSR's will detect the vibrations from the printer running. The Auto level cycle will do this also. But don't try Auto level quite yet.
We want to adjust the sensitivity pot so the vibrations never set it off. But the tap from the nozzle does.
Also the sketch is set to run normally closed, there is always power to the Z limit and the switch opens to activate the stop.
If you need it to run normally open, comment out this line:
Step 11: The First Try
Go a head and start an auto level cycle.
Have your hand on the cord and ready to unplug the printer.
The nozzle should start heading tword the build plate.
Tap lightly on the glass.
The nozzle should stop and go back up and start heading for the next probing point.
Unplug the printer. Seriously. Really. Stop this Auto Level cycle. We just messed it up.
If it didn't detect the tap, post in the comments and we can figure it out.
If it did, reboot and run another auto level cycle, still hand on the plug ready to pull power.
The nozzle should go down and barely tap the build plate and then move to the next probe point.
If any of these happen, unplug the printer and stop the cycle:
Watch that the nozzle isn't smashing in to the build plate. It should be a very small tap.
Watch for false triggers. The vibrations from the steppers triggering the end stop.
Readjust the sensitivity and try again if needed.
Step 12: Gcode Slicer
Now we have a fully functioning system.
But We need to be able to tighten the thumb screws after a leveling cycle.
So what I did was to go in to the slicing program and change a couple things.
Most slicers allow you to edit the beginning and ending Gcode.
I use Cura, so I'll cover that.
In the menu bar go to Settings>>Printers>>Manage Printers.
Select your printer and click "Machine Settings."
On the bottom there is a text box for "Start Gcode."
in it find any lines that start with G28 and delete them. That is the Gcode for a homing cycle and wipes out any Auto leveling.
Also look for any lines that start with G29. That one is for auto leveling.
Do the same on the "End Gcode" side.
On the "End Gcode" side the first line is probably "M104 S0 ;extruder heater off."
After that line, on a new line by itself, I like to add:
G0 X0 Y0 Z320
This will raise the nozzle back to the top. If you don't, the nozzle will stick to your part wherever the last move was. Make sure the Z is within your printers capabilities. If you can only go 200 mm up, put that.
Hit close on that window, and the other window.
Step 13: Printing
To print you will have to start an auto level cycle manually.
- Slightly loosen the thumb screws. Just enough to stop the Z limit from tripping.
- Start an auto level cycle. Either by using your LCD screen or by issuing the G29 command. You may need to run a home cycle first.
- Snug the knobs back down. Don't go crazy. They really just need to be good and snug.
- Print some thing.
And we are done! YA!