BTT Octopus
BTT Octopus

BTT Octopus: Analysis and Setup Guide with Marlin and Klipper

The well-known company Bigtreetech returns again to the market with another powerful electronic board called BTT Octopus, which outperforms its little sister, the SKR GTR.

Of all the high-performance electronics that have passed through our hands in 3DWork, such as the previously mentioned SKR GTR or the previous SKR Pro, we have to say that the BTT Octopus has been one of our favorites, without any doubt.

And as always before continuing our brief analysis, we would like to remind you that we have a large community in our channel Telegram. If you want to be part of it, do not hesitate to join us.

Brief introduction

BTT Octopus
BTT Octopus

Scratching the surface a bit we can discover that this “monster” has 8 replaceable drivers, 6 PWM fans to use with different voltages (thanks to its integrated DCDC) and even an Ethernet connector with support CAN Bus, to further expand its incredible features.

In addition, it is worth mentioning that its compatibility with different firmwares makes it the perfect solution for the most demanding makers on the market.

I sincerely believe that any user of a “CoreXY” machine will consider it to be the ideal board. Especially if you have a Voron 2.4, a BLV or a VCore3, being today the best machines in this format.

Where can I buy the BTT Octopus?


You can buy the BTT Octopus in the Amazon and Aliexpress marketplaces, as usual. However, here we leave you the direct links to the components that we reference in this article.

If you use them, the price of the product will be the same as if you log in regularly, but 3DWork will have a small commission left. Something that will help us support the project and continue generating content.

BTT OctopusAmazon Logo PNG e1579685453346aliexpress logo
BTT GTR Amazon Logo PNG e1579685453346 aliexpress logo

As an alternative, you can also use our product search engine for 3D printing, where a single search will show you prices from different marketplaces (Amazon, Aliexpress, Banggood, etc.)


Diagrams of the BTT Octopus

Before starting with the different diagrams and schemes, it is important to mention that there are to date 2 versions of the BTT Octopus, specifically versions v1.0 and v1.1.

The most notable differences between the two would be a change in the polarity of the fans output, a problem in v1.0 with the LED of the SD reader and that the MCU regulator and the endstops have been replaced by another model. In any case, none of these cases affect in any way its operation or its current performance.

As always, you have at your entire disposal on the manufacturer’s official Github the BTT Octopus manual, from which we recommend reading it due to the interesting information you can extract about this electronics in question.

Below you can find the different wiring diagrams, pinning and measurements of this board:

SKR Octopus
BTT Octopus
SKR Octopus
BTT Octopus

Main features

We proceed to list here some of the most important characteristics of the BTT Octopus electronic board:

  • ARM Cortex-M4 STM32F446ZET6 32-bit microcontroller at 180MHz
  • Support for Klipper and Marlin firmwares
  • Interfaces for Raspberry Pi (USB and UART by GPIO)
  • Up to 4 hotends available
  • Integrated DCDC to provide 12V(4A), 5V(8A) and 3.3V(1A) power supply
  • Up to 6 controllable fans and 2 without control with the possibility of voltage selection (Vin, 12V and 5V)
  • Protection against short circuit on fans, something very important since it is one of the most common problems
  • USB-C connector that allows serial emulation to print using USB
  • Compatibility with almost any screen, although we recommend using SKR dual displays
  • High performance MOSFETs, improve heating speed and efficiency
  • Protection fuses easily replaceable
  • Double motor output for the Z axis
  • Improvements in the bootloader, supporting the update by USB (recommended) and DFU (advanced users)
  • 32K EEPROM (AT24C32)
  • Connectors for RGB LEDs and Neopixel
  • Connector for WiFi interface (ESP8266)
  • PT100 interface (requires INA8 amplifier 26AIDR welded to plate in socket)
  • Protection against short circuit in thermistors, another great improvement applied to the fans. It allows reusing these pins for other tasks with a pin that bypasses these protections
  • BLTouch support and the like with a connector intended for them and usable by other ABL systems. The PROBE port was added extra protection with an optocoupler so as not to need to use a BAT85 diode
  • CAN BUS via 6P6C RJ11 connector for future expansion modules
  • SPI BUS expansion port for SPI modules such as MAX31865
  • I2C BUS expansion port for I2C modules
  • Support for modules Relay and UPS

Comparison: BTT Octopus Vs FYSETC Spider

BTT Octopus

To put the Octopus BTT in context, I leave you a little comparison with another high-performance electronics, the FYSETC Spider, of which we made another guide and complete analysis.

You can consult the article at the following link: FYSETC Spider: Complete guide of this« beast »for our 3D printers.

So you can clearly see both electronics and their main features at a glance:

BTT OctopusFYSETC Spider
ProcessorCortex-M4 STM32F446 (180MHz)Cortex-M4 STM32F446 (180MHz)
Drivers8 drivers8 drivers
Hotends4 hotends + 1 heatbed3 hotends + 1 heatbed
Fans8 connectors (5V, 12V, 24V)
6 manageable + 2 normal
6 connectors (5V, 12V, 24V)
3 manageable + 3 normal
Endstops8 Endstops6 Endstops
Power4 connectors
3 connectors
BLTouchYes, dedicated connectorYes
SensorlessYes Yes
CANBusYes Yes
Raspberry PiYes Yes

BTT Octopus connections


Power connectors


The Octopus BTT, as a high performance electronics, has three independent power inputs: power supply for electronics (connectors 3-4), independent power supply for motors (connectors 1-2) and power supply for the heated bed (connectors 5-6).

Although in certain machines they will all be connected to the same power supply, in machines that require special configurations we can use independent power supplies for these components.

SKR Octopus
BTT Octopus

The Octopus MTB has a jumper for power selection using the USB-C port. With this pin connected by jumper, the board will be powered by the USB-C port, and can be used to perform firmware update tasks or basic tests.

It is important not to have the jumper in normal use connected to the printer’s power supply, that must be taken into account.

Hotends and heatbed outputs

As we anticipated in the main characteristics, our Octopus MTB has 4 outlets for different Hotends and one outlet for a heatbed, as you can see in the image below.




Being able to have 4 Hotend outputs, we have 5 connectors for thermistors, obviously 4 for the Hotends (T0, T1, T3 and T3) and 1 for the heated bed (TB). We remind you that the orientation of the thermistor cables is usually not important since they do not usually have polarity.

All of them with protection against short circuits, something very appreciated in the case of handling failures on our part or simply due to a failure of these components.



The BTT Octopus has 8 sockets for drivers, making it an ideal electronics for demanding machines such as CoreXY printers or similar (Voron 2.4, BLV or VCore3, for example).

It is important to note that the driver normally assigned to the Z axis (MOTOR 2) has 2 parallel motor connectors, in case we do not want to use an independent and self-leveling double Z axis (another quite interesting alternative).

Support for almost any type of driver, and different modes thereof, gives us a wide range of possibilities when it comes to making our machine.


Nowadays and from our point of view, the most advisable thing is to always enable our drivers in “intelligent” mode (UART/SPI) as long as they support them. However, the BTT Octopus also offers the option to use these same drivers in standalone mode (STEP/DIR) if you wish.

The most common is the use of TMC drivers such as TMC2208, TMC2209 or TMC2226 which are managed intelligently using UART .

If you are unfamiliar with these types of drivers, we wrote a great article some time ago that you can read at the following link: TMC Drivers: Discover the best drivers for 3D printing and their available technologies

To configure the board in UART mode we will only have to use the following jumper as can be seen in the following photograph:


If we use SPI drivers you must connect the jumpers in each driver that we use SPI according to the following image.


In case of using drivers that do not support “intelligent mode” (such as UART/SPI) we will have to use the configuration of MSx jumpers marked in the following photos, as well as the configuration of the microsteps.


We attach as a reference the configurations of the most common:


Several Z axis

As we have already mentioned, this Octopus is destined to be the heart of powerful machines in which having double, or even more, Z axes is usually a basic requirement.

In this case and for Marlin, the socket destined for this function by default is the MOTOR3, leaving the MOTOR4 for the first extruder.

Location of the second driver for the default Z axis in Marlin.


In right-left order: X Y Z Z2 E0 E1 E2 E3.

Another increasingly widespread function that considerably simplifies wiring our machines is the Sensorless function, which are used in various TMC drivers.

This function basically uses the motors as limit switches, detecting current consumption peaks during the Homing process to simulate them.

To enable this function on an axis we must modify our firmware. For this we recommend checking our Sensorless guide, and when it comes to modifying the hardware, it is as simple as placing a jumper on the connectors dedicated for this purpose (see image above)

It is important to note that the use of Sensorless is advisable only for the X and Y axis, since due to its precision and operation it is not recommended for Z axis.


The Octopus MTB has 6 controllable fans and two connectors for always powered fans.


One of the novelties, and that we have sincerely fallen in love with this board, is to be able to determine the voltage of these fans by means of jumpers (5V, 12V or 24V). Definitely no more external DCDC converters to silence our printer.

SKR Octopus
BTT Octopus

Automatic leveling sensors

Each and every Octopus MTB includes a pair of connectors dedicated to leveling sensors. Below you can see two examples of connection to the most common currently:

From 3DWork we believe that the sensors BLTouch/3DTouch are, for precision and for being able to be used in practically any printer and printing surface, our favorites without a doubt.

On the other hand, they tend to be a bit more delicate due to their operation and it is always advisable to purchase a sensor Antclabs original.

We remind you as always, check our BLTouch configuration guide for this type of sensors.

