How to 3D print peel-able supportive raft/base/platform with slic3r

First of all, let’s check out how easy and sweet it is to remove the supportive raft from your 3D print. All you need to do is just to follow my instructions in the rest of this blog!

The reason to print a supportive raft or base underneath your 3D model is obvious: the base absorbs any imperfections of your build plate; and if curling has to happen, it only affects the base, will not infect your model, so that your model bottom could retain flat. The raft, however, is not easy to come off if they are print in the same way as the real part. It is really a dilemma in which you hope your raft to be sticky enough to hold your model from corner-lifting, while at the same time, you don’t want your raft to stick too much to come off. Is it possible to achieve this if we use the same material printing with the same mechanism?  The answer is yes, or at least, there is one product available on the market doing this just well — the UP! 3D Printer, famous for printing peel-able supportive raft/base.

Unfortunately, the UP!3D is not part of the open source RepRap community, which means the algorithm behind their famous peel-able base remains mysterious. Taking a closer look at the UP! 3D printer, I didn’t find anything special about the hardware — Nozzle, 3 DOF axis, HBP — pretty much every basic element you would expect on a 3D printer. So the key stays in the software, the slicer. Since the latest version 0.9.9 of open-source slic3r included a new feature of “Raft“, I decided to give it a try to see if it reproduces the same peel-able raft on my Type A Machine Series 1. I believe if my algorithm works, you should also be able to do the same thing on any other printers.

3D Print Raft

Figure 1. Visualization on Repetier-Host of print raft (left), without raft (middle), and real print from UP!3D with raft.

This photo makes me really excited! For the first time, the Slic3r is producing a similar raft to the UP!3D. My question is whether the raft could be peeled or removed easily. I went ahead printing this part and here is the result.

Raft_No_Removable_EN

Figure 2. A big piece of the raft remains on my print. It sticks very tightly to the bottom of my part and couldn’t be removed. So my conclusion for the new feature of 0.9.9 is NO, the raft is not peel-able.

Let’s first take a look at the g-code generated by the new Slic3r to find out what exactly the “raft” is. I recommend using Repetier-Host to visualize the g-code as you can view your model layer by layer, which provides a very straightforward way of examining the output from Slic3r. I am slicing my test model, which is a 1.75″ x 1.75″ x 0.2″ plate, at 0.2mm layer height resolution with 49 extra raft layers. Here is what I saw from Repetier-Host (Used photoshop for better analysis).

3D Print Gcode Analysis

Figure 3. As you can see, there are 1 layer of brim and 49 layers of supportive raft print below the real part. The top 3 layers of raft are set to print solid, also called “Interface layers” by Slic3r. The very top interface layer is only 0.129mm away from the the layer underneath, rather than 0.2mm. The interesting thing is the extra middle layer between the whole raft and the real part,marked as “separator layer” in the image. It is automatically generated by Slic3r, about 0.321mm away from the very top interface layer. It seems that Slic3r wants to make a very solid raft top by printing top 2 interface layers close together, and an easy peel-able upper part by printing the extra middle layer and everything on top of it a little bit far away.

This is a good idea! As we know, 3D print is basically stuck together one on top of another layer. Printing two layers closer together makes the binding stronger, and vice versa. But unfortunately, it doesn’t seem to work out completely, as Figure 2 shows that only part of the raft is removed, others stay very tightly on the bottom of the model. So, I tried to increased the upper model (including the separator layer) a little far away from the base by another 0.1mm. And also, since the nozzle temperature also affects the filament binding effect, printing the separator layer under 200°C rather than 235°C help reduce the material stickiness. Slic3r, however, doesn’t seem to support my idea at this point, I ended up writing my own codes to post-modify (increase gap, lower temperature) the g-code generated by Slic3r. For temperature change, I use:

M109 S200    ; Sets target temperature and waits until temperature is reached. 
M109 S235

It takes the nozzle about 1 minute to cool down to 200°C and pretty much the same amount of time to rise back to 235°C. I observed a small amount of filament flows out of the nozzle during the waiting, and inserted some codes to raised the nozzle 2-3 inches above the print for the purpose of easy cleaning.

