Introduction: 3D Printing Lampshades With Full Control Gcode

Full Control Gcode is an open source tool created by Andy Gleadall, a lecturer at Loughborough University. It's a means of generating gcode without a need for an stl or slicer.

This means you can control everything the printer does - every movement, every setting, everything.

This is an amazing tool and can be used for all sorts of incredible applications and you should definitely check out the journal papers etc. here if you're interested in diving in a little deeper!

For now though, I wanted to try and show how it can be accessible and fun for us everyday makers as well! I'm not a mathematical genius by any stretch but with a little playing around and experimentation, I've managed to produce some stunning prints so wanted to share the process :)

Andy also made some tutorials so it's well worth checking those out if you'd like to understand a bit more about how it all works and how you might make your own designs from scratch but for this ible, I wanted to focus on setting up what essentially is a profile for your printer and then run through the lampshade demo, including how to customise the parameters and create the shape you want.

This can all look a little daunting and complicated at times, partly due to it currently being in the form of a spreadsheet (they are working on a web app though which is very exciting!) - I won't lie, it's probably not for complete beginners to 3D printing - I'd suggest getting to know your machine and your materials quite well before jumping down this rabbit hole but still don't be put off as it's so much fun and pretty simple to play around with once you're set up!

The lampshade demo is actually one of the more complex demos - if you'd like to do a little exploring beforehand or if you've already read through this ible and want to start with something a bit less full on, check out the parametric vase or ripple ramen demos as these have had a lot of formatting and notes added to make them easier to jump straight into!


  • Excel
  • Notepad (or other text editor)
  • Gcode Viewer - I use the one included with PrusaSlicer but any is fine or there are online tools too
  • 3D printer
  • Filament

Step 1: Download Full Control Gcode

First step is just to download Full Control - as mentioned we'll be using the lampshade demo here as it saves us a little work by having some parameters already set for us :)

Head over to this link and just click 'Download' and an excel file should download shortly after.

When you open the file (if you have trouble finding it, it's probably in your downloads folder!) you should see something that looks like the screenshot above.

You will likely need to click 'Enable Editing'

Then 'Enable Content'

Great! You're ready to start setting up your printer's profile!

Step 2: Setting Up Your Printer's Profile - Selecting a Preconfigured Profle

This step is how we tell FullControl the parameters of our printer - just as you would select your printer and set up/select a preset profile in a slicer, we have to do the same thing here!

To the right of the main sheet, you'll see a green box and several boxes of different colours (I'll be putting up screenshots of everything so check those out if you're struggling to find anything!)

  • Looking at the bottom 2 rows of the coloured boxes, see if your printer is already listed - for example, if you have an Ender 3, it is there in teal as I've highlighted in pic 1
  • If your printer is there, select all the coloured cells in that column and copy them (ctrl-c) - they should now have a dashed border like pic 2
    • If your printer isn't there - jump ahead a couple of steps to where I explain how to create a new profile - you may want to do this even if your printer is included but is heavily modified too!
  • Now, select the coloured cells in the green box (pic 3)
  • Finally, hit paste (ctrl-v) - the copied details should now have replaced those in the green box (pic 4)

You've now selected a preset profile - in the next step I'll show you what that actually means and how to double check all settings are correct and make any modifications you may need - this next step is kind of optional as the preset profiles are pretty good but it doesn't hurt to double check!

Step 3: Setting Up Your Printer's Profile - Modifying Preset Profiles

When we pasted the printer details into the green box in the last step, we set the startGCODE ID and endGCODE ID to be the name of the printer we're using - this then tells Full Control to look for that name in the startGCODE and endGCODE tabs so it can use the information there when generating the gcode.

We're now going to have a quick look at the startGCODE and endGCODE tabs. Along the bottom of the window you should see a series of tabs - we'll start by switching to the one called 'startGCODE'

You should find you're presented with something that looks like the first pic above - it might look a little overwhelming with lots of text overlapping but we don't need to worry about most of it!

In the very first row, scroll across until you find the name of your printer

I'll stick with the Ender 3 example but this will be the same process for all printers that are preconfigured in Full Control

First thing to do is just check there's nothing blatantly wrong!

Don't worry if you're not super familiar with gcode - I believe these profiles have been tested anyway but setups vary so it's always good to double check if you can!

  • You may need to stretch the column out a little so you can read what's in there - In pic 2 you can see I've highlighted the Ender 3 column which I've made much wider than the others!
  • Have a quick scroll through and just double check there's nothing obviously wrong in there e.g. for the Ender 3 I changed the MAXX and MAXY values to 230 (pic 3) as the Ender 3's bed size is actually a little larger than advertised! (If you use binder clips to hold your bed on, leave this at 220 though to avoid crashing into them)

Next, make any additions you want/need!

  • In my case, I was setting up an Ender 3 that I'd installed auto bed levelling on so I just needed to add an extra line to the start gcode as the preset profile doesn't have this included (pic 4)
  • In most cases, you won't need to add anything, but I wanted to show how simple it is if you do need to add to this for those who may have modified their printers and just need to add a command or two!

Once happy, repeat this process for the endGCODE tab too - in most cases the end Gcode should be fine already but if you know you need to change something or want your printer to shut down or beep or do anything special at the end of the print then you'll need to add that to the end Gcode in exactly the same way as we just modified the start Gcode.

Fab! You're all set and can skip the next 2 steps as they will just be detailing how to set up a profile for those whose printers aren't preconfigured!

Step 4: Setting Up Your Printer's Profile - Creating a New Profile (Main Sheet)

So, if your printer wasn't included already or if you've made a lot of modifications and don't think the preset will work for you, we need to start from scratch - sorry!

For the next couple of steps, I'll walk through how I set up my modified X5SA so you'll just need to sub in the right parameters etc. for your specific printer

It's worth mentioning that Andy has already made a video tutorial for setting up a new printer so if you prefer to follow a video, feel free to check that out! I'll be using a slightly different method that I personally found a bit easier but the best technique really is just whatever works for you :)

