Let's Make Robots!

Trials and Tribulations of Making a 3D Printer

Complete. I am able to extrude plastic pieces as long as I have a 3D drawing of the part.

A last minute note to direct people to the other page where I showed building the NEW hot-end for this printer. http://letsmakerobots.com/node/37011

Other than that, this project is finished. — COMPLETE —

I solved my problems of the plastic not sticking to the table by a light cleaning of the table top with fingernail polish remover. What is available here now is not acetone as it used to be. It is mostly alcohol. Ethyl acetate to be more specific. It cleans the dust and residue from previous printings away, and the new printing sticks well with only a little extra pressure to pop things loose from the table, which was made from aluminum covered with kapton tape.

 :-)  See also my page on making an all-metal hot-end for your 3D printer, which goes along with this page: http://letsmakerobots.com/node/37011


After several people engaging in much chatting on the Shout Box about making 3D printers, I was finally hooked and decided to start on one myself.  My reasoning being that I would be able to make custom robot parts for future projects.  (For instance, the InMoov robot is quite intriguing.)

Despite all the hassles you may run into, remember the words of Winston Churchill when he said to "─never, ever, ever give up." (You do not have to be an englishman to adopt that way of looking at life).

The first point I want to make is that I am happy with the printed parts deal I got to start this project off.  The price I was given was excellent compared to other people's prices for the same things.  The problems I ran into are actually quite minor, so if I sound like I am complaining, remember that these are really minor troubles, corrected fairly easily.

I think the main thing to point out, is that while I have been able to keep the costs down, there is no way to avoid expense that is in the hundreds.  If it were really cheap, everyone would have one already.

I know it's going to cost me a few hundred* dollars, (*The total was just a bit over $300 US. Call it $325) so I tried to quell my worries in that regard by telling myself I will stretch it out over several months.  I can be so gullible at times!  I even believed it myself, –ha ha.  It's been about a month now since I started this and I've already spent over three hundred dollars (US).  [That's all right I'll make up the difference somewhere else… err… I am sitting here eating crackers and drinking water.  Now where can I cut more costs?  I could stop buying meats… Oh, wait, I did that a couple years ago when I retired… Well, I'll think of something.] :-)

