3D Printing with the FlashForge Creator Pro and PrusaSlicer (Slic3r)

This article describes how to use the FlashForge Creator Pro with the open-source PrusaSlicer (based on Slic3r). Even if you're not going to use this particular slicer, this article also contains general advice about how to improve print quality and reliability, regardless of what software you use.

Why would you want to use PrusaSlicer? Well, it is open source and costs nothing, it supports many printers so you're not locked into a certain vendor, and many new 3D printing features are pioneered in Slic3r and its PrusaSlicer fork, and only later on blatantly mimicked by the competition, so you'll often be ahead of the curve. There are other guides about setting up Slic3r with the Creator Pro, but I have noticed that many of them are outdated or keep copying the same old configuration bits full of cargo cult while lacking certain necessary improvements.

If you want to see what kinds of results I get with my FFCP + PrusaSlicer, check out my makes on Thingiverse.


Around 2011, 3D printing broke through to the mainstream, partially thanks to certain patents expiring. As usual a bit of a hype emerged and less-than-well-informed journalists started claiming that traditional stores would disappear and everyone would be downloading products and printing them at home. Of course reality slowly returned and it became clear that 3D printers are not the ultimate solution to everything, yet they are useful for specific applications. I waited for the dust to settle and decided to buy a commercial 3D printer built with know-how accumulated over those five years. After evaluating different models, I picked the FlashForge Creator Pro due to its competitive price point and good reviews.


Using a suitable slicer program

To convert a 3D model into a set of instructions your printer understands, you need a ‘slicer’. As the name implies, it is a program that slices the model into layers and then derives an optimal path for the extruders to follow to deposit each layer of material. The FFCP used to ship with an installer for ReplicatorG on the SD card. Do not use this program for printing however, there are much better ones (see below).
ReplicatorG is still useful for changing firmware parameters through the USB interface, but even then you must obtain the latest compatible release because versions not specifically built for the Sailfish firmware are incompatible with the FFCP.

Obtaining the software

When it comes to slicers, there are many options. FlashForge has been developing their own slicing program called FlashPrint which is pretty decent for beginner use. If you want to do more advanced things however and don't want to be locked into the FlashForge ecosystem, you'll need to upgrade to a different slicer.

A popular one is Simplify3D but it is paid software and rather pricy. Many are enthusiastic about it because it “just works” (and of course because they paid a lot for it). This means that if you want to actually learn about the intricacies of 3D printing, it may be a bad choice because the software will shield you from all the things that can go wrong, which are usually also the things you learn the most from. If you just want to print things in the same way as you drive a car without knowing what makes it move, then you can just buy S3D, skip the rest of this chapter and move on to the hints.

Slic3rIf you want to go the slightly more adventurous way of using a free and open-source program, I recommend PrusaSlicer. It started out as a fork of Slic3r with some minor changes, but it is quite different now. It has many powerful features and is being actively developed so if you find a bug or have a feature request, you can report it on GitHub and the developers will probably look into it. Or you can even fix it yourself if you have the skills.

I only support using the configurations I provide below with recent releases of PrusaSlicer because it is much more actively developed and contains extra features compared to the regular Slic3r. Because both projects share the same source code base, my configs might also work with Slic3r 1.3.x, but I give no guarantees whatsoever.

PrusaSlicer can only produce text-based GCode files, but the FFCP only understands the binary X3G file format. You must therefore obtain a copy of GPX, a program that translates GCode into X3G. Ideally you should use a recent build that lists ‘fcp’ as a supported MACHINE type. If yours does not, then using the ‘r1d’ type is also OK. Do not use the 2.0-alpha version that is distributed with some older Linux distros. I recommend version 2.5 or newer.
In Mac OS X, you can install gpx through Homebrew. You can also use GpxUi which is available for Windows and Linux as well. If you won't be using my make_fcp_x3g script, you will need to run gpx yourself. You must invoke gpx with the argument “-m fcp” or “-m r1d” to produce correct x3g files for the FFCP.

