Wanhao Maker Select v2.1 Firmware Upgrade

Wanhao Maker Select v2.1 Firmware Upgrade (Last Updated On: )

It has been a while since my last post, I have not been fiddling with “blinking lights” for a little while now. I got a dog and life just happens. But I have felt the itch lately and decided to jump into some shit tonight – upgrading the firmware on my Wanhao Maker Select v2.1! There are no actual guides that I have found to be able to follow to flash the firmware (for this particular make/model). All of the information is out there but it seems to be mostly on Reddit and it is scattered across a few posts. Most of what I have found links to two guides; a YouTube video of how to flash the bootloader to the Melzi board, and an Instructables on how to do the same thing. That is basically all you really need but it came off as confusing to me so I am sure it will to someone else as well.

Basically what you need to do is a 2-step process. 1) Flash a bootloader to the Melzi board, and then 2) Flash the actual firmware to the Melzi board. You WILL NEED an Arduino of some sorts, any Arduino should do. I used a Duemilanove and it worked, and that thing is old. You will also need six (6) jumper wires (male to female most likely). You need to connect the wires from the Melzi board to the Arduino so you will also need to take the control box apart. You only need access to the Melzi board to flash the bootloader. Once the bootloader is flashed you can pack it all back up. The firmware is flashed via the Melzi’s USB port. So lets get to it!

Your Arduino IDE should be up to date and you will need the Sanguino board installed as well as the U8glib library (There is a different/older version linked to in the YouTube video, 1.14).

  1. Take the control box apart, I left the Melzi board in the can, you don’t need to fully remove it, less you want to. You just need access to the pins and the LCD.
  2. Put the auto-reset jumper on if you have it removed.
  3. Change the board power selector from VREG (AC) to USB, this lets us power the Melzi from the Arduino.
  4. Unplug the LCD (it will mess up the bootloader flashing process I have read, no harm in removing it temporarily. I also had issues until I unplugged the heatbed MOSFET also).
  5. Connect the wires from the Arduino to the Melzi.
  6. Connect the Arduino to the PC/Mac.
  7. Flash the Arduino to be used as an ISP.Open the example: ArduinoISP
    I had to add a line to get the flashing process to work, this may be due to the old Duemilanove I am using.
    I had to add #define USE_OLD_STYLE_WIRINGBoard: Your Arduino type Port: Your correct Arduino port Then click upload
  8. Now flash the bootloader (after you change the board settings).Board: Sanguino Port: Your same Arduino port Programmer: Arduino as ISP Then click Tools > Burn Bootloader
  9. Remove the Arduino from the PC/Mac, and remove the wiring from the Arduino to the Melzi. The Arduino is no longer needed.
  10. Place the jumper back on VREG not USB.
  11. Plug the LCD back in.
  12. Put all your crap back together (or leave it apart to make sure it all works!).
  13. Plug AC power back in.
  14. Plug the Melzi into the PC/Mac (change the board settings again).Board: Sanguino Port: the port of the Melzi board Programmer: AVRISP mkII Flash/upload the new firmware
  15. Print something!

Thats the whole process. The part everyone leaves out is how to flash the firmware, even though it is dead simple as plugging in a USB cord it is never mentioned. Something also never mentioned is how to configure Marlin to work on the Maker Select. The default Marlin is too large to fit, some things must be removed. I have not found a guide on how to configure it and or what to configure. But I did find a pre-set Marlin configured already for the Maker Select. This is what I am using. You have a few choices as far as I know; Marlin, Repetier and TH3Ds Marlin.

Update: Something I feel I didn’t make clear was flashing/updating the firmware. Step 14 above is the flashing part. Flashing the firmware the first time (after your bootloader is installed) is the same as flashing the firmware with future updates to your printer. With the printer in normal running condition, turn on the AC power. Connect your printer with the Arduino IDE open to your printer. Maker sure the board selected is Sanguino and the port is the port of the Melzi board that appears with the programmer: AVRISP mkII. Then with Marlin.ino open (or whatever firmware you’re using) select upload (or verify first to make sure it will compile). The firmware should upload and you should be good.