Okay, okay, just being humourous.  [ I happen to like crackers with cheese or peanut butter, and the doctor told me I should drink more water.  –But now it's time for a cuppa coffee.

I needed stepper motors of the NEMA17 type.  Basically, they should be strong enough so even taking micro steps, the movements will be strong and certain.  So where do I look?  Let's check eBay. It doesn't take long until I decide that good motors are going to cost me over $10 USD each and I need five of them.  I kept seeing them priced in the $15-$20 range, but eventually persistence paid off. I found a set of five NEMA17 steppers costing about $51 USD, shipping included.

 My motors


Why did I need five of them?  On this model the z-axis uses two steppers, one on each side.  Then the X and Y axes use one apiece, and the extruder needs one to push the plastic through, for a total of five.

I also needed drivers for the stepper motors.  I could have built that myself, but decided that it would be easier to buy a board already made.  (–Of course, that was more money out the door. This time it was close to $90.)  I bought the RAMPS board with four small daughter boards holding the driver chips.  (By the way, it took a while, but I finally located the spec sheet for those A4988 chips.  More about those later.)

Arduino Mega and RAMPS

I bought these boards Pre-Assembled. These pictures would have given me a clue about a problem that cropped up later, IF I had only noticed...  Explained below ! 

Plugged into the Mega.

 I am building "iteration two" of the Prusa machine (also called Prusa-i2). For explanation of the changes from i1 to i2, see this page: http://blog.reprap.org/2011/11/prusa-iteration-2.html 

The original Mendel printer only used one stepper motor on the z-axis, with a belt and pulley arrangement controlling the other side. Prusa did away with the belt and pulley and uses two motors in sync with one another, so a pair of identical motors are needed there.  Both the first two versions of the Prusa machine use a triangular support made up primarily of threaded steel rods.  Originally these were 8mm rods, but on the version I'm building they were changed out to 3/8 inch rods.  For those who have no clue what 3/8 of an inch is, it is approximately 9.5 mm.  This makes the framework a bit sturdier, and that's a good thing. I won't discuss the third version of the Prusa, as it appears to be totally different.


Finally got hold of some rods, and 3/8" nuts and washers.


One of the plastic printed parts broke in half between the layers.  I tried to fix it, but as you can see in the next picture, I was off a wee bit when I set them together and they were locked that way.  It was the coupler from a z-axis motor to the vertical threaded rod that moves the x-axis up and down.  I decided that rather than trying again, I would make a new one out of aluminium on the lathe.  Then, while I was about it, I went ahead and replaced both sides with aluminium so they would be the same.

The reason the threaded rod is turned down is the original plastic coupler was still sized for the 8mm rod, so to get around it, I turned the 3/8" rod down to 8mm. When I made the aluminium couplers I could have just threaded them, but the 3/8" rods were already turned down, so I just drilled the couplers for that size.

They fit fine.


Next thing I noticed was that the bushings for the bottom plate had not printed properly, (next photo).


Here, I am starting to mount the bars.

Pulley mounted on the bar and clamps in place to hold the smooth bars.

Here is what the other side of the Y-motor pulley set up looks like:

I don't know if that's supposed to be the front, but I am making that the back on mine.


Let's take a closer look at that. You can see here another little problem I had. Standard washers for 3/8" are larger than the ball bearing housings. I needed something that would press on the inner ring, but not touch the outer ring of the bearings, so they would turn properly. I had to get some washers with a smaller OD, then drill out the inside diameter to 3/8". I made 2 of those for each of the three ball bearings.

In the picture above, I typed "roller bearings". Ignore that. I meant "ball bearings".


The linear bearings did not fit snugly into the channels made for them, so again I got out the glue.

It may not look pretty, but it should hold. That Goop is strong stuff.

Below was taken because I wanted to get an idea what the machine would look like with the table in place. The plastic box is roughly the size of the lower table, although the actual table may not be quite so long.

Here is one of the Z-motors in its housing. Both are the same.


On this part the linear bearings fit pretty closely, but they still did not stay snapped in place, so I need to tie them in place as per instructions. However, I could not find my ties anywhere.

Not to worry. As with the other linear bearings, I glued them in place

Then before the glue could dry, I put the X-table onto the rails, so the bearings would be in proper alignment when they dried.

Oh, I didn't mention that another problem I had was that my bandsaw blade broke. I might have tried welding it, but it was old and had lost a lot of teeth, so I decided I would buy a new one. The problem is that it is not here yet. Hopefully it will come this coming Monday and I can finish cutting off those rods that were too long and had not been cut down yet.

I received the new bandsaw blade, so I trimmed a couple of the rods to size.

Then I started tightening things up a bit, and —

While down in my basement shop, I ran the smooth rods for the X-axis on the buffing wheel since the surface seemed a wee bit rough and the carriage runs on them better now.

As I was dialing in the frame, you can see I made use of a carpentry square to be sure the frame had nice square angles where they should be.

Here is a close-up of the square showing the alignment of the Z-axis smooth rods, which I've now locked into that position.

I started to tighten up the screws that hold the X-axis smooth bars in place. I kept turning, and thought "Surely that should have tightened by now." I looked under the carriage and found the nut was pulling right through the plastic.  Errk !!!

So what did I do to fix it?  so far, I just used cable ties....

—problem solved.


Then when I started to connect the belts, I came up with a different problem. The clips that held the belt to the X-axis platform were made for T5 belts, rather than T2.5, the updated type.

As I mention in the picture, I just cut away a couple of the teeth so the belt would fit the clip. Problem solved.

Have not started on the hot-end yet. still need a couple parts. I had some more hunks of aluminum and 5.6 Ω wire wound power resistors on order and those have now arrived.

I got the new aluminium stock, so took the 3/4" square rod (19mm) and cut off a piece to use for the heat-head block. I didn't measure it. I just cut a piece between 35 and 40 mm long, and mounted it on the lathe to smooth/flatten the ends. While at the lathe, I drilled the center hole for the tip and two more for the resistors.

 Not quite ready to make it permanent, but I am checking that I have a good fit for the resistors and the extruding tip (aka welding tip).


Oh, and I rounded off the corners, too. That serves multiple purposes. Looks nicer, keeps me from raking my skin on a sharp corner, and lastly it keeps the block from cooling so quickly. Sharp corners radiate heat more.

Next is my design for making a hot-end to extrude the plastic. Will it work? I don't know, since I have not tried it yet, but it seems like a workable design.

ADDED NOTE: The plan below gave me fits, so I built a NEW hot-end that worked much better. http://letsmakerobots.com/node/37011 <<== USE THIS DESIGN INSTEAD !

There is just one wee problem with the above design. Where I have specified making a porcelain insulator using ceramic clay, that needs to be fired in a kiln (pottery or brick oven), and I do not have one of those. It ran through my head that I might be able to fill the metal form with clay and then heat it with a propane torch long enough to get a proper result, but a slightly different approach may be better.

What if I used a mixture that hardens up without heating? Ceramic is so immune to heat, they used ceramic tiles for heat shielding on the space shuttles. They also had an "instant" ceramic the astronauts could apply if one of the tiles were damaged, –just trowel it on and let it harden. Hmmm, I need is some of that. So what is available that might do that job?

One idea is to use some of the high temperature putty such as is available to patch mufflers and exhaust pipes. It dries hard and is immune to the heat levels beyond what could be present in a 3D printer. (I even have some of that on hand, but another idea first.)

The second idea would be more like instant ceramic. I can mix construction cement with clay. I have over half a bag of cement left over from a repair job on my front steps a while back, and among my rocketry/chemistry supplies, I have ground Bentonite clay (powder) to use for making sky-rocket nozzles. By mixing the two of these and adding a small bit of water, I should get a ceramic-like filler material to use as a heat insulator that will exceed the qualities of commonly used plastic (PTFE or PEEK). Both those plastics work at normal temperatures, but what if some error in hardware or software let the heater resistors be on too long? If the temperature gets too high, either PTFE or PEEK will begin to soften and deform. Higher yet and your plastic delivery system becomes useless.

A concrete or ceramic liner should give something that is immune to overheating, and be plenty strong to hold the hot end in place once it is cured. As a backup plan, it I have trouble with the ceramic idea, I have the muffler patch putty to try also.

Is a trial. Did not pay too much attention to making it neat. 

                                     Oddly enough, that did NOT work so well. ——

Cemented materials are supposed to get harder as days pass and they cure more. Should be useable in a day or two, quite hard in a month's time. However, I let this dry long enough (6 days), but when I checked it, it crumbled back into powder. WTH? I've no clue why that happened. I've done concrete and mortar before and never had that happen. So I will try a different mixture.

Ok, I tested that with direct hook-up to the power supply. It was getting nearly hot enough but borderline, so I decided to put insulation around the hot-block.


Tried smoothing it with a popsicle stick, but my fingers worked better.

–Reasonably smooth looking.

 (and I won't mention using a buffing wheel on my dremel to make it look better :-)


(Using this black/dark grey cement mix should hold the heat better, if I am thinking straight.)

Seems dry enough. Let's see how it looks on the machine.


Ok, that looks fine. While I have it mounted, let me see how much clearance I have...

Now to show how I made the support table and the top table. 


Getting the bottom plate ready. Yes, it is an old piece of copper-clad circuit board. My problem is not that; my problem is that I am short by one linear bearing. I have it on order, but it has not arrived yet. I went ahead and mounted the lower table on just the three and will add the fourth when it arrives.


Notice that I moved the bearing guide rods out, closer to the end of the bottom plate than what was called for. Just a matter of measuring so it is straight and square.

The bottom plate measures ~5" x 12"  (127mm X 305mm)

For the top plate, I decided an 1/8 inch thick 6061 aluminium plate

would be rigid enough (3mm+).  I made the plate 10" x 12" (254mm X 305mm)

It seems to run forward and back just fine on the three bearings, but I will feel better

about it when I get the fourth corner supported with a bearing.


(Top plate not all the way back. Left it here to show the motor clearance.)


Now, how about a heater for the table? The premade ones are 8" X 8". If I got one of those I would lose the extra space I have on my table (9" X 11") so I was going to try it without a heater, since I plan to use PLA only. (at least for now).

After thinking about it, I realised I had some resistors left over after making the extruder heat-chamber, and I could use those to heat the bed.






And finally, peeling the tape away before the cement hardens too much.

Have yet to hook up the resisters. Debating on the circuit. Two each in series across 12 volts should get warm enough for the table top. That way they will not get TOO hot.
Two 5.6Ω in series => 11.2Ω across 12 volts which will pull 12 / 11.2 = 1.07+ Amps for each of four legs. The total is ~4.29 Amps to run the table this way. (12 X 4.29 = 51.48 Watts). This should warm the table enough, especially since the table only needs to be ~60°C for PLA plastic. I also still need to mount a thermister, and heat the table to be sure of two things: 1) that it gets hot enough in a reasonable time, 2) that the cement will continue to stick to the table with the heating and cooling.
Yes, some of this is obviously experimental.

 If the cement tends to separate from the table after repeated heating and cooling, I may need to put metal clips to hold the resistors and that will mean screws through the table, which I would like to avoid. (If I need to do that, flat head screws counter-sunk would be necessary.)