PrusaSlicer lacks the ability to send commands directly to an FFCP over the USB serial connection. This means you either need to copy the X3G files to an SD card to print from, or use another way to connect to your printer. If you are in my situation where there is no need for a hyper-efficient large volume printing pipeline, I consider printing from SD card the preferred method. It does not suffer from typical problems of a serial connection like limited command throughput, and it does not require to keep a computer running near the printer and ensuring it does not crash or reboot. When using a WiFi-enabled SD card like the Toshiba FlashAir, you can even upload files to the printer without touching the SD card (see the hints section). If you do have a dedicated computer connected to your printer, then the best option is probably OctoPrint. I haven't tried it yet, but it looks very interesting and can be run from a cheap and power-efficient computer like a Raspberry Pi.

Configuring PrusaSlicer: download config and G-code

There are two important parts when it comes to configuring PrusaSlicer. First: general printer, filament, and slicing settings; second: the bits of GCode that will be executed at the start and end of every print. The G-code is included in the PrusaSlicer config bundle I provide, but I also offer it as a separate download so you can update the G-code separately from the rest. I will try to make sure that the config file always has the most recent G-code but if you want to be really sure, download and install both. I provide the downloads as Things on Thingiverse. If you have a Thingiverse account, you can hit the ‘Watch’ button on the pages of both these things, and you should get notifications when I upload new versions.

Follow the instructions in the following two sections to install the config and G-code.

Both the config bundles and GCode are maintained in a GitHub repository.

Installing or upgrading the general config in PrusaSlicer

I provide my PrusaSlicer settings as a config bundle, but beware: these are tweaked for specific filaments, all-metal hot-ends, a glass printing bed, and my personal preferences. Although it may be sufficient for your needs, this config bundle should be considered a starting point only. You will need to adjust the settings according to your setup and possibly your specific prints. I rarely use the profiles as-is, I usually tweak things per print. For a guide on tweaking Slic3r's settings, I refer to the Slic3r manual although it might be outdated.

The config you downloaded contains two important parts. First, the ‘make_fcp_x3g’ post-processing script. This is highly recommended. It is a Bash script that can be used as-is in Linux or Mac OS X. In recent versions of Windows, you can also run Bash scripts in the WSL environment via a BAT script. If not, I do provide a simpler alternative BAT file simple_ffcp_postproc.bat that does the most essential things without the need for WSL. Instructions for setting up either WSL or this simpler BAT file can be found in the GitHub repository.

Although you can run GPX manually, you really need some kind of post-processing to be able to print with the left extruder only, until someone fixes the issue in PrusaSlicer that causes the wrong extruder to heat up after the first layer.

Now install the make_fcp_x3g script and/or the appropriate BAT script somewhere on your computer and ensure it is executable. A suitable location would be a ‘bin’ folder in your home directory where you might also store other personal executable files. You will need the path to the post-processing script (or BAT file) below, so remember it. For instance if your user account name is ‘foobar’ and you placed the script in a directory ‘bin’ in your home folder, the path would be:

Even if you want to manually post-process, you must still consider the path: in that case it is simply empty.

Now it's time for part 2, the config bundle .ini file itself. It comes in two variants: most likely you need the regular one. You only need the ‘MVF’ one if you have installed the MightyVariableFan system.

The post-processing path you remembered above needs to be configured in the config bundle. You can do this after loading it in PrusaSlicer but it is far less tedious to do this beforehand by editing the ini file itself: change all lines in the file that start with “post_process = ” such that the path (or nothing!) comes after the ‘=’ sign. You can do this with find & replace in a plain text editor. Those familiar with console commands can use a tool like ‘sed’.

The first time you run PrusaSlicer, it will show a configuration wizard. Skip through it and select ‘None’ in each screen, do not create a custom printer. By doing this, ideally no presets should be created. If it did create presets, you should preferably delete them. If you used PrusaSlicer before and want to make sure that no old settings linger about, delete all profiles you haven't created yourself: importing a new bundle will not delete obsolete presets.

Now load the .ini file using ‘Load Config Bundle’ in PrusaSlicer's File menu.

Load config