SKR Octopus
BTT Octopus

Other very widespread sensors are inductive / capacitive, the most “famous” being the PINDAV2/SuperPINDA for its precision and to have a perfect size and weight to use in our printers.

This type of sensor, unlike the BLTouch/3DTouch, does not act by contact but by detecting magnetic fields, limiting in this case the precision and operation in certain circumstances and/or printing surfaces.


In this case Bigtreetech again has done a great job adding a specific port for this type of sensors as in the case of the BLTouch/3DTouch. This new port avoids the usual problem in this type of sensors that a BAT85 diode had to be added as protection since an optocoupler was added internally.

Depending on the type of sensor, it is necessary to use a 4k7 resistor, normally in NPN type sensors. We will also have to take into account, depending on the sensor, if we have to enable pull-down in our firmware.

Filament sensor


Within the arsenal of connectors available in the Octopus we also find 4 connectors prepared by default for the use of filament sensors.

Marlin’s default pin definitions for use with filament sensors are as follows:

#define FIL_RUNOUT_PIN                      PG12  // E0DET
#define FIL_RUNOUT2_PIN                     PG13  // E1DET
#define FIL_RUNOUT3_PIN                     PG14  // E2DET
#define FIL_RUNOUT4_PIN                     PG15  // E3DET

Expansion ports


Another excellent improvement introduced in the BTT Octopus has been the inclusion of a CAN Bus connectivity port using an ethernet connector. This CAN Bus connection will allow us to expand our board with other expansion boards very easily, if necessary.

Apart from this new CAN Bus, we will also have other additional expansion ports for the use of other components, such as relay modules, UPS, Neopixel, etc …

The Bigtreetech relay module gives us the shutdown control of our printer in a controlled way, such as after printing is finished.

SKR Octopus
BTT Octopus

In the same way as the relay module, the UPS module helps us to perform a correct emergency shutdown in the event of a power failure, something that together with the PLR (Power Loss Recovery in Marlin) will allow us to resume printing in the event of a power failure.

You will find more detailed information in the next guide.

SKR Octopus
BTT Octopus

Every 3D maker we like our printers to look, never better said, very pretty. The installation of a controllable led strip, either as lighting of the printing area or the notification of printer events, is a very interesting improvement.

You can check our Neopixel guide where you will find more detailed information.

SKR Octopus
BTT Octopus

How could it be otherwise, BTT Octopus electronics have thought of a very common improvement in our printers. The connection to a Raspberry Pi to manage our impressions.

We have different connection options. From the simplest via USB-C cable or directly using UART/SPI ports available on the board.

SKR Octopus
BTT Octopus
Octopus31 1
Conexión SPI

We also have in the BTT Octopus a Wifi port to be able to install modules ESP12S or ESP07. This will provide us with a direct connection to our board without any problem.

SKR Octopus
BTT Octopus

Firmware Configuration

Bigtreetech has once again paid special attention so that its electronics have the greatest compatibility and support with the most popular firmwares on the market, such as Marlin and Klipper.

In the case of the BTT Octopus they ensure optimal support for Marlin, Klipper or RRF firmwares, and even make available configurations for the Voron 2.4 printer. So here are a couple of basic settings (Marlin/Klipper).

Marlin Firmwares

Marlin 12

Before continuing with the guide on firmware modification, I would like to indicate that you have a firmware already preconfigured on Bigtreetech’s GitHub for this type of electronics. You can download them from this same link.

“Platformio.ini” file

In this file we will indicate our chipset/electronics looking at the beginning of the file for the value “env_default” and change it to:

default_envs = BIGTREE_OCTOPUS_V1

“Configuration.h” file

First of all and as we always do, we advise adding a comment to any configuration line that we modify. Afterwards, it will be much easier for us to find our modifications for future changes and / or consultations. For this we can add:

In the case that you do not already have a comment, the line
... // 3DWORK
In case you already have a comment
... // 3DWORK ...

We will start by correctly configuring the SERIAL and BAUDRATE, something very important for the correct functioning of components such as a TFT screen, WiFi or a device connected by USB-C.

#define BAUDRATE 115200
#define SERIAL_PORT_2 -1  // 3DWORK USB
#define SERIAL_PORT_3 2 // 3DWORK RPI

Next we will define our MOTHERBOARD, which, as in the “platformio.ini” file, tells us what type of board to use and his pin configuration:

// Choose the name from boards.h that matches your setup

The next step will be to define the number of extruders and filament diameter that our printer uses. Typically most printers use 1.75mm filament, although another less common (but also standard) measurement is 3mm.

Remember that the BTT Octopus can handle up to 4 extruders depending on the machine configuration:

// This defines the number of extruders
// :[0, 1, 2, 3, 4, 5, 6, 7, 8]
#define EXTRUDERS 1
// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc.

