Inductive sensing for easier 3D printbed tramming/leveling

I hate leveling my bed. It’s annoying – either because I suck, or the mechanical design sucks. I strongly dislike the cantilevered design of the bed. It’s a bitch to keep the cantilevered end stable and constant between prints. When you pull a completed part off, whoops, there goes your nice and level bed. Whatever the reason, it’s a pain to level it. Well, I’ve been yelled at that the proper word is “tram”, not level. So, it’s a pain to tram the bed. If I say “level” again, please murder me using your favorite method of body disposal.

First up, the ever popular and famous dial gauge. A long time ago, I printed up a little holder for my dial gauge.

In theory, it would affix to the machine, and I’d move the bed around, making sure the bed is the same measurement all around. In practice, what another pain in the ass. The bed only moves in the Y-axis, so I’d manually need to mount/unmount/mount/unmount all along the X-axis. Why can’t you just loosen it up and slide it along the X-axis, you ask? The printhead would get in the way, so I’d need to move that around as well. Too much work, takes too long, needs to be a quicker way. I just don’t like it. Next.

I started to use an automotive feeler gauge to tram the bed. I’d set Z = .2mm, pull out the .207mm feeler (or whatever) and measure over each bed adjustment screw. This works pretty well, and I can tram the bed kinda quickly now. Still much quicker than the dial gauge mounting/unmounting/moving/blahblahblah, but repeatability between measuring points is difficult. 200 microns is really quite thin and when you run a feeler gauge between the nozzle and the bed, it’s pretty hard to make sure you get the same “feel” between each measuring point. So, pretty close, but can we do better?

Sensors. Internet of Things. Oh wait, sorry, buzzwords leaked in. But seriously, I came across this inductive sensor (LDC1000) recently. Basically, it’s a metal detector. And the nozzle is metal, huzzah. So…let’s try it out for the very small distance detection I need. Need to make a nice mount for it:

Here’s a couple variations on my first idea. And here’s how it would work:

And then finally, it would slide onto the bed:

Looks nice, works like shit. I kinda CAD’d it up like a dipshit, which made making adjustments to the dimensions a terrible pain. Pain. Always pain. Anyways, I decided to scrap the whole thing. Too cute. Let’s try again.

I liked the direction this was going in, but needed to refine further and this is what I ended up with:

Yup, I said ‘fuck it’ and hotglued the now very stripped-down holder to the bed. It does actually work pretty nicely. There is a capacitor on one side of the board that prevents it from sliding in too far. The whole point of the sliding-mount was so I could use the same sensor for 3 measuring locations. But the problem with that, again, is repeatability. I noticed that simply moving the sensor from A to B and back to A, would give me a different reading. So I ordered 2 more sensors and the plan now is to just hotglue the sensor PCB to the build surface. What a hack!

Coming soon: PART II. In part II, I will curse more and hopefully discuss a cool and working solution involving this sensor.

Felix 3.0 Upgrades!

It’s been a couple months since I last updated. Mainly, I had let the 3D printer sit idle for awhile because I couldn’t get the repeatability & quality of prints I was hoping to get. So, I became frustrated and let it mellow for some weeks.

I was hanging on the periphery of the “scene”, just reading tweets and random blogs, seeing what some companies were coming out with. I kept seeing more and more cool prints, models, and machines, and it dragged me back into tinkering.

My main complaint about my Felix 3.0 is the print bed, which is probably one of the most crucial components if you think about it. On the plus side, it is very light, made of an aluminum sandwich, and that seems like it would be great for machine dynamics – easier to move, less vibration. Because it is aluminum though, I believe it expands and contracts quite a bit. When you’re dealing with .1mm layers, any unwanted Z-axis movement is detrimental to the quality of the print. One way to eliminate this bed movement is to change the temperature control algorithm for the bed. The stock firmware uses “bang-bang” heater mode for the bed. Experimenting with PID control shows that the bed expansion is much less! (Verified with dial gauge – I don’t have exact numbers, but I can say the dial’s needle sure did move a lot less.)

So enabling PID for the bed was a step in the right direction. Next up, actually leveling the bed. If you don’t have a level bed, your prints will look terrible. To level the bed, I created a model that would print a pattern on the perimeter of the bed. From looking at pattern and how thick/thin the lines were, I could tell which corners of the bed needed to be adjusted up or down. A couple hours of printing patterns and lots of little tweaks to the adjustment screws and I finally had a perfectly level bed. Or so I thought.