If you did not edit the .ini file beforehand, you must now go through every Print Settings preset and enter the path in ‘Output options’ → ‘Post-processing scripts’, replacing the bogus default value. (The interface must be in ‘Advanced’ or ‘Expert’ mode for this.) You also need to do this for each of your own custom profiles. This is very tedious, so it pays off to edit the .ini file itself.

Next, ensure the GPX program is installed and you know its filesystem path. If you use WSL in Windows, install GPX inside the Linux environment. If you wish to use my other post-processing scripts like the one for dualstrusion, now is the time to install them as well. Ensure gpx and all script files are executable. Then open the make_fcp_x3g file in an editor and follow the instructions in its comments to set the correct filesystem paths to gpx and any post-processing scripts.

If you use the simple_ffcp_postproc.bat script instead, install gpx.exe somewhere and edit the BAT file to set the correct path.

Now it is time to test whether everything works: load a simple model and hit the ‘Slice now’ button, then ‘Export G-code’. If everything is set up correctly and you have set up the post-processing script, you should find an .x3g file next to the exported .gcode file. If something went wrong, information may be found in a ‘WARN’ or ‘FAIL’ file if present. If you run the make_fcp_x3g script yourself with the ‘-c’ argument, it might be able to diagnose problems.

Updating the custom G-code in PrusaSlicer

The G-code snippets are responsible for preparing the whole printer up to the point where it can start extruding the very first layer of your model, as well as for finishing the print and tool changes for dual extrusion. The config bundle you imported might not contain the most recent G-code because I may have updated it separately. To update the configs to the latest G-code, proceed as follows.

Open the G-code snippets you downloaded above in a text editor. Go to Printer Settings, set mode to ‘Expert,’ and copy each ‘Start’ snippet to the ‘Custom G-code’ section of each corresponding printer profile (left to L, right to R, dual to LR). Remember to click the save button and overwrite the config after each change. Copy the ‘End’ code to all profiles. Copy ‘ToolChange’ to both ‘Dual Material LR’ profiles.

G-code in Slic3r

Beware: this code will move the extruders along a line at the front edge of the platform. If you use a glass plate, ensure the nozzles will not knock any mounting clips off the front corners during the start procedure. Mount the clips at the sides, about 10 mm from the front edge. Or better: use side-mounted clamps (like these) that do not stick out above the plate. If the glass plate is wider than the platform, you may have to tweak the code to ensure the ‘chop’ works.

Calibrating your home offsets

This is not essential but ensures you can use the maximum available area of your print bed, as well as the maximum vertical range of the printer. When everything has been set up, print a tiny test object. The latest version of the G-code (2019/02 or newer) primes the extruder by printing a line across the front of the bed at exactly 3 mm from the front edge. If this isn't the case, go to ‘Home offsets’ in your printer's LCD menu and adjust as follows. If the line is printed at more than 3 mm from the front edge, increase the Y home offset. If it is closer to the edge or is extruded in free air in front of the bed, decrease the Y home offset.

To calibrate the X home offset, print a small symmetrical object (like a cube) at the centre of the bed, then measure with a ruler whether it is at equal distances from the left and right bed edges. If it is nearer to the left edge than the right, decrease the X offset and vice versa.

If you have a glass plate on top of the bed and it is smaller, you should adjust the ‘Bed shape’ in all PrusaSlicer printer profiles accordingly.

Similarly, you should also determine how much vertical range you actually have: most likely it is more than the advertised 150 mm. My printer can print objects up to 170 mm tall. If you know how high you can go, modify the ‘Max print height’ value in all the PrusaSlicer printer settings, and also update Z_MAX in the make_fcp_x3g script.


The dual nozzle design of the FFCP is not a very good solution for dual material printing, partly because it was one of the first attempts at it. Originally I found the FFCP's dual nozzle setup mostly useful to always have two filaments ready for use. Eventually though, I made it a habit to remove the right nozzle and stepper motor except for the very rare occasions when I do a dualstrusion print. Removing the unused nozzle eliminates the risk that it will cause various problems by bumping into the printed part, and removing all the extraneous weight from the carriage results in a very noticeable reduction in ringing artifacts (see below).