Thermistors, in the next block of “Configuration.h” to modify we will define the number and type of installed thermistors. In the case that you do not know which one is exactly yours, we advise you to use type 1, which is usually the most standard.

It is very important to indicate the correct type of thermistor so that the measurements that Marlin receives are correct, thus avoiding extrusion problems and/or reading errors.

#define TEMP_SENSOR_0 1 // 3DWORK HE1
#define TEMP_SENSOR_1 1 // 3DWORK HE2
#define TEMP_SENSOR_2 1 // 3DWORK HE3
#define TEMP_SENSOR_3 1 // 3DWORK HE4
#define TEMP_SENSOR_4 0
#define TEMP_SENSOR_5 0
#define TEMP_SENSOR_6 0
#define TEMP_SENSOR_7 0

In the strange case that we want to deactivate the heated bed, we will comment or set the value of TEMP_SENSOR_BED to 0.

PID, the PID allows us to adjust the parameters that Marlin uses to control the temperature of our heaters without having fluctuations that could compromise the quality of our printing.

We will enable the PID of our hotend or hot bed in the following lines:


ENDSTOPS or limit switches, it is important to verify when we change the electronics and turn on our printer for the first time that the logic of the limit switches is correct.

You can use the M119 command from a terminal such as Pronterface (OPEN normal state and TRIGGERED when they are pressed). We can reverse this logic by changing the following lines:

#define X_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Y_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Z_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define X_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Z_MIN_PROBE_ENDSTOP_INVERTING false // Set to true to invert the logic of the probe.

Typically, machines will home in MIN (lower left corner) instead of MAX (upper right corner), using HOME_DIR for this change -1 (MIN) 1 (MAX). But you can alter the logic if you need to from this section:

//#define USE_XMAX_PLUG
//#define USE_YMAX_PLUG
//#define USE_ZMAX_PLUG

Remember that if you have TMC drivers in UART mode you can activate, if the driver supports it, the use of SensorLess. This will allow you to dispense with physical limit switches, freeing your machine of extra components and cables.

Drivers, as we have already mentioned, this board has 8 sockets for drivers supporting different types of drivers and their configurations.

In our example we will use TMC2209s in UART (intelligent) mode, with independent double Z and a single extruder:

//#define X2_DRIVER_TYPE A4988
//#define Y2_DRIVER_TYPE A4988
//#define Z3_DRIVER_TYPE A4988
//#define Z4_DRIVER_TYPE A4988

STEPS or motor steps, we will indicate to Marlin the motor steps to perform movements. In this example we will use the ones that an Ender printer carries by default.

In any case again we refer you to the section /Calibration Initial Calibration of our help bot in Telegram @ThreeDWorkHelpBot or here for the process to calibrate these steps for our extruder and movement axes.

#define DEFAULT_AXIS_STEPS_PER_UNIT { 80.00, 80.00, 400.00, 93 } // 3DWORK Steps for Ender3 axis (X, Y, Z, E)

S_CURVE_ACCELERATION, this functionality offers a great improvement in print quality by smoothing the acceleration or deceleration when the print head is in motion.


Depending on our version of Marlin, Linear Advance may not be compatible.

In the section /Calibration/Initial Calibration of our help bot on Telegram @ThreeDWorkHelpBot or in our calibration guide you can find more information about it.

PROBE or leveling sensor, as we have commented on numerous occasions, we have a detailed guide to install a BLTouch sensor. Something very advisable to take into account to ensure that our prints always have a first layer that is as perfect as possible.

As we have commented previously and depending on the type of sensor we will have several options to connect it either in the connector for BLTouch, PROBE connector (inductive/capacitive) or to the Z-.

We will start by indicating where our leveling sensor is connected. In this case we will connect it to the Z- limit switch connector.

#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN // 3DWORK PROBE We indicate to Marlin that our sensor is connected to Z-STOP

We must also indicate the type of sensor we have installed:

In the case of an Inductive sensor:
In the case of a BLTouch type sensor:

Sensor offsets, it is very important to tell Marlin where exactly our leveling sensor is installed. We will do this by defining the PROBE OFFSETs.

The Offset is the distance between the tip of the nozzle and the tip of the leveling sensor that, depending on where it is, must be positive or negative values. You can use the following graph as an example of what value to put in each case.


In our case and as an example, our sensor is displaced to the left of the nozzle in X 30mm and 10mm in Y since that distance is towards the bottom of the printer.

#define NOZZLE_TO_PROBE_OFFSET { -30, 10, 0 } // 3DWORK PROBE

PROBING_MARGIN (in previous versions MIN_PROBE_EDGE), it is very normal that we have a glass as a printing base in our printers, although we personally like the magnetic PEI sheets.

They tend to be a little more susceptible to being marked with blows but they have excellent adhesion, they do not limit the size of the bed and removing the pieces is extremely simple and fast.