First thing we'll do is set your parameters in the main sheet

In the pale green box on the right, you'll need to set BedTemp, NozzleTemp, Feedstock Filament Diameter, ExtrusionUnits, StartGCODE ID and EndGCODE ID for your printer - I've highlighted my changes with a bright green background but bear in mind your values may not be the same as mine as they're determined by your printer's specs.

  • I'm planning to print in PETG so my bed and nozzle temps are 80 and 240 (consider 60 and 210 if you plan to print in PLA)
  • My printer uses 1.75mm filament and extrusion units of mm3
  • Finally, the StartGCODE ID and EndGCODE ID can be set to whatever you like but generally it makes sense to use the name of your printer model - I set it to X5SA

I also copied and pasted the same details alongside the other presets so that I can switch back and forth easily as I have several printers.

Once you're happy with that, we need to create the start and end Gcode but we'll do that in the next step!

Step 5: Setting Up Your Printer's Profile - Creating a New Profile (Start/End Gcode)

When we inserted the printer details into the green box in the last step, we set the startGCODE ID and endGCODE ID to be the name of the printer we're using - this tells Full Control to look for that name in the startGCODE and endGCODE tabs so it can use the information there when generating the gcode - right now there isn't any information for it to find so we need to add it ourselves!

Along the bottom of the window you should see a series of tabs - we'll start by switching to the one called 'startGCODE' which should look like the first pic above.

Scroll all the way to the right and in the first empty cell in the top row, type the name of your printer - this should match what you inserted into the 'startGCODE ID' box in the last step exactly so mine will be 'X5SA'