It is possible to get good quality dualstrusions despite the limitations of the single-carriage-dual-extruder setup, by sacrificing print speed and material. The current editions of PrusaSlicer however do not have the right provisions for this. If you simply let it do its thing, you will end up with a print full of ugly ooze and possibly holes as well. There are multi-material provisions in PrusaSlicer, but they currently are specific to the Prusa printer models and do not work for the FFCP.

To work around this, I wrote a post-processing script that does all the necessary things to get the most quality out of the single-carriage-dual-nozzle setup for a dual extrusion print. You can find the script and instructions on another page.

Side note: why this G-code makes sense

If you look around on the internet, you will find copies of the same old GCode endlessly circulated with minor changes that often do not make sense. If you find GCode with the codes G130 or M108 in them, do not use them with your FFCP. Those snippets have been pasted together in a Cargo Cult manner by people who barely had a clue what they were doing.

The code I provide has been tweaked over several months to greatly reduce the risk of prints that fail already before actual printing begins. Changes compared to the typical code snippets, are:

  • The exact same homing procedure is used as for bed levelling, giving the best chance of homing the platform to the same height (unfortunately there are many caveats, see the tips section below).
  • Avoids fast unaccelerated moves.
  • The coordinates have been adjusted to truly match the platform of the FFCP.
  • All cargo cult cruft has been removed, including the G130 commands that could mess up your factory-tweaked stepper bias settings.
  • Extruder steppers are shut off entirely during heating to save power, instead of doing something stupid with the bias voltages of all steppers and then resetting them to an arbitrary value.
  • The nozzles do not heat beyond 140°C while the bed heats up. Only when the bed has heated, the nozzles continue heating to their target temperature. This minimises oozing and avoids ‘baking’ filaments like woodfill which may result in an extruder jam.
  • The nozzles are parked in front of the platform while heating. Then they chop off any oozed filament on the edge of the platform before starting the print. This greatly reduces the risk that the ooze ends up messing up your first layer. This generally allows to start prints in a fire-and-forget manner if you have properly levelled your build plate. For some really sticky filaments like PETG, it may be necessary to stick a piece of painter's tape to the front of the bed or glass plate where the chop is performed, to ensure it works reliably.
  • Speeds have been tweaked to be neither too fast nor slow.
  • Left and dual extruder code does a proper tool change with sufficient clearance for the nozzle swap. This means your coordinates are not all messed up and you can use correct values for the platform origin.
  • The code for dualstrusion does something useful and actually prepares both nozzles. The tool change code ensures the nozzle swap happens at a predictable and appropriate speed (this move is not accelerated, therefore it must not be too fast).

Long story short, the person who wrote this code, for the most part did know what he was doing. I explicitly waited to publish this code until I knew what each line did and why. There is no Cargo Cult in here, at best one or two lines that are redundant.

Another side note: the make_fcp_x3g script invokes GPX with the ‘-p’ option. This causes it to override the print percentage shown on the LCD display by estimating how long each print move takes, and making a wild guess at the pre-print warm-up time. Because of this guess and it being unaware of acceleration for print moves, it is usually overly optimistic especially at the start of the print. It is however a whole lot better than just mapping the Z axis to a percentage as Slic3r does.

Using PrusaSlicer

I will not give a full manual for PrusaSlicer here, you should be able to find good manuals online. I will give some remarks about using it with the configs I provide above.

Main window
Dalek Buddha model by SavageRodent