In any case (let’s have glass or other surface) it is advisable that the sensor is away from any object that may bother you during the leveling process. Either staples to fix the glass or the own mismatch of the beginning and end of the heatbed that makes the sensor unable to measure.

For this we will use this PROBING_MARGIN, to which we will indicate how many millimeters to move away from the edges of the bed. In our case using a BLTouch and a PEI platform we leave it by default.


Direction of motors, another very common problem when starting a printer is that the wiring of the coils of our motors do not coincide and there can be two cases:

  1. That the connectors of our coils are mixed. Easy to identify as the motor will not turn properly and will stumble. To solve it, check the pinout of the old board and/or the motor and compare it with that of our new electronic board, to make sure they match.
  2. That the motor rotates in the wrong direction. In this case again we have two options. The first and advisable one is to modify the motor rotation in Marlin. And the second, reverse the wiring of one of the motor coils.

In our case we will choose the first one by modifying the following lines in Marlin. Changing the current value to the contrary (TRUE/FALSE). In our case, I proceed to invert the Z axis.

#define INVERT_X_DIR true
#define INVERT_Y_DIR true
#define INVERT_Z_DIR false // 3DWORK We reverse the rotation of the Z axis

Print size, if we have used a generic Marlin it is important to verify that the print dimensions are correct for our machine.

For the bed size in the example we use an Ender 3 at its maximum size, it is advisable to verify that you can physically reach these measurements and adjust it if necessary:

#define X_BED_SIZE 235 // 3DWORK BED
#define Y_BED_SIZE 235 // 3DWORK BED
#define Z_MAX_POS 250 // 3DWORK BED

Filament sensor, we advise you to check in the /Improvements/Filament sensor section of our Telegram help bot @ThreeDWorkHelpBot or in our guide you can find more detailed information about how to install and configure a filament sensor.

#define FILAMENT_RUNOUT_SENSOR // 3DWORK Filament sensor

As with the limit switches, it is advisable to check the status of the filament sensor with an M119 command. This must appear TRIGGERED with filament and OPEN without filament. In the case that it seems inverted you will have to play with the value (LOW/HIGH):

#define FIL_RUNOUT_STATE LOW // 3DWORK Filament sensor

We can also indicate the filament distance we want since the sensor detects the failure in:

#define FILAMENT_RUNOUT_DISTANCE_MM 25 // 3DWORK Filament sensor

In the case that our filament sensor works by detection of filament flow (like the sensor of BigTreeTech Smart Filament Sensor) we must enable the following and take into account the previous point to adjust false positives:

#define FILAMENT_MOTION_SENSOR // 3DWORK Filament sensor

Self-leveling, as we mentioned earlier in the /Leveling section of our bot @ThreeDWorkHelpBot you have more detailed information on how to activate UBL self-leveling (the more advanced and advisable for beds of a certain size or with problems) and MESH that allows you to have a mesh without a sensor by doing the process manually.

In any case, for this example we will enable BILINEAR.


It is important to tell Marlin to enable self-leveling (G29) after a homing (G28), although in current versions it is no longer necessary but we advise enabling it.


In the case of BILINEAR, we will specify the number of points to perform per mesh in the next part of Marlin (by default it has 3 points per axis, 3 × 3 = 9 check points).

// Set the number of grid points per dimension.
#define GRID_MAX_POINTS_X 3 // 3DWORK Probe 

Another function that for security reasons we must enable is to perform a homing in the center of the heatbed. This helps us in two ways. The first is to ensure that the sensor has a surface to detect the limit switch.

The second would be to visually verify that our Offsets are correct, since the leveling sensor has to be perfectly positioned in the center of our bed.

#define Z_SAFE_HOMING // 3DWORK Probe 

EEPROM, in the EEPROM Marlin saves the configuration values of different functions so that they can be used by the system and changed by the user without having to modify Marlin source files, compile and upload the firmware at each change.

It is highly recommended to activate it and with our BTT Octopus we will not have memory problems.


Nozzle Park, in the example we are explaining we have added a filament sensor. For this to work we must activate NOZZLE_PARK_FEATURE.

Basically it will allow us to “park” the print head in a safe area to carry out this filament change. Although we do not have a filament sensor, it is still very advisable to have it active, since it allows us to improve the pause functions.

#define NOZZLE_PARK_FEATURE // 3DWORK Filament change

SD Card, if we want our dear Marlin to be able to read from our SD, either on the board or on a screen that is compatible (note that the Touch is not), we must activate the SD Card support.


Advanced Homing Menu, it is not necessary but it is highly advisable in the case of tests to enable this function that allows us to perform a separate homing of each axis.


“Configuration_adv.h” file

At this point, we’ve finished the first part of the setup. So we will go on to edit the advanced options. Let’s get to it!