I finally received the linear bearing I was missing on my Y-axis table support and have it mounted now.

I was considering using a thermister from my parts cabinet that is not exactly the 100 KΩ resistance @25°C that is called for. I found the following page that allows you to use a different size and calculate the values you need dropping the tables provided for the "recommended" size thermister. http://blog.reprap.org/2012/06/say-goodby-to-thermistor-table-misery.html 



I've noticed that with the booming interest in printers, suppliers are jacking up prices on every part needed to build one. [For example, the plastic itself. Raw plastic pellets are maybe four or five dollars (or euros) per kilogram, but when they convert it to long strands (filament), all of a sudden they are charging something around $36 to $38 per kilo. (Just one example: http://www.craftpellets.com/Bulk_Wholesale_Poly_Pellets_in_25_lb_Cases_s/4.htm ) It is starting to look like building my own filament extruder would save a LOT of money.]

I found one spot that has 1 kg rolls of 3mm filament for $34.50 US with shipping included.

I have some on order. Should be here Feb 22 or 23. (Filament has arrived, air-sealed in a heavy plastic bag.)


My 4X20 lcd screen for my printer arrived, along with a new power supply that will give higher amperage than the one I had before, so I suppose I should start on the electronics while waiting for the other deliveries.

I found an old project box that should hold all the electronics except the power supply itself, and I thought the lcd screen would mount on the front panel. As you see in this picture, it was just a tiny bit too tall, because of the circuit board it was mounted on. Because it is a multilayer board, I do not want to cut any off, as there could be hidden circuitry that I would mess up.

Mounting it in the top looks like it will work well enough, so that is what it will be.

I do not have a cnc router. I do have a Dremel tool with routing bits, but my son was sleeping and I did not want to wake him, so I used a hand coping saw to cut out the main part of the hole. I made it too small intentionally and then trimmed it out slowly and carefully until the lcd fit in the hole. (Using a razor-sharp pocket knife as a draw-knife.)



Starting on the wiring. Since the RAMPS board has mostly male pins to plug to, I need some female plugs on all the motor wires, switches and thermisters...

I have some of the female strips which I'll make sockets out of.

I used a small cut-off wheel on my Dremel to cut off the four pin strip, then I soldered it

and afterwards, heated the heat-shrink tubing.

Getting them done slowly.

The build is starting to look like it will soon be a real machine.

While lacing the cable & wires to the frame, I check that they are loose enough to not bind

when the machine is running back and forth.

and running the carriage to the other end...

X carriage is down to where it could hit the table, so that is the

longest the wires will need to be.

I finally received the kapton tape in the mail, so that is no longer holding me up.

Trying to get the kapton on the table evenly is not so easy.  While I *could* take them

up and try again, I think they will be good enough. 

I also used kapton tape on the underside of the build-table. (Sorry, I forgot to snap a picture before I mounted the table, but you get the idea, anyway.)

All right, now I need to mount end-stop switches on the X, Y and Z axes. I debated for a while whether to use optical switches or the physical type. I decided to use these mechanical micro-switches.

Here I have two mounted and attached wires. The glue needed a bit longer to dry on one of them.

When these are ready, I will get them mounted them on the machine.

     ———    About the Power Supply     ———