My workflow is as follows. The above screenshot shows where in the UI each step occurs. Things may be in different places in the latest releases, but the same principles do hold.

  1. Load one or more models. If it will be a dualstrusion, see my dualstrusion article for more details.
  2. Select printer profile, this determines whether you will be using the left, right, or both extruders. My config contains separate profiles marked ‘flex’. As the name implies, these should be used for flexible filaments but they are also recommended for any other filament that benefits from slower retraction speeds.
  3. Select filament type(s). Obviously if you are using one of the ‘Single’ printer profiles, select the filament that is loaded in the extruder you will be using. For the dual extruder profile, the top filament is the right extruder and the bottom one is the left. For some filaments like ABS there is both a regular and a ‘fan’ profile. See the ‘cooling’ section for more about this.
  4. Select print settings, this will determine layer thickness and other quality-related parameters of the print. Below I give an overview of what each of my print profiles do.
  5. Scale, rotate, duplicate, move the object(s) around if desired, and load any additional objects.
  6. Tweak any settings for this specific print like perimeters, infill, supports, …
  7. Inspect the preview and layers to see if there is nothing suspicious. Like any software, PrusaSlicer has bugs, and poorly designed STL models may cause problems like missing layers. It is better to notice and work around problems before starting the print, than finding your printer full of Angel Hair Pasta after several hours.
  8. Export G-code and feed the X3G file to the printer.

The right nozzle is ‘extruder 1’ and is the default; the left one is ‘2’. When you select filament in the Plater tab for a dual extrusion profile, the topmost one is extruder 1 (right), the second one is 2 (left). When dualstruding, the filament selected for extruder 1 (right) determines bed temperature unless there is only extruder 2 material in the first layer.

Print settings overview

After importing the config bundle, you'll have a list of ready-to-use print settings to choose from. They are grouped per material, and per general print quality. The profiles for ABS, PLA and rigid.ink ‘Bioflex’ are the most well-tweaked, the PETG ones may still need some tweaking, and the polycarbonate (PC) and NinjaFlex ones were only used for a few small prints and can probably be improved. Here is a short explanation of the various profiles:

All settings are tweaked for 0.4 mm nozzles. If you swap out your stock nozzles for a different size, you will need to modify the configs. Of course, feel free to create your own presets. If you want to keep my pre-made print settings up-to-date, keep in mind that any changes you make to them will be overwritten the next time you load an updated config bundle. Save modified presets as copies with unique names if you don't want them to be overwritten.

Beware: filament temperatures have been tweaked for an all-metal hot-end. You should not print at temperatures above 240°C with the stock hot-ends. Lower temperatures if necessary.

Hints for printing with the FFCP

As a general recommendation, make sure you have a good calliper or micrometer. It is essential to know the exact diameter of filament you buy, so you can configure it in your slicer program. It is also extremely useful to accurately measure parts you are trying to make a 3D model of, and to check whether the first layer is printed at the expected thickness. I recommend a mechanical calliper with a clock-like dial. This is accurate, easy to read, and has no stupid batteries that die at the wrong moments.


When you start using a new spool of filament, the very first thing you should always do is measure the filament diameter at several positions, and either create a new filament profile or update your existing one. Enter the average of your measured diameter in the profile. Use the extrusion multiplier to adjust for under-extrusion (see below for more info). If the filament is high quality, the diameter should remain consistent across the entire spool. For cheaper brands, it may be wise to occasionally re-measure the diameter.

Another good investment is a small infrared thermometer. This allows to check whether the temperature of the printing bed is correct, which is especially important when using glass (see the adhesion hints).


Print quality can be greatly improved by properly cooling the freshly printed material. For some filaments this is essential. For others, too much cooling will ruin the print. Ideally the freshly extruded filament should be cooled as quickly as possible to the point where it solidifies and no longer shrinks significantly, but not beyond that point. This could theoretically be done by blasting the printed object with air just below the glass transition temperature, but that is not feasible with a consumer printer like the FFCP. We have to make do with a simpler fan that blows whatever air happens to be inside the enclosure.

Dual ductTo make things worse, the fan on an unmodified FFCP has two major problems. The first is that it only blows at the left nozzle. This can be easily remedied by printing my dual fan duct. Not only does this direct airflow at both nozzles so you can provide proper cooling when dualstruding, even for single extrusion it also provides a better airflow than the stock duct. This is not just recommended, I consider it essential.