The easiest way I've found to do this is to start with the preset profile that you can make the most sense of - in my case I started with the CR-10 preset as I'm more familiar with Cura generated Gcode which this is very similar to. If you're more well acquainted with PrusaSlicer's gcode, start with the PrusaMini preset etc.

  • Select everything in the column for your chosen preset other than the printer's name (pic 2)
  • Copy it and paste it underneath the cell where you previously typed your printer's name (pic 3)
    • By copying and pasting, it also copies the links to the parameters on the main sheet which saves us some work. It also ensures that we have all the commands necessary for Full Control to work such as an M82 enabling absolute extrusion.
  • You'll need to make a few modifications before we're done here:
    • You'll most likely need to change MAXX, MAXY and MAXZ (or equivalents if you're using a different preset) - this is to set the maximum print area - in my case my print bed is 310x310mm and I can print up to 400mm tall on the Z axis (pic 4)
    • If using ABL you'll want to make sure that's set up too - I added a G29 command as this was not included in the CR-10 preset (pic 5) - you may prefer a different command like M420 S1 to restore levelling rather than probing before each print.
    • Have a last skim through the whole thing and double check there's nothing that won't work with your specific printer - if there are any commands you're unfamiliar with, you can look them up here
      • You don't need to worry about settings such as bed or nozzle temperature though as these are linked to the parameters in the main sheet and will change when they are changed

Once you've got the start Gcode set, you only need to repeat the same process for the end Gcode tab (pic 6) - in most cases the copied end Gcode should be fine already but if you know you need to change something or want your printer to shut down or beep or do anything special at the end of the print then you'll need to add that to the end Gcode in exactly the same way as we just modified the start Gcode.

Step 6: Creating Your First Model!

Now we have our printer profile all set up it's time for the fun bits!

For your first print I'd recommend leaving most of the parameters as they are - it's already set up to make a pretty beautiful shape! I'll just run through the basics here so you can get your first print going and then in the next step I'll explain what some of the parameters do so you can start creating your own shapes!

The first area to look at is the pale green box in the top right of the page that we edited earlier (pic 1)