After trying to print a smaller model in the center of the bed, I came to find that the center of my aluminum sandwich bed is bowed inward in the middle. Rats! All that time spent leveling and the middle isn’t even flat. I took a look around to see what some other 3D printer companies were using for bed surfaces. I came across the LulzBot TAZ series of printers, which use a Borosilicate glass bed, and they even sold spare beds in their store! I was about to grab one when I realized it would be too big for my machine. Luckily, my trusty “go-to supplier of all things maker” McMaster-Carr sells sheets of Borosilicate glass in various dimensions and thicknesses. Excellent! I picked up an 8″ x 8″, 3/16″ thick sheet. (McMaster part number 8476K18). The nice thing about Borosilicate glass is that is it good up to 200C and very flat. On top of the glass, I am using PET tape sheets from LulzBot, as they claim it works better than Kapton tape. After extensive printing on it, I would have to agree.

The next problem, though, is the stock Kapton heating element attached to the bottom side of the bed. It just doesn’t seem like it has enough “oomph” to get the temperatures up, especially in the experimenting phase, when you might want to try your bed at 80C or something, lets say. It seemed to peak at around 65C for me, and even less if I tried to use an additional fan to keep the extruded plastic nice and tight and less “goopy”. To make things worse, now I’ve added a sheet of glass on top of the bed, which requires more energy to heat up.

To overcome this dilemma, I added a second Kapton heater on the top of the bed. To ensure good thermal transfer from the heater to the glass, I used some thermal interface material I found at work. The material is slightly sticky and holds the glass bed in place very well. I don’t have any mechanical clasps to ensure the glass is evenly secured to the material. I just pressed the glass into the material as evenly as I could. Some kind of mechanical clasp that ensures a certain amount of force is applied evenly to the glass would be a nice touch.

The Kapton heater is a 115V model from Omega Engineering (part number KH-810/5-P), and I am controlling it via a Crydom D2425 solid state relay. The SSR is being driven off the stock bed heater output. In fact, I actually have both running in parallel at the moment.

After these upgrades, I have a better performing 3D printer that can reliably get the first layer to stick. With a decent amount of settings experimentation, I have been able to print some extreme overhangs in PLA and still have the base of the part stick, without using any additional glues or slurries.

The quality is pretty bad, but the part completed. I was not using any fans at all, and I think if I keep experimenting with fan(s) and different temperatures, I might be able to get the part to print with better quality.

3D Printer accessory parts printed on 3D printer

The rabbit hole goes deep…

I used some 1.75mm Silver ABS from Inventables. I’m using a glass plate (from a picture frame) on top of the stock heated bed, which I have cranked to 90C. Not sure how hot the glass actually gets, though. Extrusion temp @ 220C. Prints pretty nicely using the default slicer settings, which were actually created for PLA, I think. The two mounts took about 2 hours print time in total.

The lights are IKEA Dioder LED bars. You could probably find something cheaper on eBay, but…I was at IKEA at the time and the lights were there and the rest is 3D printed plastic history.

I put up the files on Thingverse here.

3D Printer: First Prints

It’s finished!

sudo apt-get install 3dprinter

I am now the proud owner of a Felix 3.0 3D Printer DIY kit!

Ordered last week from Makershed and it arrived today. It’s the barebones one: no LCD, and just a single extruder. I didn’t want to wait for shipping from Felix directly, so I went with Makershed (and probably paid a little premium because of that).

So far, I’ve got the frame and the Z-axis built, which took about 2-2.5 hours.

So far, I’m pretty impressed with the kit. It’s not an entirely mindless operation, though, but it’s certainly doable with a little patience.

CNC: Debugging Position Sensor

After running a gamut of tests, I’ve concluded the “drifting” of the position count is actually due to the machine *still moving* when the motors are locked. The movement is ever so slight. Thinking about it though, the only time you would have the motors locked like this, would be at the end of a job, and who cares what the position is then. So I think things are OK and I should do a second revision of the board.

CNC: Magnetic Position Sensor MegaUpdate

Over the past month, I’ve been able to make what seems like decent progress on the magnetic position sensor.

I was able to implement a simple firmware that would allow me to do some preliminary testing. The firmware interacts with the magnetic sensor over 2 different interfaces. First, the incremental encoder interface, which gives the position information and second, the serial data interface, which gives more detailed sensor data. The encoder pins from the sensor are connected to the hardware decoder pins on the microcontroller. The hardware interface is nice because you don’t really need to write that much code, just check some flags that the hardware sets. Also, the hardware interface provides the option to use a filter on the inputs, which can be nice for noisy signals in “hostile” environments. The incremental encoder interface gives me a pulse every 1.95µm and generates an “index” pulse at every 2mm.

I configured the LEDs on the top of the board to show the current direction and another LED flips on/off every index pulse:

Continue Reading…

CNC: MagSensor board bring-up

I got the LPC1751 up and running, using the internal 4MHz oscillator, which caused me a little bit of pain but was fairly easy to configure.

I started the migration to the base end of the LPC17xx family with my LPCXpresso 1769 dev board and worked “backwards”. First, I configured a pin to output the CPU clock, so I could use my ‘scope to see what was going on inside the chip. I was seeing a 50MHz waveform and the clock output was being divided by 2, so the CPU clock was 100MHz. Great.

Then, I modified the startup code to disable the “main oscillator” (ie, the external oscillator), enabled the internal oscillator and reconfigured the PLL to run at a slower rate. I used a spreadsheet from NXP that I found somewhere to calculate the correct values for the PLL. I put a copy of it on Google Drive for sharing.

Once I saw the clock output at 25MHz, I knew it should run OK on the 1751, so I went ahead and changed my MCU settings and flashed my board and it worked! Note: There doesn’t seem to be a dedicated clock output pin on the “smaller” 80-pin packages, so I don’t think the 1751 has one! It worked out nicely that I had a higher end model to start from.

Once I had the 1751 chugging along at 50MHz, I was off to the races. I tested out the red/green LED for magnetic field strength and also ran a counting pattern to test the white debug LEDs:

After I had enough of the blinky LEDs, I soldered down the AS5311 magnetic sensor. The chip has two status pins that indicate how “healthy” the magnetic field is around the chip. If the magnetic strip is too far away from the chip, the readings are useless. I wrote some code to read these pins and output the status on the red/green LED, which is working a treat. Next I will interface with the hardware quadrature decoder to take some actual movement measurements.

CNC: Magnetic Sensor Board Update

The boards arrived from OSH Park the other day and look super excellent, as usual. This time around, my order came with a sticker, which I promptly affixed to my oscilloscope.

I’m now waiting for a Digi-key order (and a bunch of other lab equipment, actually) to arrive so I can assemble one.

A mini-review of the boards (pictures taken with a potato an iPhone through a microscope viewfinder):

The soldermask sharpness is excellent, as you can see by the “jagged edge thing” I made. I also “tented” the vias (which just means that soldermask will be applied over the vias). The tenting worked OK, but since the via centers are not plugged, sometimes the soldermask might sluice through the hole. For the most part though, the vias are nicely covered.

The “silkscreen resolution test” I did with the Futurama art is actually pretty good quality. Even though the features are quite small, the text is still fairly legible.

Overall, the silkscreen quality is excellent, with sharp and crisp edges and is comparable to results from more expensive board services.

While waiting for components/tools/chemicals/whatever, I’ve been playing with the LPCXpresso LPC1769 board, so that I can become familiar with the LPC17xx family of microcontrollers. I have some PWM code up and running to drive the red/green LEDs for the magnetic field strength indicator. I was having trouble getting things up and running with the toolchain, until I said “screw this” and stripped out the LPCXpresso board library and the LPCOpen library, and just used the CMSIS library only. Too much high-level abstraction for me – I need to know the details of what registers do what, so I do not mind digging through the datasheet/user manual to learn how the chip actually works.

CNC: Magnetic Sensor Complete

Finished up the MagSensor board the other night and sent it off to OSH Park.


Some design notes of (possible?) interest:

  • 2-layer boards aren’t really the greatest for establishing uniform ground and power planes. I did a ground pour on the top (red) layer to simulate an unbroken ground plane (Maybe I should have just done a star-ground?). I did try to minimize traces crossing breaks in the “plane”, but it’s pretty hard to avoid entirely (Crossing breaks in the plane = longer current return loop = more EMI issues). I didn’t feel the need to do a ground pour on the bottom layer – not sure if I see a point really.


  • The analog section (for the Allegro Hall Effect sensor and Analog-to-Digital converter) has extra filtering on the power rail to keep it clean and an isolated ground pour as well. The “analog” ground can be left unconnected, connected via 0Ω resistor, or connected via ferrite bead to the main “digital” ground. I plan on trying each and seeing what kind of effect it has on A/D readings.


  • I got kinda weird with the copper features for the voltage regulator (U2, near reset switch – jagged soldermask). I wanted to use the copper of the PCB to draw heat away from the regulator, so I used a decent amount of pours around the chip. I didn’t do any calculations on power dissipation and generated heat beforehand though, so this is definitely just experimentation. I don’t think my current demands will be high enough to heat up the regulator anyways.  We shall see.


  • I wanted to see how OSH Park would perform on detailed silkscreen art,  so I added a goofy Futurama image along with the Open Source Hardware icon.



Page 1 of 3123»