Du bist hier:Start»Linux»Raspberry Pi»Arduino

Arduino Bootloader mit dem Raspberry Pi laden

16.07.2016

Arduino Nano

Arduino ist der "kleine Bruder" des Raspberry Pi. Der Arduino ist ein Mikrocontroller, auf den normalerweise über ein USB-Kabel ein kleines Software-Programm geladen werden kann. Mit dem USB-Kabel ist er gegenüber "normalen" Mikrocontrollern wesentlich leichter zu benutzen. Damit das Laden funktioniert, benötigt der Arduino einen Bootloader. Also ein Startprogramm, das die USB-zu-seriell-Schnittstelle bedienen und Programme laden kann. Falls dieses Boot-Programm überschrieben wird, gibt es erst einmal ein Problem. In diesem Artikel schreibe ich, wie der Bootloader eines Arduino Nano mit Hilfe eines Raspberry Pi wiederhergestellt werden kann. Mit anderen Arduino-Modellen sollte es ähnlich funktionieren.

Das Problem

Mit dem Programm Avrdude kann der Arduino über USB mit Software beschrieben werden. Als ich beim Hochladen eines Programms mit Avrdude folgende Meldung bekam, habe ich im Internet nach einer Lösung gesucht.

avrdude: verification error, first mismatch at byte 0x0000
avrdude: stk500_getsync(): not in sync: resp=0x00

Allerdings fand ich keine brauchbare Lösung. Eine Ursache für das Problem kann ein überschriebener Bootloader sein. Einige Antworten empfahlen den Bootloader mit einem anderen Arduino über ISP (In-System-Programmer) zu beschreiben. Jetzt wollte ich mir keinen zweiten Arduino kaufen. Da ich einen Raspberry Pi habe, habe ich mit dem Raspberry Pi probiert, den Arduino zu beschreiben.

Hardware und Verkabelung

Zum Verbinden des Arduino Nano und des Raspberry Pi sind 6 sogenannte Jumperwire female zu female notwendig. Bei Amazon gibt es zum Beispiel Jumperwire aus China für unter 2 Euro. Auf die muss man etwas länger warten als die teureren, aber als Besitzer eines Raspberry Pi hatte ich die Kabel ohnehin schon länger bei mir rumliegen.

Arduino Nano mit dem Raspberry Pi

Arduino Nano mit dem Raspberry Pi (zum Vergrößern klicken)

"This image was created with Fritzing." Das obere Bild ist mit der Layout-Software Fritzing erstellt. Die schematische Darstellung zeigt einen Raspberry Pi 1. Der Raspberry Pi 2 hat 40 GPIO-Pins. Die Verkabelung sieht aber genauso aus wie beim Raspberry Pi 1 - nur dass sich zwischen den Kabeln und der USB-Buchse weitere Pins befinden, die nicht genutzt werden.

Leitung Kabelfarbe Pin beim Raspberry Pi 2 Pin beim Arduino Nano
3,3 Volt rot 1 VIN
GND (Ground / Erdung) schwarz 6 GND (neben VIN)
Reset weiß 12 (GPIO 18) RST
MOSI (Master Output Slave Input) lila 16 (GPIO 23) D11 (PB3)
MISO (Master Input Slave Output) gelb 18 (GPIO 24) D12 (PB4)
SCLK (serial clock) blau 22 (GPIO 25) D13 (PB5)
Raspberry Pi mit Arduino Nano

Raspberry Pi 2 mit Arduino Nano (zum Vergrößern klicken)

Raspberry Pi mit Arduino Nano

Raspberry Pi 2 mit Arduino Nano (zum Vergrößern klicken)

Source-Code

Für die oben benutzten GPIO Pins (General Purpose Input Output) muss Avrdude auf dem Raspberry Pi entsprechend installiert und konfiguriert werden:

# log in to the Raspberry Pi
sudo apt-get install bison flex libusb-dev
cd /tmp
wget http://download.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz
tar xf avrdude-6.1.tar.gz
cd avrdude-6.1
./configure --prefix=/opt/avrdude --enable-linuxgpio
make
sudo make install

sudo bash
wget http://torsten-traenkner.de/linux/raspberry/avrdude.conf -O /opt/avrdude/etc/avrdude.conf

Die wichtigen Einträge in avrdude.conf sind:

programmer
  id    = "linuxgpio";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "linuxgpio";
  reset = 18;
  mosi  = 23;
  miso  = 24;
  sck   = 25;
;

Diese Einstellungen entsprechen der oben beschriebenen Verkabelung (siehe GPIO 18, 23, 24, 25). Die Werte sind bereits in der mit wget heruntergeladenen avrdude.conf eingetragen.

Benutzung von Avrdude

Nachdem Avrdude installiert und konfiguriert ist, kann das Programm benutzt werden. Zunächst ein kleiner Funktions-Test mit dem Arduino Nano 3.0:

# simple function test
sudo bash
/opt/avrdude/bin/avrdude -p atmega328p -c linuxgpio -vv

Wenn der Funktions-Test erfolgreich war, kann jetzt der Bootloader Optiboot installliert werden:

# on the Raspberry Pi:
wget https://raw.githubusercontent.com/Optiboot/optiboot/master/optiboot/bootloaders/optiboot/optiboot_atmega328.hex
sudo bash

# unlock the boot sector (in the lock byte)
/opt/avrdude/bin/avrdude -p atmega328p -c linuxgpio -U lock:w:0x3f:m

# write boot loader and lock the boot sector against accidental writes (in the lock byte)
/opt/avrdude/bin/avrdude -p atmega328p -c linuxgpio -u -U flash:w:optiboot_atmega328.hex -U lock:w:0x0F:m

# reading the lock byte:
/opt/avrdude/bin/avrdude -p atmega328p -c linuxgpio -vv -U lock:r:lock_byte.bin:r
hexdump -C lock_byte.bin

Der erste Befehl zum Entsperren des Bootloader ist nicht wirklich nötig, da vorm Schreiben des Bootloaders der Flash-Speicher ohnehin noch einmal gelöscht wird.

Arduino IDE

Damit der neue Bootloader Optiboot auch in der Arduino IDE (Entwicklungsumgebung) funktioniert, muss in der Datei hardware/arduino/avr/boards.txt noch die Übertragungsrate von 57600 auf 115200 Baud hochgesetzt werden. ACHTUNG ! Diese Konfiguration habe ich nur für den Arduino Nano 3.0 getestet.

# go into the directory of the Arduino IDE, e.g:
cd arduino-1.6.9/

# replace the baud rate
sed -i 's|57600|115200|' hardware/arduino/avr/boards.txt

Jetzt sollten die Arduino IDE und Avrdude wieder funktionieren.

Linkliste

Falls du Fragen hast, dann kannst du die Kommentar-Funktion benutzen.

Kommentar schreiben