I had trouble with the quality of my prints via USB (and/or Octoprint) since switching from printing from the printers SD card. Zits, blobs and other issues plagued my printing experience.
It took me a while until I realised that the USB part was the issue, as I rarely printed from the SD card, due to the inconvenience.
So I started doing some research and after tweaking my Marlin firmware, I got the print quality from USB equal to that of the SD card. Great!
So.. What's the problem?
The default BAUDRATE of the Ender 3 in the Marlin firmware is very low. Along with low buffer sizes due to the memory limitations of the Ender 3 motherboard, it all adds up to the printer not being able to receive commands fast enough over USB. You'll see the print-head pause momentarily, and that's when you get blobs, zits etc.
Changing the BAUDRATE and making buffer sizes larger, allows the printer to receive commands fast enough to eliminate those pesky pauses.
By disabling some niceties that are unnecessary (like the Ender 3 boot logo for instance) we can free up enough space to allow for larger buffers.
Here are the values I used in Marlin:
#define BAUDRATE 250000
BAUDRATE is located in Configuration.h, the rest of these options are located in Configuration_adv.h
(the if statement is redundant here now, but I decided to keep it in case I wanted to have individual values for when using SD or not later)
#define BLOCK_BUFFER_SIZE 64 // SD,LCD,Buttons take more memory, block buffer needs to be smaller
#define BLOCK_BUFFER_SIZE 64 // maximize block buffer
#define MAX_CMD_SIZE 96
#define BUFSIZE 32
#define TX_BUFFER_SIZE 32
You may need to disable some features in Marlin to compile with these options tweaked (to give you enough spare dynamic memory). I used
disabled ARC support and removed the LCD boot dragon graphic. Those changes alone should give you enough room. Ideally, you want at least 30% of the dynamic memory available. Some people say you could get away with 10%, but in my opinion, that is too low.
How do I disable something in Marlin?
If it's a define statement, you can disable it by using two forward slashes before the hash symbol. i.e.
//#define SOMETHING 1
After making these changes to the firmware (either TH3D or Marlin 1.1.9), re-flash it to your printer and reconnect to Octoprint (if you're using it). If you're using OctoPrint, be sure to change your BAUDRATE to 250000 in the connection section before reconnecting.
Once you're done, I recommend printing the same object twice. Once via the SD card and the next via USB. Then compare the quality of each print.
How do I flash firmware?
All3DP have a great guide that will walk you through the process.
Let me know how you get on! If you have any questions, feel free to ask in the comments.
NOTE: This solution will only allow you to match the print quality you get when printing directly from the SD card in your Ender 3. If you still experience issues after implementing this solution, then you need to look at your slicing settings (retraction etc), belt tightness and so on to resolve any remaining issues.
As always, if you found this useful, I greatly appreciate any Tips, via the "Tip the designer" button. The amount doesn't matter, even enough for a cup of coffee is wonderful.
I have included the Chep calibration cube that is good for doing test comparison prints between USB and SD. Thanks Chep!