I decided the easiest way to power my replicating machine was with a commonly available computer power unit.  This one cost me $3.00 (but they charged $10+ for postage, so $13+ total.)

Computer power supplies (or PSUs) have a LOT of extra wires you will not need.

I snipped off all the orange wires, since I do not think I will need 3.3 volts. (I could use 3.3 V on the SD card circuit, but it will get its power from the RAMPS board.)

I cut off MOST but not all of the Red, Black and Yellow wires. Even though these are voltages I will need, I do not need that many wires getting in my way.

This is what I ended up with. I may actually clip off the Blue wire (minus 12V) and the extra red wire I saved, if I do not feel I need them.
[ I could always solder new ones back on later, if I decided to add something else that needs them. ]

I will put a small toggle switch in the electronics control box to manually turn on the 12 V. power in the PSU. I will connect the green wire from the PSU to one side of the switch and one of the black ground wires to the other side.

I also should mention the need for a load on the 5 volt line. I am using a small 12V light bulb on the "5 volt" line. It only glows, but it gives enough load to stabilise the power supply voltages. (Without any load, the "5V line" reads ~5.4 V and the 12V line reads about 11.4 to 11.6; adding the small lamp/light bulb brings the "5V line" actual down to 5.1V and the "12V line" up to 11.9V actual.) They recommend a 10Ω-10W resistor on some pages, but 10Ω across 5 volts gives only V² / R   or   5 x 5 / 10  or 2.5 Watts. Anyway, I do not happen to have a resistor in that range, so I will use the lamp instead. Lighting to a dull glow, it should last indefinitely as a ballast resistor.