Scroll and long file names, it is interesting to activate this function to be able to show the full name of the files to be printed. For it to work correctly we have to activate the following option.

#define SCROLL_LONG_FILENAMES // 3DWORK Improvements

SD connection, in “Configuration.h” we enable SD support and in “Configuration_adv.h” we will define where Marlin will try to use that SD from. Not all screens that have SD will work correctly.

We can select 3 options:

  • LCD: We will use the SD Card of the Marlin screen
  • ONBOARD: We will use the SD Card of the electronic board
  • CUSTOM_CABLE: We will tell Marlin that we will use an external reader connected to the board

Fans, we have 6 manageable fans. Before suggesting how to use them, we refer you to the definition of pins in Marlin

#define FAN_PIN                             PA8   // Fan0
#define FAN1_PIN                            PE5   // Fan1
#define FAN2_PIN                            PD12  // Fan2
#define FAN3_PIN                            PD13  // Fan3
#define FAN4_PIN                            PD14  // Fan4
#define FAN5_PIN                            PD15  // Fan5

For our example installation and for a single extruder we would perform the following fan configuration.

FAN0, in this case we are not going to make any changes to its role since it is the layer fan and this is managed by the slicer itself to cool the filament.

FAN1, in our example we are going to assign it to the hotend so that it is dynamically only activated when it is running. In this way we will avoid wear and tear and unnecessary noise:

#define E0_AUTO_FAN_PIN FAN1_PIN // 3DWORK FAN1 Assigned hotend
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 // 3DWORK FAN1 Activation at temperature
#define EXTRUDER_AUTO_FAN_SPEED 255   // 255 == Full speed

FAN2, To take advantage of this arsenal of manageable fans, we will assign FAN2 as the electronics fan dynamically. This will be activated when the drivers are in use, again minimizing wear and noise from the fan, and cooling our board and drivers:

#define USE_CONTROLLER_FAN // 3DWORK FAN2 Electronic managed ventilation enabled
#define CONTROLLER_FAN_PIN FAN2_PIN // 3DWORK FAN2 Assigned to electronics
#define CONTROLLER_FAN_EDITABLE // 3DWORK FAN2 Manageable GCode M710
#define CONTROLLER_FAN_MENU  // 3DWORK FAN2 Enable screen management menu

Babystepping, an almost essential function to have is Babystepping. This allows us to adjust the height of Z during a print (in real time) to manually “tune” this same height to our liking.

In our example we will enable that it can be activated with a double click on the encoder/button. This way it will always be available and will show graphical enhancements in the setting to understand the direction of the setting on the screen.

#define BABYSTEPPING // 3DWORK Improvements

Retries in case of failure in leveling, another very useful function is to be able to retry the homing process in case of errors. Sometimes our leveling sensor may have a specific failure and through this function it will allow us to try again a finite number of times.

#define G29_RETRY_AND_RECOVER // 3DWORK Improvements
#define G29_MAX_RETRIES 4 // 3DWORK Improvements

In case of using UBL leveling this option will not be available.

ARC support, a substantial improvement in the quality of our prints and also when we print through serial devices such as TFT, Octoprint, etc… It allows to simplify the gcodes commands, minimizing the number of movements and making them more fluid, also avoiding a large number of retractions.


To use it we must configure our slicer to apply these changes or in the case of Octoprint we can use a plugin. Regarding the changes in Marlin:

#define ARC_SUPPORT // 3DWORK Improvements

It is important to emphasize that in the case of enabling ARC for its use, it is advisable to use compatibility with S_CURVE.

Advanced paused, for it to work correctly we have to enable ADVANCED_PAUSE_FEATURE which enables the M600 command to change filaments. This can be done with or without a leveling sensor and requires NOZZLE_PARK for proper operation.

#define ADVANCED_PAUSE_FEATURE // 3DWORK Filament change

UART/SPI drivers configuration, with our UART/SPI drivers we have to correctly configure the advanced parameters that we will find in the HAS_TRINAMIC_CONFIG section.

Microsteps: Although we can configure from 16 to 256 microsteps, we do not advise you at all to use a value other than 16.

With these microsteps, the definition that we could achieve mechanically is practically impossible to achieve with normal printers. In addition to the TMC drivers already perform the interpolation themselves to always offer maximum reliability and precision.

Reliability is another important aspect when it comes to microstepping. The stepper motors that our printers carry lose torque (and steps) at high revolutions so increasing this definition of steps will exponentially increase the percentage of reliability and therefore that our parts do not come out correctly.

In the following example we can see how we have 16 microsteps for our X axis.

#define X_CURRENT 650 // (mA) RMS current
#define X_MICROSTEPS 16 // 0..256
#define X_RSENSE 0.11
#define X_CHAIN_POS -1

Another important value of the previous values is CURRENT, where we will adjust the current of our motors. You can also adjust them from the LCD from Settings / Advanced / TMC along with other options that we will explain below.