We've already looked into this but it's always worth checking that you have the correct bed and nozzle temperature set for the material you're using before generating any gcode.
You can also set your z offset here, adjust first layer print speed, fan speed (it's at max by default so worth turning it down a little for PETG)and can adjust your retraction settings as well if you need to!

The next area to check out is the big multicoloured box on the left (pic 2)

I'm not going to dive too deeply into what this is up to but it's worth noting that the inner frame (the ring in the base that makes this a lampshade rather than just a pretty tube) is created by features 5-8
If you just want to print the pretty outer shape (it'll come out as just a perimeter - no top or bottom) then you can simply highlight those rows and click the grey 'Skip/Stop/Use' button at the top (pic 3) To undo this, just click the button twice more to cycle back to 'use'

If you're happy, it's time to click the big yellow 'Generate GCODE' button!!! - pic 4

  • This will prompt a pop-up that will just show the progress of the gcode generation - pic 5
    • I understand this can take quite a while depending on your system - mine typically take no more than 2-3 minutes to generate but it can take 7 minutes or more so do be patient!
  • Once it's finished you'll get a new pop-up telling you the GCODE has been generated and stored on the clipboard - just click 'OK' - pic 6
  • Open a new file in Notepad or any text editor and paste the gcode into it (ctrl-v) - pic 7
    • Don't panic if you lose the gcode, the gcode is also stored in the gcode tab of the spreadsheet so you can just go back and copy it from there
  • Save the file as whatever you like but make sure you give it the .gcode extension - pic 8

Amazing! All that's left to do is print it as you usually would!

Step 7: Diving a Little Deeper! 1/2

Hopefully you managed to get a decent print out of the last step!

If you're having any issues with getting your profile just right, there's a lot of help available over on the full control subreddit!

What I'd like to do in this step though is walk through the parameters you can change so that you can start experimenting and creating your own designs!

I've included a screenshot above of the parameters used to create my spherical lampshade

I'm also including screenshots taken of some models in a gcode viewer - I strongly recommend checking your models out in a gcode viewer before printing them - Full Control gives you full control but that also opens the doors for human error to pop in and say hi so you do need to check your work a little more diligently than you might in a slicer!

All of the parameters have a brief description next to them in the spreadsheet already but I'd like to go over the ones where I think a bit of extra context might help so you can understand how my parameters created the lampshade I made and maybe start creating new shapes of your own!

  • LH - this is layer height, typically you will want this set to .2 for a .4 nozzle however in my example I swapped in a .8 nozzle which meant I could increase this value to .6 and print the entire lampshade in just 4.5 hours!
  • FW - This parameter controls extrusion width and is set to .5 by default - I increased this to work with my larger nozzle but only slightly as I didn't want the walls to be too thick and not allow light to pass through
  • Segs1 - this will determine how many zig-zags there are in the lampshade
    • pic 2 - left is with 300 segments vs 100 on the right - I used 150 as I like the zig-zags to be visible but wanted quite a smooth shape overall
  • Segs2 - I didn't change this one but this will just affect the inner frame (the lampshade fitting) - the more segments, the smoother those curves will be
    • pic 3 - left shows 64 segments vs 10 on the right

Step 8: Diving a Little Deeper! 2/2

  • Rad Inner - this sets the radius of the circle in the centre of the inner frame - you may need to change this depending on your light fittings, 18 worked for my lamp
  • Rad Outer - this sets the radius of the overall inner frame - if you change the shape of the overall lampshade you may need to adjust this to ensure it will print correctly
    • Pic 1 - on the left is before I adjusted rad outer - you can see the lines overlap which means it would print in the same spot several times and a build up of filament would occur - you want the outer point of the inner frame to just be touching the outer lampshade like on the right
  • Bulge 1 - if set to 0 the lamp will be the same width in the centre as it is at top and bottom - increasing it will make it wider in the middle so it will bulge outwards, decreasing will make it bulge inwards. I wanted a nice round shape so used 40 here
  • Bulge 2 - affects the width of the lamp at roughly 1/3 of the way up and again at about 2/3 of the way up - if set to 0, the shape will evenly curve from original width to the width of bulge 1 and back again, by increasing this, the lamp will first bulge outwards
    • Pic 2 - both use the same bulge 1 figure of 22.5 but in the left pic bulge 2 is set to 50 vs 0 on the right - I wanted the rounded shape so used 0 in my model
  • R_0 - this is the original radius - this is the radius of the lampshade at top and bottom and what bulge 1 would be if set to 0 - I used 44
  • Zag Min - this affects the depth of the zig-zags in the flatter areas of the lampshade (as opposed to at the points), this will usually be a fairly low value, I put this up to 3 as I wanted them to be more pronounced
  • Zag Max - this affects the depth of the zig zags in the points and will usually be a higher value than Zag Min - I used 7
  • Rip Freq - this affects how many ripples there are in the z direction across the whole model - this is what gives the ridges you can see in pic 3 - I used a value of 20 here
  • Swerve - probably best explained through the highlights on pic 4 - on the left a value of .05 was used vs .1 on the right - when swerve comes into affect it determined by X_1 and X_2

Step 9: Experiment!

Hopefully the last couple of steps helped clear up exactly how you can create your own shapes using the parameters

I tried to lay them out so they could be referred back to if you're ever unsure of what a certain parameter does but honestly, the best and quickest way to learn is almost always by just getting stuck in!

It's great fun and once you have your profile set up, you really can just start to throw random(ish) numbers in there and see what happens!

Worst case, it doesn't work and you get yourself a nice ugly lump of plastic and you learn something new!

Best case, you make something beautiful and still get to learn something new!

I do just want to say huge thanks to Andy for creating Full Control Gcode in the first place and for being generous enough to make it open source, produce tutorials and demos and be super supportive of my messy experimentation too!
If anyone is struggling to get to grips with it, I really recommend getting in touch with him and the community over on the
Full Control subreddit!

A last note - as I mentioned at the start, the lampshade demo is actually one of the more complex demos - if this has piqued your interest but you want to start with something a bit less full on, check out the parametric vase or ripple ramen demos as these have had a lot of formatting and notes added to make them easier to jump straight into!

Lamps and Lighting Contest

Runner Up in the
Lamps and Lighting Contest