The second problem is harder: a standard FFCP has no fan speed control. The fan can only run at either 100% or 0%, no matter what configurability your slicing software pretends to offer. Don't bother setting different speeds in PrusaSlicer or Simplify3D, any speed higher than 0 will result in full throttle. You can get away with this on/off toggle in many cases, as long as you are using the stock hot-ends with undemanding filaments. PLA and flex work fine with the fan at 100% (all my PLA filament presets keep the fan enabled). Prints in ABS and PETG will however usually be destroyed when cooled too much. Only at the ‘extrafine’ settings, good results might be obtained because extra cooling is usually needed when printing at very fine layers to avoid deformation. For all other ABS and PETG settings though, cooling is usually a no-go if you cannot reduce fan speed.

If you can accurately control fan speed though, you will obtain better results than without cooling, even with ABS and PETG. This is why I provide ABS and PETG profiles with a “-fan” suffix. Do not use these if you have not somehow modified your printer to vary fan speed, except maybe for small objects printed at the ‘extrafine’ settings.

The best solution to obtain variable fan speed is to have the printer communicate with a dedicated PWM controller. The MightyVariableFan system uses a Raspberry Pi as the controller.
A simpler but more cumbersome solution is to install a manual PWM controller in between the ‘EXTRA’ output on the PCB and the fan.
Another alternative is to install a recent build of the Sailfish firmware, like this one. By performing PWM in software, it allows to change fan speed from within the LCD menu but not during printing, and it will not respond to fan speed commands in the G-code. It is better than nothing but even worse than a manual PWM controller.

Highly recommended tweaks

Aligning the Y axis belts

A common problem that is not always easily noticed, is that the two Y axis belts (the ones at the top left and right of your printer) can become misaligned. This may happen if something has caused the belts to slip over their pulleys, for instance if the carriage has bumped into the front of the printer. Also, if you have detached these belts for some reason, it is pretty much impossible to re-mount them in an aligned manner. Misaligned Y belts have two undesirable consequences:

  1. Your X axis can become non-perpendicular to the Y axis, hence if you try to print a square, you'll end up with a parallelogram. If you use my start G-code, you'll see that the initial priming line is not parallel with the edge of the bed.
  2. There can be a noticeable ripple on walls printed parallel to the Y axis. The ripple will have a 2 mm period, because this is the pitch of the belts. You can also feel this ripple when manually pushing the carriage back and forth.

Next to checking whether the X axis rods are skewed w.r.t. the bed or printer housing, or noticing the 2 mm ripple, you can also easily detect misalignment by plucking the Y belts like a string. If they have considerably different pitches, they are misaligned. Correcting this would have been easy if FlashForge would have incorporated a detachable coupler on the rod that connects the two pulleys to the Y stepper motor but since they haven't, a more cumbersome solution is needed.

Aligning the Y belts

Cut two strips from a piece of blister packaging, 6 mm wide and about 5 cm long. Bring the carriage forward. Stick the strips in between both Y belts and the underside of their rear pulleys. Then push the carriage backwards until the strips are rolled around the pulleys, see the above photo. Now the belts can slip over the pulleys and you can wiggle the X axis bars until they are perfectly parallel to the frame, and the belts have the same pitch when plucked. Finally, simply pull the carriage forward again to roll out the blister strips. Check the result and repeat the procedure if necessary.

There is an alternative to this procedure, it provides easier and more accurate adjustment but is not for the faint of heart. After disassembling the upper part of the printer, you can cut the narrow rod that connects the two Y axis belt pulleys and reconnect it through a 5 mm axis coupler as shown in the photos below. If the belts become misaligned, you only need to loosen the coupler, align the X axis, and tighten the coupler again.

Coupler on the Y connector rod

Ensuring good adhesion

One of the most common problems with 3D printing despite many years of evolution is the first layer sticking insufficiently (or sometimes too much) to the platform. Here are some tips in case you suffer from prints that won't stick or that you cannot remove from the platform without resorting to hammers or power tools.

General hints

Maximising Quality

The GCode snippets and config bundle are released under the Creative Commons Attribution license. (In a nutshell, this means you can distribute them freely as long as you mention the origin.)
Of course, there is no guarantee whatsoever of fitness for any purpose and so on, use at your own risk.

©2016/09-2019/08 Alexander Thomas