Marlin ported to the TMC2209 board

I just got Marlin to boot and move the motors. Had to make some tweaks to the serial port configuration, because I have unique setup (X, Y and Z share one serial port) and the two extruders share another. I also use proper hardware serial ports, not the SoftwareSerial library. At the moment the code requires special patches to the STM32Duino core and the Trinamic library so it can properly support serial half-duplex communication.

On separate topic, I got a prototype of an LCD i/o board for the Nucleo-F407. I tested it with the REPRAP_DISCOUNT_SMART_CONTROLLER and was working flawlessly.

Here it is connected to my soldering machine:

The very first prototype had a bug, hence the little red wire. This adds support for the traditional EXT1 and EXT2 connectors that are popular with other boards. Graphics panels would require a little work, to convince marlin to use the second SPI hardware block.

Some early experiments with the TMC2209 board

Good news first: I managed to get one motor moving with a simple Arduino sketch.

I’m starting to hate QFN packages with a passion. I spent a whole afternoon trying to re-work two pesky drivers. The chips would not communicate via the UART port, no matter what I tried. Finally traced the issue to a bad solder joint on the QFN package and boy these are hard to spot. Simply re-heating the drivers and re-positioning was not enough, I had to remove the chip, add more solder paste, melt it, then re-insert the chip, wipe the excess solder with a soldering iron and finally re-flow the chip one more time. Complete and total PITA.

To top it off this destroys any near by plastic connectors, so now I have the drivers in-place but have to re-solder the connectors back. This would be an endeavor for the next week.

Now all 5 steppers are communicating with the MCU reliably. I had to add support for half-duplex mode to the stm32duino core. The proposed changes are still pending, but I verified that the TMCStepper library is able to communicate with the drivers.

First prototype of the TMC2209 design

This took me whole day. Working with QFN drivers is plain PITA. It does look good though. I just hope it works.

I finally figured out how to wash most of the flux from the board. It is still not perfect, but looks really good.

I have another revision with 3 fuses. I figured that one fuse for both motors and extruder heaters may be too taxing. In my latest design I have one 15A fuse for the heated bed; one 10A fuse for the extruder heaters and one more 10A fuse for the rest of the electronics.

Added some useful features to my Marlin fork

I maintain a separate fork of Marlin with some tweak that enabled features specifically for the PRNTRBoard. The code is located in github.com .

Last weekend I spent some time adding some minor, but useful updates. First I finally got to enable support for the sd-card reader on the Nucleo-F407 board. It took a while because typically Marlin uses SPI to communicate with the sd-card. However the STM32 has much better hardware module (SDIO) which allows excellent transfer speed.

So it took some time to research what is the simplest way to add SDIO support to the Marlin firmware. There was already support for the STM32F1 series CPU, but it was written using a deprecated library (libmaple). Long story short it is working fine now. The code is in the f407 branch.

The second feature I wanted to enable is the ability to store the printer settings. Usually this is accomplished using I2C or SPI EEPROM chip. Alas I did not add one to the Nucleo-F407 board. I added an SPI flash instead.

The difference is small but significant. EEPROM chips are small, but can sustain millions of data re-writes. In contrast SPI flash chips are relatively large (the one I use is 2MB), but can only support around 100k re-write cycles.

There were two possible approaches, one use the sd-card as storage. This was already supported in the Marlin firmware, so I simply ported to code. The disadvantage is that it depends on the presence of an sd-card in the slot.

The second approach is called wear leveling – using the fact that I have relatively large storage and spread the writing operations across many locations in the chip. This way if I spread the write operation evenly across 100 separate locations I’ll achieve 10 million re-write cycles.

The error leveling code is relatively simple. For the curious you can find the changes here.

Next I finally decider to make a converter board for RAMPS style LCD controller modules. The files are checked in the main PRNTRBoard github repository. I placed and order for a few prototypes – they should be arriving in a week or so.

Controller brain – replaced

While I was working on porting Smoothieware to run on my 3D printer controller, I was going back and forth between my trusted NUCLEO-64 F446 devkit and a new acquisition from china – the “Black VET6“. That was a very capable board with onboard SPI EEPROM, battery backup, micro SD card and USB connector – all this for less that $10 from aliexpress.

While the NUCLEO has the advantage of build-in ST-LINK debugger, I was missing the SD-CARD connector and the extra pins to work with.

The NUCLEO-64 uses only 64-pin micro-controller package and I was running out of available IO pins. For example on the Rev3 of my controller I has to use every last pin to be able to connect an LCD screen – and even then sharing the SPI bus between the screen and the TMC drivers was causing some issues.

Here comes a proposed solution for this issues: a NUCLEO-64 form factor board designed with a 100-pin MCU (STM32F407VE):

This was my very first try and I did not have all parts available yet, so you can see some unpopulated pads.

The board is the same size as NUCLEO-64, and has the same dual row connector on the back:

Here is a “fuzzy” picture of the two boards side by side:

The USB connector is micro-usb, which I think is more available. There is a micro-sd card slot and a plethora of expansion ports for future extensions like LCD panel, WiFi module or even more extruders.

I also added some SPI EEPROM so we can save settings etc. Last but not least there is a power supply module which provides 5V up to 3A from 12 to 24V input. The 5V and 3.3V from the CPU board are connected to the motor controller board so there is no need for an external 5V buck converter anymore.

The only slight disadvantage is that now I have to use external ST-LINK adapter to program the board and an external serial-to-usb adapter for debugging.

Here is a little video comparing the two boards side by side: