Arduino Bootloader mit dem Raspberry Pi laden
16.07.2016
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: 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.
"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) |
Source-Code
Für die oben benutzten GPIO Pins (General Purpose Input Output) muss Avrdude auf dem Raspberry Pi entsprechend installiert und konfiguriert werden:
sudo apt-get install bison flex libusb-dev
cd /tmp
wget https://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 https://www.torsten-traenkner.de/linux/raspberry/avrdude.conf -O /opt/avrdude/etc/avrdude.conf
Die wichtigen Einträge in avrdude.conf sind:
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:
sudo bash
/opt/avrdude/bin/avrdude -p atmega328p -c linuxgpio -vv
Wenn der Funktions-Test erfolgreich war, kann jetzt der Bootloader Optiboot installliert werden:
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.
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
- Spezifikation des Arduino Nano
- Pin Mapping Arduino (Nano) - ATmega 168 / ATmega 328
- Using Raspberry Pi as an Arduino AVR programmer
Falls du Fragen hast, dann kannst du die Kommentar-Funktion benutzen.