Increase Distance Raft Model Change Nozzle Temperature

Figure 4. The seam (left) between the model and raft has been increased to 0.4mm, wide enough to be visible in Repetier-Host. The line in cyan on the right is the nozzle travel. Here is the video of how the customized code is in action on my Type A Machine.

And here are some results!

Peel-able_3D_Print_Raft

Figure 5. Now the 3D print raft is peel-able with improved Slic3r. Hope Slic3r will soon include this feature into their upcoming version!

21 Replies to “How to 3D print peel-able supportive raft/base/platform with slic3r”

  1. When I watch videos of the UP printer it looks like the top of the support is solid and flat. This reminds me of the way I used to do rafts. I made the top layer of the raft almost solid and raised the bottom layer of the object a little to make it peel-able. Indeed support is just the same as a raft, it is just that it is elevated. To test the theory I hacked my host software to load a separate file for the support so that it could be sliced as a normal object and so have a solid top. It also has a solid base of course, which is another advantage over Skeinforge’s sparse support as that can easily become detached from the bed.

  2. How did u increase the gap to 0.4 ? did u increase the rest of the code by the same amount ? if so, how ?

    Thanks

    1. I wrote python code to do this. If you take a look at the g-code, you will find out that g-codes are generated in patterns. What your python does is to look for those patterns and locate the g-codes for each printing layer. For example:

      G92 E0
      G1 X168.690 Y123.313 F15000.000
      G1 Z0.350

      This is a typical starting pattern for a printing layer. Z0.35 is the height of the layer, so simply replace this number with your own (0.4 in my case) and then add the same amount of increment to the reset of its upper layers.

  3. Hello,
    I am really impressed by the work you made. You really helped me.
    this summer i had the chance to work with the up! Printer. It was the cheapest 3d printer available at the office, but it was deffinitely unbitable for its support.
    Like you, i experimented a lot to reproduce it on other printers, i ended up with the same conclusion as you (interface layer temperature, but my lack of skills in programation made me give up).
    In some sort you made my dream. And it works !
    But while reading your article, i was remembering this up! And if i am right, the up! Doesnt make a break between support and object.
    Instead, the draft was printed in a strange zig zagging shape and super fast like if there was some kind of overflow when you press your toothpaste tube so hard.
    From this observation, i wonder if the up! Secret is based on this overflow. The plastic extruded so fast that it becomes less sticky. The zigzag shape could also help removing it.
    This method would maybe be a great improvement for non flat bottom shapes.
    Please let me know if you plan to experiment it ! Thank you so much

  4. Awesome post!

    I’m new to 3D printing and have been struggling to edit the gcodes in order to get the rafts off nicely. Can you please give a little bit more detail on where to insert:

    M109 S200 ; Sets target temperature and waits until temperature is reached.
    M109 S235

    and how to apply your python code?

    Thank you in advance.

    1. Hi Mike

      For this specific two line of codes, I basically search for the ending of a previous layer. You can easily find it when gcode is trying to move along z-axis.

      Using python to process gcodes is quite straight forward. You basically read in gcodes line by line into an array and insert new codes wherever you need. After you are done with your modification, simply output you array into an text file and rename it into *.gcode.

  5. From my experience (using 3D Up printer) – you can just increase the distance between dense interface layer and print with the same speed and temperature (and the speed became even a bit slower, when 3D Up printing first model layer on the top of support interface layer). The extruded filament is cyllinder, so when you increase the distance between extruder and layer the extruded filament remains it’s form (because it is not compressed by the extruder during extrusion and not sticked to previous layer) and its contact area with interface layer is significantly smaller than one for all other layers. Because of this the supports detaching much easier than other layers. Actually this trick is a bit complicated than just changing the distance, because it depends on: 1) extrusion speed, 2) print speed, 3) nozzle diameter, so you can get easily detachable layer with the same layer distance and with increased print speed. But in general – that’s it.

      1. With the same extrusion speed. Or decrease extrusion speed. I think this feature has been reached “apparently”, when someones try to learn all conditions of adhesion strength between printed layers and also paid attention to conditions when adhesion is “bad” 🙂

  6. I have a TAM series 1 2014 printer. do you think your code trick would work on the new software TAM uses (cura)? Also. could you post the whole gcode for the action? i have no idea how to write the code but would like to use it. Please and Thanks!

    1. Sure.

      This piece of code was written in python. It needs user input to properly perform the function.

      import os, sys
      
      def Print_Format():
          print "Usage: [path to input G-CODE file] [path to output G-CODE file]"
      
      if not len(sys.argv) == 3:
          Print_Format();
          exit()
      
      input_File_Name = sys.argv[1]
      gcode_File = open(input_File_Name)
      gcode_File_Lines = gcode_File.readlines()
      output_File_Name = sys.argv[2]
      
      print "Total " + str(len(gcode_File_Lines)) + " lines of gcode."
      
      layer_Counter = 0;
      new_Layer_Z_Coordinate = 0;
      old_Layer_Z_Coordinate = 0;
      layer_Z_Coordinates = []
      line_Indexes = []
      
      # Locate the staring points
      start_Line_Mark = "M82"
      i = 0;
      while True:
          if i < (len(gcode_File_Lines) - 2):
              if gcode_File_Lines[i].startswith(start_Line_Mark):
                  break
              else:
                  i = i + 1
      
      while True:
          if i < (len(gcode_File_Lines) - 2):
              # Search for pattern:
              # =======================
              # G92 E0
              # Whatever....
              # G1 Zx.xxxx
              # =======================
              if gcode_File_Lines[i] == "G92 E0\n" and gcode_File_Lines[i+2].startswith("G1 Z"):
                  new_Layer_Z_Coordinate = float(gcode_File_Lines[i+2][4:])
                  if new_Layer_Z_Coordinate != old_Layer_Z_Coordinate:
                      old_Layer_Z_Coordinate = new_Layer_Z_Coordinate
                      line_Indexes.append(i)
                      layer_Z_Coordinates.append(old_Layer_Z_Coordinate) 
                  i = i + 3
              elif gcode_File_Lines[i] == "G92 E0\n" and gcode_File_Lines[i+3].startswith("G1 Z"):
                  new_Layer_Z_Coordinate = float(gcode_File_Lines[i+3][4:])
                  if new_Layer_Z_Coordinate != old_Layer_Z_Coordinate:
                      old_Layer_Z_Coordinate = new_Layer_Z_Coordinate
                      line_Indexes.append(i)
                      layer_Z_Coordinates.append(old_Layer_Z_Coordinate) 
                  i = i + 4            
              else:
                  i = i + 1;
          else:
              break
      
      for layer_Index in range(0, len(line_Indexes)):
          print "Layer", str(layer_Index + 1), ": Z ", layer_Z_Coordinates[layer_Index], ", starting at line:", line_Indexes[layer_Index]
      
      raise_Layer_Index = raw_input("The layer you want to raise:[1~"+str(len(line_Indexes))+"]: ")
      raise_Layer_Index = int(raise_Layer_Index)
      
      raise_Height = raw_input("Distance you want to raise: ");
      raise_Height = float(raise_Height);
      
      is_To_Change_Temperature = raw_input("Do you want to lower temperature to 200 for bottom layer of part?[y or n]: ")
      if is_To_Change_Temperature == "y":
          is_To_Change_Temperature = True
      elif is_To_Change_Temperature == "n":
          is_To_Change_Temperature = False
      else:
          print "Please input y or n."
          exit()
      
      change_Lower_Temperature = "M109 S200"
      change_Normal_Temperature = "M109 S235"
      
      print "Raise", raise_Height ,"from layer", raise_Layer_Index, "and up."
      
      i = line_Indexes[raise_Layer_Index - 1];
      while True:
          if i < (len(gcode_File_Lines) - 2):
              # Search for pattern:
              # =======================
              # G92 E0
              # Whatever....
              # G1 Zx.xxxx
              # =======================
              if gcode_File_Lines[i] == "G92 E0\n" and gcode_File_Lines[i+2].startswith("G1 Z"):
                  # Modify working height
                  z = float(gcode_File_Lines[i+2][4:]) + raise_Height
                  gcode_File_Lines[i+2] = "G1 Z"+str(z)+"\n"
                  # Modify retract height if any
                  z = float(gcode_File_Lines[i-1][4:]) + raise_Height
                  gcode_File_Lines[i-1] = "G1 Z"+str(z)+"\n"
                  i = i + 3
              elif gcode_File_Lines[i] == "G92 E0\n" and gcode_File_Lines[i+3].startswith("G1 Z"):
                   # Modify working height
                  z = float(gcode_File_Lines[i+3][4:]) + raise_Height
                  gcode_File_Lines[i+3] = "G1 Z"+str(z)+"\n"
                  # Modify retract height if any
                  z = float(gcode_File_Lines[i-1][4:]) + raise_Height
                  gcode_File_Lines[i-1] = "G1 Z"+str(z)+"\n"
                  i = i + 4           
              else:
                  i = i + 1
          else:
              break
              
      
      modified_Gcode_File = open(output_File_Name, 'w')
      i = 0
      for i in range(0, len(gcode_File_Lines)):
          if is_To_Change_Temperature:
              if i == line_Indexes[raise_Layer_Index - 1]:
                  idle_Z = float(gcode_File_Lines[ i - 1 ][4:]) + 50
                  modified_Gcode_File.write("G1 Z" + str(idle_Z) + "\n")
                  modified_Gcode_File.write(change_Lower_Temperature + "\n")
              elif i == line_Indexes[raise_Layer_Index]:
                  idle_Z = float(gcode_File_Lines[ i - 1 ][4:]) + 50
                  modified_Gcode_File.write("G1 Z" + str(idle_Z) + "\n")
                  modified_Gcode_File.write(change_Normal_Temperature + "\n")
                  
          modified_Gcode_File.write(gcode_File_Lines[i])
      modified_Gcode_File.flush()
      
      1. Well, using slic3r I am unable to get a good peelable raft. Could you take a screenshot of your raft settings screen? Thanks!

  7. Wow — this is just what I’m looking for. Neat to see you’ve figured out a process. Thanks!

    As for the 49 layer raft — why 49 layers? Did you ever try it with less? If so, how did they turn out?

    1. It just happened to be 49 layers for the thickness of the raft I chose. It was generated by the slicing software. You definitely can do more or less if you need.

  8. Hello everyone 🙂 I’m rather new to 3d printing and I have a lot of questions on the matter, so I hope you will not get mad at me for asking here at least a few of them. I think before I’ll get seriously into sculpting I should focus on the software I’m going to use, and that’s what I would like to ask you about. Mainly, should I begin with the most crudest CAD I can find or would it be better to start on something more complicated? I’m worried that I’ll get some undesirable quirks while working on less complex software. My second question is about the program as well: should I search for software that would let me design and slice it in it, or should I use a separate program for each? Will it even make a difference? Surprisingly, I couldn’t find the answer to that, as it seems like most blogs and sites want to focus on the very basics (like what is 3d printing and so on), and while the answers to those questions are fine, it seems like no one wants to go into the details (it looks like some of them even plagiarise each other! I swear I’ve found the same answers to the same questions on at least 3 different blogs) but I’m getting off-topic… The last question is about 3d pens. Would it be possible to somehow convert whatever I draw with a 3d pen to a 3d model in a program? For example, if I’ll draw a cat with 3d pen, would it be possible to get its design in a software? I’m not sure how that could even work, but the very idea sounds interesting to me. Anyway, I think I’ll stop here just in case no one will ever answer me and all of this writing will go to waste. I apologise that I’m using your content to ask questions, but I hope you can relate and advice a beginner like me. Anyway, thank you for posting. I learned something from this and that’s always appreciated. Thank you, and I hope to hear back from you very soon 🙂

Leave a Reply to Dorethea Cabam Cancel reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.