Arduino – Firmware I/O met AVRdude

arduino logo donker

In dit voorbeeld laten we zien hoe je de Arduino code vanaf een arduino kan halen en op een ander arduino board kan zetten met behulp van AVRdude, je kan dus bijvoorbeeld een code van een arduino UNO ook 1-op-1 overzetten op een Arduino NANO.

Hoe werkt het eigenlijk?
De C++ code die je programmeert in de Arduino IDE wordt bij het uploaden van de code naar de Arduino omgezet naar Assembler (via avr-gcc) en daarna omgezet naar een HEX bestand en dan geupload (via avrdude) naar de Arduino.
Meer informatie hierover is te vinden hier.

Je kan dus ook de code via AVRdude van de arduino afhalen en naar een (HEX) bestand wegschrijven.

Wat heb je nodig?

1) AVRdude

Firmware van de arduino afhalen:

Maak een folder aan /var/arduino, commando:  sudo mkdir /var/arduino

Voorbeeld van een Arduino UNO op /dev/ttyACM0:

sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:r:/var/arduino/blink.hex:i

Toelichting:
-v = uitgebreide informatie
-c = geselecteerde programmer
-P = connectiepoort ttyACM* of ttyUSB*
-U = flash=geheugentype:[r=read/w=write/v=verifieer]:bestandsnaam:i=intel HEX formaat

Dat was het, er is nu een bestandje aangemaakt, je kan de inhoud van het bestand bekijken met het commando:  cat /var/arduino/blink.hex

Firmware naar de arduino schrijven:

Voorbeeld van een Arduino UNO op /dev/ttyACM0:

sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:w:/var/arduino/blink.hex

Toelichting:
-v = uitgebreide informatie
-c = geselecteerde programmer
-P = connectiepoort ttyACM* of ttyUSB*
-U = flash=geheugentype:[r=read/w=write/v=verifieer]:bestandsnaam:i=intel HEX formaat

Arduino UNO voorbeeld:

Nu staat het “blink” programma er weer op!

Voor de Arduino NANO moet je de juiste baudrate opgeven  -b 57600 en om te schrijven de  -F parameter opgeven, anders werkt het niet!, hier volgt een samenvatting (voorbeelden):

Arduino MEGA voorbeeld:

Linux

Arduino UNO R3 (hardware version 3 / firmware version 3.3):

FIRMWARE > BESTAND:  sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:r:/var/arduino/blink.hex:i
BESTAND > FIRMWARE:  sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:w:/var/arduino/blink.hex

Arduino UNO (funduino)  (hardware version 3 / firmware version 4.4):
FIRMWARE > BESTAND:  sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:r:/var/arduino/blink.hex:i
BESTAND > FIRMWARE:  sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:w:/var/arduino/blink.hex

Arduino NANO v3.0 (hardware version 2 / firmware version 1.16)
FIRMWARE > BESTAND:  sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyUSB0 -b 57600 -U flash:r:/var/arduino/blink.hex:i
BESTAND > FIRMWARE:  sudo avrdude -F -v -c arduino -p ATMEGA328P -P /dev/ttyUSB0 -b 57600 -U flash:w:/var/arduino/blink.hex

Windows

FIRMWARE > BESTAND:  avrdude -v -c arduino -p ATMEGA328P -P COM12 -U flash:r:c:\blink.hex:i
BESTAND > FIRMWARE:  avrdude -v -c arduino -p ATMEGA328P -P COM12 -U flash:w:c:\blink.hex

Arduino UNO
FIRMWARE > BESTAND:  avrdude -v -c arduino -p ATMEGA328P -P COM12 -U flash:r:c:\blink.hex:i
BESTAND > FIRMWARE:  avrdude -v -c arduino -p ATMEGA328P -P COM12 -U flash:w:c:\blink.hex

Arduino NANO v3.0
FIRMWARE > BESTAND:  avrdude -v -c arduino -p ATMEGA328P -P COM12 -b 57600 -U flash:r:c:\blink.hex:i
BESTAND > FIRMWARE:  avrdude -F -v -c arduino -p ATMEGA328P -P COM12 -b 57600 -U flash:w:c:\blink.hex

Arduino MEGA 2650
FIRMWARE > BESTAND:  avrdude -v -c wiring -p ATMEGA2560 -P COM12 -b 115200 -U flash:r:c:\blink.hex:i
BESTAND > FIRMWARE:  avrdude -F -v -c wiring -p ATMEGA2560 -P COM12 -b 115200 -D -U flash:w:c:\blink.hex

Bestandsgrootte

Arduino UNO NANO HEX bestandsgrootte: 78626 bytes.
Arduino UNO HEX bestandsgrootte: 78861 bytes.

Bij problemen

Mocht je een stk500_recv() error krijgen bij het uploaden, dan kan de bootloader roet in het eten gooien, je kan met een andere Aruduino UNO de bootloader terug zetten volgens deze handleiding.

Ps. je kan voor Arduino UNO deze -c commando’s gebruiken, het maakt niet uit welke: “-c avrisp” “-c arduino”, “-c stk500v1”