Bootloader + Firmware upgrade (RPi & Arduino)

I recently purchased an Ender 3 and I wanted to get the firmware upgraded for a multitude of reasons. This was challenging because although there are a ton of resources, the information was all over the place. I needed a consolidated guide but couldn't really find one.

I managed to do it somehow but I thought I can help others by making a step-by-step guide, so here goes.

Steps to flash bootloader with Arduino:

  1. Teaching Tech explains how to flash the bootloader in this video. Watch this until 08:56 and then follow the steps below to flash Marlin 1.1.9

Steps to flash bootloader with RPi:

  1. Follow u/n00bsen's guide on how to flash the bootloader. The guide is beautifully explained and is easy to understand, with pictures. Full credit to him. I have tried with RPi B and it works. Link: //imgur.com/gallery/4kIDSpv

Steps to flash firmware:

  1. Download the latest Marlin release from https://github.com/MarlinFirmware/Marlin
  2. Unzip the firmware folder and go to Marlin>example_configurations>Creality>Ender-3. Copy all the files and copy them into the root Marlin folder. Replace the required files. Now the firmware is configured for the Ender 3.
  3. Open Marlin.ino in Arduino IDE.
  4. Add the Sanguino board to the board manager by pasting this Link in File>Preferences>Additional Board Manger URL's. Go to Tools>Board>Board Manager. Search for Sanguino and install it. Now select it on Tools>Board.
  5. Now you need to include a library called U8Glib. Download the U8Glib zip from Link and go to Link to check which version is compatible. Currently U8Glib 1.1.17 is supported.
  6. In Arduino, go to Sketch>Include Library> Add .ZIP Library. Navigate to the U8Glib zip and select it.
  7. Make sure the processor is ATMega 1284 (16 MHz) in Tools>Processor.
  8. Go to configuration_adv.h and uncomment the following:
    #define arc_support
    #define MESH_BED_LEVELING
    #define POWER_LOSS_RECOVERY <-- Optional. Supposedly reduces SD card lifetime.
  9. Go to configuration.h and uncomment the following:
    #define LCD_BED_LEVELING
    #define DISABLE_BOOT<-- To save space when mesh bed levelling is enabled
    #define SLIM_LCD_MENUS <-- To save space when mesh bed levelling is enabled
    #define SPEAKER <-- To save space when mesh bed levelling is enabled
  10. If you have the newest Ender 3 revision, the printable area has been increased.
    In configuration.h, by default it is set to:
    #define X_BED_SIZE 220
    #define Y_BED_SIZE 220
    Replace it with:
    #define X_BED_SIZE 235
    #define Y_BED_SIZE 235
  11. Once these are done, compile the code. It should compile without errors.
  12. Upload the sketch to the printer via the USB port. Make sure the COM port is correct.
  13. Disconnect everything and restart the printer. The firmware is now flashed along with all the features.
  14. Make sure to perform mesh bed levelling as shown here: Link
  15. Remember to store the mesh bed levelling settings.
  16. Also, add the line M420 S1 after G28 in the Cura printer settings so that the printer refers to the mesh bed levelling settings before each print.

I cannot stress how good mesh bed levelling is. It is a lifesaver and is absolutely a must, as is the thermal runaway protection that the firmware offers.

Note: I have the latest revision of the Ender 3 and I had read that the new board (V1.1.4) has a bootloader built in so I tried to flash Marlin directly through the USB port. Unfortunately, that doesn't work, so don't try it.

If anyone has any inputs or suggestions, please leave a comment and upvote the ones that you agree with.

EDIT: added new bed area command for the latest revision (235x235x250)

Credits: u/n00bsen, Teaching Tech & Thomas Sanladerer.