STEALTHCHOP, it is important to enable it if we want our motors to be “silent”, since if it will not be working in SpreadCycle mode, which is the power mode.

#define STEALTHCHOP_XY // 3DWORK Drivers
#define STEALTHCHOP_Z // 3DWORK Drivers
#define STEALTHCHOP_E // 3DWORK Drivers

Although rare, some extruders may work better with StealthChop mode disabled. If this is our case, we will comment on the following line.

//#define STEALTHCHOP_E // 3DWORK Drivers

CHOPPER TIMING, is used by StealthChop for the synchronization of signals to the motors. This has to match the voltage used in our printer, in the case of Ender 3 and normally in all 24V printers.


Monitor Status, this function allows Marlin to control in detail all the parameters of the drivers to be able to adjust, for example, their temperature. This will prevent more serious problems later.


Hybrid Threshold, another interesting function is Hybrid Threshold, which allows Marlin to switch between StealthChop (silence) or SpreadCycle (power) dynamically based on the speed of movements.

#define X_HYBRID_THRESHOLD 100 // [mm/s]

Here we will use the values indicated for an Ender that are 100 mm/s for X Y and 15 mm/s for Z. Although we can adjust it to our needs.

TMC Debug, in this case it is a MONITOR_DRIVER_STATUS requirement that we must enable and it will allow us to have the M122 command accessible. Certainly very useful to obtain advanced information on the status and configuration of our drivers.


“Pins” files of the BTT Octopus

Here are the paths of the “Pins” files that contain the references for this board, and that you can find within the sources of the Marlin firmware:

  • BTT Octopus v1: …/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_0.h
  • BTT Octopus v1.1: …/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_1.h
  • BTT Octopus common: …/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h

Marlin flashing instructions

Very simple, we just have to copy our “firmware.bin” file to the root of the SD formatted in FAT32, insert the SD in the module slot and wait about 30 seconds for it to finish the process.

Once finished, the “firmware.bin” file will be renamed to “firmware.CUR”, which we can save as a backup (remember that a compiled firmware cannot be modified, this process can only be can be done with the source files of your firmware and recompiled).

An interesting alternative, only for advanced makers, is the possibility of updating through DFU which we will explain later.

Firmwares Klipper

Klipper is an open-source firmware for our 3D printers that mainly use the power of a Raspberry Pi to control all electronics, although it can be mounted on many more devices.

In this way your printer will be able to operate with greater speed and precision, always depending on the hardware that we have at our disposal.

Something that Klipper will allow us in any case is to be able to have a lower-level control of our machine. Although requires extra knowledge and efforts, it will give us greater speed when applying any changes and a remote control of our first class machine.

It is important to emphasize that if we come from other systems Klipper may have some restrictions regarding compatibility with components or with certain functions that we now have in our printer.

On the other hand, we have very interesting control functions of our printer, such as Pressure Advance (similar to Marlin’s Linear Advance) and Input Shaper which will greatly improve speed and quality.

Raspberry Pi connection to the Octopus BTT

As we have already mentioned, the heart of Klipper runs in a Raspberry Pi. We have already commented on different ways of connecting this to our BTT Octopus, but for our example we will use the simplest one, which is directly using a USB cable- C .

GPIO detail
Schematics from Thomas White
USB-C connection
USART connection and power through Octopus

Klipper firmware generation


For Klipper to control our Octopus it must contain a firmware which we can obtain in different ways:

  • Using the precompiled firmwares that we can find on the official Bigtreetech Github:
    • firmware-USB.bin in the case we use the connection between our Klipper and Octopus via USB-C
    • firmware-USART2.bin in this other case we will use the USART2 connection to communicate both components
  • Compiling our own firmware:
    • We can follow the official Klipper documentation to install it. We also recommend using Kiauh, Fluidd Pi has an image that facilitates much the installation process of all the necessary components.
    • Following the previous documentation we will go to the Building the micro-controller option using this configuration:
      • [ *] Enable extra low-level configuration options
      • Micro-controller Architecture = STMicroelectronics STM32
      • Processor model = STM32F446
      • Bootloader offset = 32KiB bootloader
      • Clock Reference = 12 MHz crystal
      • If we use USB -C
        • Communication interface = USB (on PA11/PA12)
      • If we use USART2
        • Communication interface = Serial (on USART2 PD6/PD5)
    • The firmware “klipper.bin” will be generated in the home/pi/klipper/out folder. If Klipper is not able to copy it directly to the SD of our Octopus, we can manually copy it to the SD using WinSCP or the pscp command in the CMD.

And to update our BTT Octopus to Klipper firmware, simply rename the firmware created/downloaded “firmware-USB.bin”, “firmware-USART2.bin” or “klipper.bin” to the typical file “firmware.bin”, which is the default name used by the Octopus BTT bootloader to update itself.

