Flash Arduino without a Bootloader from a Raspberry Pi

Flash Arduino without a Bootloader from a Raspberry Pi

November 6, 2019
Linux, Electronics, Arduino

To keep things short: I’ve had an Anet A8 3D printer for a while now and wanted to flash an updated version of its Marlin firmware. For some reason however, the bootloader was broken. So I couldn’t flash it with avrdude by simply using a USB cable. For this case you can find lots of tutorials on how to flash Arduino boards with a second Arduino. I didn’t have a second Arduino at the time though … so why not just bit-bang it from a Raspberry Pi instead?

FT232H Update #

I found out that you can also use FTDI breakout boards like the SparkFun FT232RL or Adafruit FT232H. The drivers come preinstalled on Linux. I’ve documented the cabling and configuation in my wiki.

GPIOs on a Raspberry Pi #

Luckily I purchased a Raspberry Pi Zero W shortly before and I’ve quickly found configuration examples how to use GPIO pins to program an Arduino. Most examples use pins spread all around the header though and I wanted to use a more compact footprint to ease wiring with Dupont cables a little.

There’s a block of pins on the Raspberry header from pins 19 to 23 labelled with MOSI, GND, MISO, SCLK .. perfect! Please use the following beatiful ASCII graphics to help with wiring the Raspberry to the Anet’s J3 header. You’ll only need five female-to-female jumper cables:

      Anet J3         |          Raspberry Pi Header
      -------         |  ..
 3.3V | . . | SS      |  ..            | . . |
  GND | X X | Reset   |  17       3.3V | . . |
 MOSI | X X   SCK     |  19  (10) MOSI | X X | GND
   5V | . X | MISO    |  21  (09) MISO   X X | Reset (25)
   TX | . . | RX      |  23  (11) SCLK | X . |
      -------         |  ..            | . . |

The X-es indicate a connected wire. The six center pins on the Anet J3 header should correspond to any other Arduino 6-pin ISP header, so you can make a more permanent cable if you like, too.

I powered the Anet board externally with its usual power supply. Do not attempt to connect the 5V pin to your Raspberry Pi. You’ll likely just draw too much current and shut your Pi down.

avrdude Configuration #

When everything is connected, install avrdude and append the following to the global configuration file in /etc/avrdude.conf:

# avr programmer via linux gpio pins
  id    = "gpio";
  desc  = "Use the Linux sysfs to bitbang GPIO lines";
  type  = "linuxgpio";
  reset = 25;
  sck   = 11;
  mosi  = 10;
  miso  = 9;

Afterwards connect to your board with something like:

sudo avrdude -p m1284p -c gpio -v

Obviously substitute the correct part if you’re not using an Anet A8 (Sanguino ATmega1284p).