Marlin 2.0 using Makefile (and reclaiming io-pins on atmega1284p based mainboard)

I am using Marlin 2.0 to control my 3D printers, I like to be in full control so I compile my own firmware, adding my own tweaks. Most people probably use the Arduino IDE to compile and install the firmware – I am more to vi and Makefile

This post will cover how I set up my system so I can compile Marlin for multiple mainboards , while sharing the same source-code-tree, the boards/printers covered here are:

  • MKS GEN v1.3 using atmega2560 as used on Tevo Tarantula
  • Melzi 2.0 using atmega1284p as used on Tronxy X1

Marlin has a Makefile which with a little tweaking can compile the firmware, but there is no provision to have a common source-tree to compile for different boards/cpu’s. Let us change that.

The goal is to have a subdir per board which contains the configuration files, and object-files used during compilation. Here is how I would compile new firmware for the two printers :

The per board Makefiles I created are quite small, it includes the standard Makefile which contains the bulk of the rules, The Configuration files typically comes from and the Marlin source is from

Makefile for Tevo Tarantula

Makefile for Tronxy X1, LCD via i2c

For my Tronxy X1 the Makefile is a bit more complicated, mostly because I have modded the hardware, The Tronxy X1 is using an atmeaga1284p as CPU, the little sister to the atmega2560 with less pins and half as much FLASH. I needed an extra io-pin for a filament sensor, but there is no unused inputs, so I converted the LCD to be accessed via i2c, which uses 2 io-pins instead of 6. Marlin has support to use a 20×4 character lcd connected via i2c and a pcf8574 so the change is not complicated, but FLASH is limited, so I had to replace the i2c-driver with a leaner one.

Modifcation to Marlin Makefile

My Makefiles over-ride some of settings used in the standard Makefile which is included in the end. This requires a few trivial changes is in the Marlin Makefile, ?= means that variable will only be set if not set already, and += appends a setting instead of just overriding it, some #ifdef to opt out of using the standard LCD-library, and lastly SRC_DIR can be set to direct the Makefile where to find the source-files, see the diffs below:

One of the include files also need to be modified to be able to find the configuration files in their new position.

These changes should not change Marlins ability to be compiled under the Arduino IDE.

Changes to let Tronxy X1 access its LCD via i2c

The Tronxy X1 uses a Melzi 2.0 mainboard and a 20×4 LCD with 5 buttons which is read via one analog input. I want to change the output to the LCD to go via i2c, the i2c-LCD-interface boards are available from Aliexpress for next to nothing. and takes over the control of the LCD, I just unsoldered the LCD, drilled out the holes in the current LCD/buttton-pcb, and had the connections run through to the new i2c-LCD board, scl/ada happens to be part of io-pins going to the board already, so these together with VCC  and GND are connected.  The buttons works as usual.  Check the photo above.

The Tronxy X1 Configuration file just need a number of #define, and two files in the Marlin distribution needs an #ifdef, the diffs are below

The modification to Configuration.h, most of it is documentation.

And voila a controller board has been saved from going to the landfils

Print Friendly, PDF & Email
This entry was posted in 3D printer, Arduino. Bookmark the permalink.