Klipper basic configuration

Using as reference the official Klipper documentation to install it we will use the configuration file “Octopus klipper.cfg” as the basis for our “printer.cfg” which includes the correct pinout level definitions for our BTT Octopus.

You can use the Klipper configuration documentation to enable the functions that interest you the most. If we are going to use USB-C to communicate Klipper with our BTT Octopus we will execute the following command from Klipper.

  • ls /dev/serial/by-id/*

From Kiauh we have in its menu a quick and easy way to carry out this action, to identify the correct ID of our electronics and add it to our “printer.cfg” file.

serial: /dev/serial/by-id/usb-Klipper_stm32f446xx_0E002B00135053424E363620-if00
  • If we use USART2 to communicate, we will need to modify some settings on our Raspberry Pi directly on the SD from the computer or in the most comfortable and advisable way, which is through an SSH terminal.
    • Delete or comment out the line console = serial0,115200 in /boot/cmdline.txt
    • Add dtoverlay = pi3-miniuart-bt > at the end of the file /boot/config.txt
    • Modify the [mcu] configuration in “printer.cfg” to serial: /dev/ttyAMA0 and enable restart_method: command
serial: /dev/ttyAMA0
restart_method: command

Klipper UI setup for LCD / TFT

To enable the Klipper UI on LCD/TFT screens we have the following examples:

One of the most widespread LCD screens also known as RepRapDiscount Full Graphic Smart Controller. To enable them we will configure the [display] section in “printer.cfg” as follows:

lcd_type: st7920
cs_pin: EXP1_4
sclk_pin: EXP1_5
sid_pin: EXP1_3
encoder_pins: ^EXP2_5, ^EXP2_3
click_pin: ^!EXP1_2
kill_pin: ^!EXP2_8

[output_pin beeper]
pin: EXP1_1

Another of the screens most used by its size, cost and functionality of LEDs. To enable them we will configure the [display] section in “printer.cfg” as follows:

lcd_type: uc1701
cs_pin: EXP1_3
a0_pin: EXP1_4
rst_pin: EXP1_5
encoder_pins: ^EXP2_5, ^EXP2_3
click_pin: ^!EXP1_2
## Some micro-controller boards may require an spi bus to be specified:
#spi_bus: spi
## Alternatively, some micro-controller boards may work with software spi:
contrast: 63
spi_software_mosi_pin: PA7
spi_software_miso_pin: PA6
spi_software_sclk_pin: PA5

[output_pin beeper]
pin: EXP1_1

[neopixel btt_mini12864]
pin: EXP1_6
chain_count: 3
color_order: RGB
initial_RED: 0.4
initial_GREEN: 0.4
initial_BLUE: 0.4

Bigtreetech dual TFTs are all terrain and the best screens for our printers in our opinion. They have a perfect emulation mode to use in Klipper.

To enable them we will configure the [display] section in “printer.cfg” as follows:

lcd_type: emulated_st7920
spi_software_miso_pin: PA6
spi_software_mosi_pin: EXP1_3
spi_software_sclk_pin: EXP1_5
en_pin: EXP1_4
encoder_pins: ^EXP2_5, ^EXP2_3
click_pin: ^!EXP1_2

[output_pin beeper]
pin: EXP1_1

Firmwares RepRap

The versatility of the BTT Octopus is total, as we mentioned previously. After talking about the different configurations in Marlin and Klipper, it would be the turn of the RepRap firmware.

However, given its complexity, we refer you to the official Bigtreetech repository where you can easily find (and download) the versions prepared for our electronic BTT Octopus.

Update via DFU

Our Octopus allows us to update it through DFU, which will allow us to upload firmware or bootloader in case the normal process does not work using the USB-C cable.

Since it is not a recommended process for inexperienced users, we leave you the link to Bigtreetech document where it explains the process.


Once the whole process is finished, regardless of the type of firmware you have deployed on your 3D printer, please initially check all these points one by one:

  • Check limit switches using a terminal (Pronterface) with the M119 command
  • Validate individually the Homing of each of the XYZ movement axis and if it is It is necessary to reverse the motor rotation in some axis
  • Verify that the thermistors show the correct temperature
  • Verify that your heatbed and hotend heaters work correctly
  • Perform the Initial Calibration that you can find in our bot in the /Calibration section

Well, it has been a fairly long guide, I have to admit it, but we think that it has a great value content for anyone who acquires high-performance electronics, such as the BTT Octopus.

We sincerely hope that it can be useful for the configuration of these new electronics. And if you like it, share it on your social networks, will help us maintain the project and develop more technical documentation.

As always, you can leave your comments or doubts at the end of it, or visit us on our Telegram channel at next link.

As always, you can read other interesting articles on our blog:

3D enthusiasts