I chose the Marlin firmware preconfigured for the Maker Select v2. But I ran into an issue with the LCD screen being garbled. I also believe this is just a general Marlin firmware issue with Maker Selects and not just this specific version. But no fear! I found the fix online!

You need to edit a file in Marlin.ino, specifically ultralcd_st7920_u8glib_rrd.h around line 86 add the 2 NOP, this will fix the garbled LCD:
(You only need to do this if you LCD screen is garbled after flashing Marlin!)

This is the Reddit that I kept coming across: https://www.reddit.com/r/3Dprinting/comments/8o3wg8/installing_marlin_on_maker_select_v2/
This is the video on flashing the bootloader that seems to be popular: https://www.youtube.com/watch?v=ejpSniiJejI
This is the Instructable that shows the same thing as the YouTube video: http://www.instructables.com/id/Using-an-Arduino-to-Flash-the-Melzi-Board-Wanhao-I/
This is where I found the LCD fix: https://www.reddit.com/r/3Dprinting/comments/9i0n6z/maker_select_v2_lcd_issues/

Link to Sanguino board
Link to the U8glib library
Link to the preconfigured Marlin 1.1.x for the Maker Select v2.1

Some useful Thomas Sanladerer videos I found after I did my upgrade 🙁
Configuring thermal runaway
How to setup Marlin firmware

This was how I did it on my printer, I take no responsibility for anything that may happen to yours. Try this at your own risk.

Discover more from Its_All.Lost

Subscribe to get the latest posts to your email.


  1. January 3, 2020 / 7:59 pm

    Thanks for all of the information! I had come across the video on how to flash the bootloader, but wasn’t paying attention closely enough and didn’t realize that I had to have my PC connected via USB to not only the Arduino but also to the Melzi board (somehow I had gotten it into my head that not only was the Arduino used for flashing the bootloader, but the firmware itself). This post helped me fill in the gaps, and I successfully flashed my Monoprice Maker Select V2 with Marlin 1.1.9 as a result.

    I did have the same garbled LCD issue afterwards, and while adding the two NOPs as you illustrated certainly improved the display, it didn’t fix it entirely. But it set me on the right path, and I found this bugfix thread: https://github.com/MarlinFirmware/Marlin/issues/11509

    These lines in ultralcd_st7920_u8glib_rrd.h did the trick for me:
    #define ST7920_DELAY_1 DELAY_NS(70)
    #define ST7920_DELAY_2 DELAY_NS(290)
    #define ST7920_DELAY_3 DELAY_NS(70)

    I could probably tweak the timings a bit more, but the display already seems much snappier in response than the stock firmware was.

    • Ryan
      July 23, 2020 / 8:07 pm

      I also had issues with the lcd after adding the NOPs and then found this:

      #define DELAY_0_NOP NOOP
      #define DELAY_1_NOP __asm__(“nop\n\t”)
      #define DELAY_2_NOP __asm__(“nop\n\t” “nop\n\t”)
      #define DELAY_3_NOP __asm__(“nop\n\t” “nop\n\t” “nop\n\t”)
      #define DELAY_4_NOP __asm__(“nop\n\t” “nop\n\t” “nop\n\t” “nop\n\t”)
      #define ST7920_DELAY_1 DELAY_2_NOP
      #define ST7920_DELAY_2 DELAY_2_NOP
      #define ST7920_DELAY_3 DELAY_2_NOP

      Which made it work perfectly

  2. T Watson
    April 22, 2021 / 8:35 pm

    Thanks much for this. Before I read all the comments to look at other solutions, I just added another nop, and it worked for me.

    #define ST7920_SND_BIT \
    WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \
    __asm__(“nop\n\t”); \
    WRITE(ST7920_DAT_PIN, val & 0x80); ST7920_DELAY_2; \
    __asm__(“nop\n\t”); \
    WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \
    val <<= 1

Leave a Reply