As an example, I am laying out the parts that will reside in the electronics case. I did forget the SD socket circuit board which will hook to the AUX-3 socket. (Notice that I refrained from saying that it "needs to" hook there, since it could actually hook to any free pins as long as you go into the firmware programming (like in pins.h) and redefine which pins are used for MOSI, MISO, (and so on). These are already set up to appear as AUX-3 on the RAMPS board, so that is the easiest way to hook it up. I was thinking that just as I am doing with the LCD screen, I would hook a short piece of cable from that AUX-3 port to the SD board, so I could mount it somewhere accessible, (like the front panel). May not be necessary, though, since the memory card will probably be plugged in all or most of the time, anyway.

I double-check my wiring on the power supply to which I added a lamp as a continuous load to stabilize it, and that the modified power-supply is now putting out the correct voltages. 

Time to hook up the power to the electronics package, (which is to say the Arduino Mega2560 plugged up to the RAMPS (Pololu) driver board, the 20 x 4 LCD screen and the rotary encoder switch being used as a menu selector switch.

Then I nervously prepare to turn it on...  Did I get all the wiring right?  Are any wires touching each other that should not be? This being over half of my investment (more than $150 worth), I am perhaps understandably nervous as I flip the little power switch................

Mind you that this is only the electronics package. I have not yet plugged in the machine parts. (Motors, end-stop switches, heaters, & thermisters) 

Now that the electronics are working, I need to check that the rotary switch is picked up by the Marlin program and I can step through the various menus.

Time to carry the electronics back to the library (where the machine itself is being built) and plug in the parts that are mounted to the machine frame. (Again, that will be the 5 stepper motors, 6 end-stop switches, 2 heaters, & 2 thermisters.)

I trim up the bundle of wires with cable ties. 

Ok, this looks pretty good. Now to hook up the wires, but it does not quite work out. Some of these need rearranged, so...

I have to cut away all the nice cable ties...

I think I have the wires where they should be, but did I get all the settings right in the configuration.h, pins.h, etc.?


I hooked up the electronics box to the electro-mechanical part of the machine. Powering on, I used the control box to tell it to "home" all axes. I got a loud, "BR-R-R-R-R-R-R-R-T", but the motors did not move. "Och, so what is up with that?" I asks mese'f.

I double-check the RAMPS layout, (example: http://reprap.org/wiki/File:Rampswire13.svg ) and it shows the wires from the motors direct pin for pin, colour for colour, to the RAMPS board. That is how I put it...

Since the motors were not running, I got out an ohmmeter and checked the coils. Wires #1 and #3 are one coil and #2 and #4 are the other. [That would be a pattern like, 1a, 2a, 1b, 2b (or 2b, 1b, 2a, 1a, if you turn the plug around) but it says on the RAMPS board the wires should be: 2b, 2a, 1a, 1b.]  Looks like the drawing did not agree with my machine. I flopped the two middle wires, to set it straight, but it still did nothing. Considering that the coils could be fighting each other, I reversed the wires for one of the coils.


It worked, three times in a row,

 –but then, oddly enough, without having changed anything, the fourth time I turned it on, it failed again. Sounds like a loose connection. However, after double checking all connections, it is still not working...   Grrrrr.  Ok, time to leave it for a bit, and go back to it later. It did work, meaning the wiring is now "correct". Just have to search out that loose connection or whatever it  is........—but later.



I checked for bad connections and found none. Next step, I decided to break out the oscilloscope and check to see if the proper (pwm) signal was coming to the motors.

Results? It is not. I see only 12 volts DC on the motor leads, which would explain why they lock up solid when I tell it to home the motors. Could something have gone out? The arduino not sending the signal, the RAMPS board or ALL the Pololu drivers burned out??

(I never found the drivers getting hot at any time since the first application of power, so I doubt that it's the drivers.)

What is the most logical? —that it is the software (the Marlin "firmware" that is). Perhaps something is wrong in the configuration that I did not notice? If it worked earlier and not now, perhaps Marlin is looking for a certain condition that it is no longer seeing. (I checked the continuity through the thermisters and they are fine.)

I have been working with the control box located at the machine itself, as I do not have a cable (nor RF) connecting the computer to the machine. Guess I need to wire up a connecting cable that is about 14(+) meters long; (glad my room is not clear at the front of the house). I have seen USB cables for sale that are 20 feet long, but they tend to be more expensive, and I need a 50 foot one. Basically, I need a multi-wire shielded cable that I do not have. Guess I will try CAT-5 cable with half the wires used as a ground shield.

Update on that: I made my 50 foot long USB cable by splicing in a long piece of CAT-5 cable.

      GROUND (white-blue) — WHITE-WIRE (blue-white)

 — GROUND (white-orange) — RED-WIRE (orange-white)

 — GROUND (white-green) — GREEN-WIRE (green-white)

 — GROUND (white-brown) — BLACK-WIRE (brown-white)

It works fine at 115200 baud. I tried it at 250000 and it worked partially, but with some errors, so I put it back to 115200. If you make one, just be sure you use plenty of tape or shrink-wrap tubing to keep the wire connections from touching.

Now if I could get it installed on the computer I decided to dedicate to the 3D printer, but Pronterface does not appear to like running on that XP machine.

After a lot of hassle, I finally got the XP machine to run arduino.exe (0023) and Pronterface.exe (precompiled version).

I have my thermister problem fixed. The bed reads an ambient temperature in that room of ~21°C, while the extruder head temperature shows between 21° and 22°C, so there is maybe 1/2 degree difference. (Not a big error)

I have been having trouble getting the extruder heater to come on. I checked continuity and that was fine. The LED was not coming on, on the RAMPS board, like there was no signal from the Arduino board. I tried several things and still nothing, so finally I got out my oscilloscope and started looking for the signal. Inconclusive results, so I decided to try a test program to isolate what the problem might be. I was busily testing when suddenly...

 —  —  — —  —  — B A N G ! ! ! —  —  — —  —  —

The "D10" MOSFET power transistor suddenly blew up with a loud bang, accompanied by a bright flash. WTH??? I did not realise it till later, but the power supply also died in that "explosion". 

I began checking the RAMPS board to see if any thing burned out besides the transistor itself. Following the traces, they seemed to still connect, but where they connected to was the problem. It did not take long to realise they had plugged the mosfet in backwards...!

How they are supposed to be mounted: http://reprap.org/mediawiki/images/c/c3/RAMPS1-3_6pos.JPG 

How mine came (same photo I took shortly after receiving the RAMPS board):


After checking the reprap.org webpage to be certain which way they were supposed to be, I found that was the problem, not just with mine, but probably with all the boards that company has sold. Their advertisement photo shows the D9 and D10 mosfets mounted backwards:



I bought mine from there, the preassembled version for $88.80 and in fact the same board is being sold under more company names appearing here:


All the top seven pages on that list include the board with the transistors mounted reversed and according to their sales claims, there are a couple hundred people out there who are quite unhappy. I can only hope they figured out the problem, rather than giving up on a dream of having their own 3D printer.

     Ok, back to the build and my latest problems. As I mentioned, the power supply went dead as well as the D10 mosfet, so I replaced the mosfets with IRFZ44Ns and searched around the house for a power supply that would handle the load of multiple heaters and running stepper motors at the same time. I came up with a power supply out of an old server, which has plenty of punch.


Now that I have power and the mosfets are replaced, let us see if the rest of the machine still works and if the heater is now functional.

Ok, notice in the lcd window that the machine is trying to do a "dry run" of a shape labeled "RobWheel.g" and has been running it for 12 minutes with the bed and extruder both up to temperature. When I actually start melting/extruding PLA, I may need a little more extruder heat, as the default for PLA is 185°C. I do not see a problem. The extruder head got up to full temperature in only a minute or two. The bed heater is slower, as the same amount of current is spread out on the table with 8 resistors in a series-paralell pattern that gives the same resistance as the head (2.8Ω). It gives about 51.4 watts concentrated in the head which has a layer of ceramic insulation, or the same 51.4 watts spread out over the whole bed which is a large, flat piece of metal that can radiate heat away easily. Anyway, you can see by this that the 3D printer is working much better now and should be ready for a real test fairly soon.
My test did not work out well, so here is an interlude on
"What to do with a 3D printer when it is NOT 3D printing..."

I have decided to leave the configuration.h file here for other's future reference.

In looking at the configuration, remember that my machine uses mechanical micro-switches across signal and ground leads, so I need the pullup resistors. Also I have my X-axis home to my right as I look at the front of the machine, and the Y-axis comes forward for its home position. The Z-axis gave me some minor problems, but I now have it zero at a paper's thickness above the table.

 I have calibrated each of the X, Y and Z axes, so when I tell it to move 33.2 mm, it moves exactly 33.2 mm. (That number picked at random, meaning I calibrated the accuracy of movement for each axis.)

I also ran the PID "autotune" calibration on both the extruder and bed heaters and plugged those numbers into my configuration.h file. (So far I have PID enabled only for the head.)

I believe I am ready to try a test-print tomorrow. Tired of it tonight; will hit it again tomorrow. :-) Oh, and I tried storing programs to the SD card. That worked as well.

Latest addition: Ok, since I made the new hot-end and still had problems with the plastic not extruding, I found that a piece on the extruder was broken. Since it was in a position I did not normally see it, I suspect it was broken for some time.

Ossipee made me a new replacement part, but while waiting, I had time to try repairing the broken one. I drilled down through the thicker parts and wrapped the broken "ears" with welding wire.  I also took (jinx's) suggestion and melted some extra plastic over the repair job to add strength to it, and I got the machine to run even before the replacement part arrived. By the way, ossipee would not take payment for his help, so if anyone gets the chance to do something nice for him...  ;-)

Maybe this picture shows the repair better...

And the printer decided to actually try printing now.

(Movies have been added)


And showing how well the size matches the plan:

Now let's see about another piece:

And here is the finished piece:

//  I think this is a "mostly up-to-date" configuration.h file.



// This configurtion file contains MY settings.
// Advanced settings can be found in Configuration_adv.h
// BASIC SETTINGS: select your board type, temperature sensor type, axis scaling, and endstop configuration

// User specified version info of this build to display in [Pronterface, etc] terminal window during startup.
// Implementation of an idea by Prof Braino to inform user that any changes made
// to this build by the user have been successfully uploaded into firmware.
#define STRING_VERSION_CONFIG_H __DATE__ " " __TIME__ // build date and time
#define STRING_CONFIG_H_AUTHOR "(none, default config)" //Who made the changes.  NDRR, Erik, & DanM

// SERIAL_PORT selects which serial port should be used for communication with the host.
// This allows the connection of wireless adapters (for instance) to non-default port pins.
// Serial port 0 is still used by the Arduino bootloader regardless of this setting.
#define SERIAL_PORT 0

// This determines the communication speed of the printer
//  #define BAUDRATE 250000
#define BAUDRATE 115200

// The following define selects which electronics board you have. Please choose the one that matches your setup
// 10 = Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics"
// 11 = Gen7 v1.1, v1.2 = 11
// 12 = Gen7 v1.3
// 13 = Gen7 v1.4
// 3  = MEGA/RAMPS up to 1.2 = 3
// 33 = RAMPS 1.3 or 1.4 (Power outputs: Extruder, Bed, Fan)
// 34 = RAMPS 1.3 or 1.4 (Power outputs: Extruder0, Extruder1, Bed)
// 4  = Duemilanove w/ ATMega328P pin assignment
// 5  = Gen6
// 51 = Gen6 deluxe
// 6  = Sanguinololu < 1.2
// 62 = Sanguinololu 1.2 and above
// 63 = Melzi
// 7  = Ultimaker
// 71 = Ultimaker (Older electronics. Pre 1.5.4. This is rare)
// 8  = Teensylu
// 9  = Gen3+
// 70 = Megatronics
// 90 = Alpha OMCA board
// 91 = Final OMCA board
// 301 = Rambo

#define MOTHERBOARD 33


//=============================Thermal Settings  ============================
//--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table
//// Temperature sensor settings:
// -2 is thermocouple with MAX6675 (only for sensor 0)
// -1 is thermocouple with AD595
// 0 is not used
// 1 is 100k thermistor - best choice for EPCOS 100k (4.7k pullup)  << This is the one I have
// 2 is 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup)
// 3 is mendel-parts thermistor (4.7k pullup)
// 4 is 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !!
// 5 is 100K thermistor - ATC Semitec 104GT-2 (Used in ParCan) (4.7k pullup)
// 6 is 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup)
// 7 is 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup)
//    1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k
//                          (but gives greater accuracy and more stable PID)
// 51 is 100k thermistor - EPCOS (1k pullup)
// 52 is 200k thermistor - ATC Semitec 204GT-2 (1k pullup)
// 55 is 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan) (1k pullup)

#define TEMP_SENSOR_0 1
// #define TEMP_SENSOR_1 0
// #define TEMP_SENSOR_2 0

// Actual temperature must be close to target for this long before M109 returns success
#define TEMP_RESIDENCY_TIME 5 // (seconds)
#define TEMP_HYSTERESIS 3       // (degC) range of +/- temperatures considered "close" to the target one
#define TEMP_WINDOW     1       // (degC) Window around target to start the recidency timer x degC early.

// The minimal temperature defines the temperature below which the heater will not be enabled It is used
// to check that the wiring to the thermistor is not broken.
// Otherwise this would lead to the heater being powered on all the time.
#define HEATER_0_MINTEMP 5
// #define HEATER_1_MINTEMP 5
// #define HEATER_2_MINTEMP 5
#define BED_MINTEMP 5

// When temperature exceeds max temp, your heater will be switched off.
// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure!
// You should use MINTEMP for thermistor short/failure protection.
#define HEATER_0_MAXTEMP 235
// #define HEATER_1_MAXTEMP 235
// #define HEATER_2_MAXTEMP 235
#define BED_MAXTEMP 75 // Would need raised to extrude ABS. For now I'm only doing PLA.

// If your bed has low resistance e.g. .6 ohm and throws the fuse (Mine does not) you can duty cycle it to reduce
// the average current. The value should be an integer and the heat bed will be turned on for 1 interval of

// PID settings:
// Comment the following line to disable PID and enable bang-bang.
#define PIDTEMP
#define PID_MAX 255 // limits current to nozzle; 255=full current
#ifdef PIDTEMP
// #define PID_DEBUG // Sends debug data to the serial port.
// #define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
#define PID_INTEGRAL_DRIVE_MAX 255  //limit for the integral term
#define K1 0.95 //smoothing factor withing the PID
#define PID_dT ((16.0 * 8.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the (...of the WHAT?)

// If you are using a preconfigured hotend then you can use one of the value sets by uncommenting it
// Ultimaker
    #define  DEFAULT_Kp 22.2
    #define  DEFAULT_Ki 1.08  
    #define  DEFAULT_Kd 114 

// Makergear
//    #define  DEFAULT_Kp 7.0
//    #define  DEFAULT_Ki 0.1 
//    #define  DEFAULT_Kd 12 

// Mendel Parts V9 on 12V   
//    #define  DEFAULT_Kp 63.0
//    #define  DEFAULT_Ki 2.25
//    #define  DEFAULT_Kd 440

// Measured on my machine using M303 "autotune"
// With the new heat chamber, it was close to Ultimaker numbers.
//#define DEFAULT_Kp 105.53
//#define DEFAULT_Ki 7.78
//#define DEFAULT_Kd 357.89

#endif // PIDTEMP

// Bed Temperature Control
// Select PID or bang-bang with PIDTEMPBED.  If bang-bang, BED_LIMIT_SWITCHING will enable hysteresis
//  (by this they mean on-off switching but with over-shoot.)
// uncomment this to enable PID on the bed.   It uses the same ferquency PWM as the extruder.
// If your PID_dT above is the default, and correct for your hardware/configuration, that means 7.689Hz,
// which is fine for driving a square wave into a resistive load and does not significantly impact you FET heating.
// This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W heater.
// If your configuration is significantly different than this and you don't understand the issues involved, you proabaly
// shouldn't use bed PID until someone else verifies your hardware works.
// If this is enabled, find your own PID constants below.
// #define PIDTEMPBED  //  NOTICE I have this commented out.

// This sets the max power delived to the bed, and replaces the HEATER_BED_DUTY_CYCLE_DIVIDER option.
// all forms of bed control obey this (PID, bang-bang, bang-bang with hysteresis)
// setting this to anything other than 255 enables a form of PWM to the bed just like HEATER_BED_DUTY_CYCLE_DIVIDER did,
// so you shouldn't use it unless you are OK with PWM on your bed.  (see the comment on enabling PIDTEMPBED)
#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current

//120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
//from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, argressive factor of .15 (vs .1, 1, 10)
//  #define  DEFAULT_bedKp 10.00
//  #define  DEFAULT_bedKi .023
//  #define  DEFAULT_bedKd 305.4

//120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
//from pidautotune
//    #define  DEFAULT_bedKp 97.1
//    #define  DEFAULT_bedKi 1.41
//    #define  DEFAULT_bedKd 1675.16

// FIND YOUR OWN: "M303 E-1 C8 S60" to run autotune on the bed at 90°C for 8 cycles.
// The autotune for my bed came back as:
#define  DEFAULT_bedKp 7.88
#define  DEFAULT_bedKi .07
#define  DEFAULT_bedKd 220.98

#endif // PIDTEMPBED


// this prevents dangerous Extruder moves, i.e. if the temperature is under the limit
// can be software-disabled for whatever purposes by
// if PREVENT_DANGEROUS_EXTRUDE is on, you can still disable (uncomment) very long bits of extrusion separately.

#define EXTRUDE_MAXLENGTH (X_MAX_LENGTH+Y_MAX_LENGTH) //prevent extrusion of very large distances.

//=============================Mechanical Settings===========================

// Uncomment the following line to enable CoreXY kinematics. (I may try this out later.)
// #define COREXY

// cores Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins (which I do).

// fine Endstop settings: Individual Pullups. will be ignord if ENDSTOPPULLUPS is defined
#ifdef ENDSTOPPULLUPS // Not so sure these seem correct...? (Same as set above)

// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
const bool X_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
const bool Y_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.

// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
#define X_ENABLE_ON 0
#define Y_ENABLE_ON 0
#define Z_ENABLE_ON 0
#define E_ENABLE_ON 0 // For all extruders

// Disables axis when it's not being used.
#define DISABLE_X false
#define DISABLE_Y false
#define DISABLE_Z false
#define DISABLE_E false // For all extruders

#define INVERT_X_DIR true    // for Mendel set to false, for Orca set to true
#define INVERT_Y_DIR true    // for Mendel set to true, for Orca set to false
#define INVERT_Z_DIR false     // for Mendel set to false, for Orca set to true
#define INVERT_E0_DIR false   // for direct drive extruder v9 set to true, for geared extruder set to false
// #define INVERT_E1_DIR false    // for direct drive extruder v9 set to true, for geared extruder set to false
// #define INVERT_E2_DIR false   // for direct drive extruder v9 set to true, for geared extruder set to false

// Sets direction of endstops when homing; 1=MAX, -1=MIN
#define X_HOME_DIR -1
#define Y_HOME_DIR -1 // I have this one reversed, but did it by physically swapping the plugs at the RAMPS board.
#define Z_HOME_DIR -1

#define min_software_endstops true //If true, axis won't move to coordinates less than HOME_POS.
#define max_software_endstops true  //If true, axis won't move to coordinates greater than the defined lengths below.

// Travel limits after homing
#define X_MAX_POS 267
#define X_MIN_POS 0
#define Y_MAX_POS 226
#define Y_MIN_POS 0
#define Z_MAX_POS 100
#define Z_MIN_POS 0


// The position of the homing switches
// #define MANUAL_HOME_POSITIONS  // If defined, manualy programed locations will be used
// #define BED_CENTER_AT_0_0  // If defined the center of the bed is defined as (0,0)

// Manual homing switch locations:

#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
#define HOMING_FEEDRATE {50*60, 50*60, 5*60, 0}  // set the homing speeds (mm/min)

// default settings

#define DEFAULT_AXIS_STEPS_PER_UNIT   {76.19,76.55,2012.52,564}  // E-axis 6.8mm idameter / 3200 steps w/ motor gear=11 teeth; filament gear=39 teeth
// X and Y are calculated by dividing 3200 steps by [ T2.5 belt and 15 tooth count making (2.5 * 15) mm/ one turn ] 37.5 mm/turn
//  ...but required adjustments on both axes.
// Z axis is 3200 steps per rev. div. by distance between threads [ 1/16th inch = 1.5875 mm ] => 2015.748 [/corr.factor (1.01219)]
#define DEFAULT_MAX_FEEDRATE          {500, 500, 25, 45}    // (mm/sec)   
#define DEFAULT_MAX_ACCELERATION      {2000,2000,200,1000}    // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot.

#define DEFAULT_ACCELERATION          1000    // X, Y, Z and E max acceleration in mm/s^2 for printing moves
#define DEFAULT_RETRACT_ACCELERATION  1000   // X, Y, Z and E max acceleration in mm/s^2 for r retracts

#define DEFAULT_XYJERK                10.0    // (mm/sec) was 20 previously
#define DEFAULT_ZJERK                 0.4     // (mm/sec)
#define DEFAULT_EJERK                 5.0    // (mm/sec)

//=============================Additional Features===========================

// the microcontroller can store settings in the EEPROM, e.g. max velocity...
// M500 - stores paramters in EEPROM
// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). 
// M502 - reverts to the default "factory settings".  You still need to store them in EEPROM afterwards if you want to.
//define this to enable eeprom support
//to disable EEPROM Serial responses and decrease program space by ~1700 byte: comment this out:
// please keep turned on if you can.

//LCD and SD support
//#define ULTRA_LCD  //general lcd support, also 16x2
//#define SDSUPPORT // Enable SD Card Support in Hardware Console

//#define ULTIMAKERCONTROLLER //as available from the ultimaker online store.
//#define ULTIPANEL  //the ultipanel as on thingiverse

// The RepRapDiscount Smart Controller
// http://reprap.org/wiki/RepRapDiscount_Smart_Controller
#define REPRAP_DISCOUNT_SMART_CONTROLLER //Who says $54 to $56 is a DISCOUNT ?????  (But that's what I have.)

//automatic expansion
#define NEWPANEL

// Preheat Constants
#define PLA_PREHEAT_FAN_SPEED 255  // Insert Value between 0 and 255

#define ABS_PREHEAT_HOTEND_TEMP 230 // or was it 240°C ??
#define ABS_PREHEAT_HPB_TEMP 75     // orig = 100 // or 90°C ?
#define ABS_PREHEAT_FAN_SPEED 255   // Insert Value between 0 and 255

#define NEWPANEL  //enable this if you have a click-encoder panel... (which is what I have...)
#define ULTRA_LCD
#define LCD_WIDTH 20
#define LCD_HEIGHT 4

#else //no panel but just lcd
#ifdef ULTRA_LCD
#define LCD_WIDTH 16
#define LCD_HEIGHT 2   

// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino
//#define FAST_PWM_FAN

// Adding a camera
// M240  Triggers a camera by emulating a Canon RC-1 Remote
// Data from: http://www.doc-diy.net/photo/rc-1_hacked/
// #define PHOTOGRAPH_PIN     23

// SF send wrong arc g-codes when using Arc Point as fillet procedure
//#define SF_ARC_FIX

#include "Configuration_adv.h"
#include "thermistortables.h"


Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Ah, Thanks. I am really hopeful at this point. Seems to be shaping up with not too many problems.

I have yet to obtain the lower and upper plates for the Y-table. At least I have the screws and springs...  ha ha

I also have yet to build my hot-end assembly. I have some MIG welding tips on order, with 0.023" IDs (that's .58 mm, but if it is too big it won't take much to squish 'em down a bit. (copper alloy tips)

—and I can always save them for my welder (even though I've not used wire that small before. Always run .035" wire.)


Double the bearings on x and y where the belt drives on. So instead of having one where the motor mount is on Y put two side by side.

This way your belt will have enough room to play and it's not going to grind against the washers.

While at it you can also twist the belts on the side where they ride on the bearings so the teeth do not induce vibrations riding on the bearings.

And last do not tighten anything untill you have everything into place, once done find a flat surface and alingn the frame. Then tighten it.

The width of the belt I have is only half the width of the gap between the "fender" washers already, so it should not drag. If it did, I could always adjust the bearing left or right as needed.

Oh, and I have not really tightened anything yet. They are "finger tight".

I will watch for that belt vibration you mentioned and keep that in mind.


I have to say im impressed ...

But Im wondering how you hold back to take pictures and not make it right away,I couldnt hold back even though i took couple of every stage.

Photography is another hobby I've had for a long time. I take time out for it.

Unless I am completely mistaken, the Y axis motor mount is printed such that you don't need the bearing right in front. You would still need the one opposite, but, the one on this side 'should not' be required. Also, you could take out the second set of nuts on your top bars that sit between the motor mounts and the top connection points.

One last note, the bushing seats for the Y axis are admittedly not pretty. My friend just glued them to his Y axis table too.

The pictures I just posted with the carpenter's square in them, shows I took both nuts out from between frame and motors on the top rails.

Yes, I already did take out those extra nuts on the top bars. I found that the x-axis motor and idler were too far apart and making it questionable whether I would have enough drive belt. :-) As to the extra bearing, I will leave it. It looked like the belt might drag on the bar otherwise and I have several extra 3/8" ball bearings, (bought a lot of ten) so no problem there.


Yea Dan good documenting!  

I think this is the best-documented build of a 3DP I've seen. I'm excited for you!