Micronucleus auf Digispark Clone installieren

Kategorien: tinkering

Im Juli 2016 habe ich testweise drei "Digispark Kickstarter ATTINY85 Micro USB Development Board for Arduino" genannte Digispark-Clones für zusammen EUR 4,29 gekauft. Nach etwas Suche in meiner Teilekiste fand ich einen USB-Hub, in dem die Platinen guten Kontakt haben. Sie lassen sich gut mit der Arduino-IDE programmieren.

Mit dem ersten Digispark habe ich eine Wackelmaus programmiert, die alle 10 Sekunden die Maus 10 Pixel nach oben und dann wieder 10 Pixel nach unten verschiebt. Damit kann man schnell mal dafür sorgen, dass der Bildschirmschoner aus bleibt.

./digispark-clone.png

Kurz, der Test war erfolgreich, also habe ich beim gleichen Verkäufer im November 10 Stück nachgeordert. Die neuen kamen nicht mehr in den schönen grauen ESD-Beuteln (mit ESD-Aufdruck), sondern in den üblichen metallisiert aussehenden Beuteln. Die Platinen sehen identisch aus.

Jetzt wollte ich den ersten Digispark aus der zweiten Lieferung programmieren, aber er wurde nicht von Linux erkannt. Da die Wackelmaus immer noch als Digispark erkannt wurde, liegt die Vermutung nahe, dass die zweite Lieferung keine Firmware hat.

{{{TEASER_END}}}

Installation der Firmware

Die Hardware eines Digispark ist nicht viel mehr als ein ATtiny85 mit der Standard V-USB-Schaltung. Die Firmware basiert laut der Digistump Web-Seite auf Micronucleus. Also sollte sich die Firmware doch leicht installieren lassen…

Programmiergerät

Um einen nackten ATtiny85 zu programmieren, braucht man ein Programmiergerät. Dazu kann man eines der von Arduino/avrdude unterstützten Programmiergeräte (siehe Abbildung fig:arduino:programmer) verwenden.

./arduino-programmer.png

Mir war nicht danach, den AVRISP mkII zu suchen (irgendwo liegt er…). Also habe ich einen Arduino zum Programmieren verwendet. Spaßig wäre einen von den alten Digispark-Clones als Programmiergerät mit dem ArduinoISP-Sketch zu verwenden. Die sind aber alle in Gebrauch, aber ein UNO liegt noch auf dem Schreibtisch…

Arduino UNO als Programmiergerät verwenden

Unter den Beispielen in der Arduino-IDE findet man einen Sketch namens ArduinoISP. Den kann man direkt auf den Arduino UNO laden. Danach verhält der UNO sich wie ein Programmiergerät. Etwas fummelig ist noch die Verbindung des UNO mit dem Digispark-Clone. Im Sketch sieht man die Belegung der Pins für das Programmiergerät:

#define RESET     10 // Use pin 10 to reset the target rather than SS
#define LED_HB    9
#define LED_ERR   8
#define LED_PMODE 7

// Uncomment following line to use the old Uno style wiring
// (using pin 11, 12 and 13 instead of the SPI header) on Leonardo, Due...

// #define USE_OLD_STYLE_WIRING

#ifdef USE_OLD_STYLE_WIRING

#define PIN_MOSI	11
#define PIN_MISO	12
#define PIN_SCK		13

Die LEDs habe ich nicht verbunden. Es geht auch im Blindflug. Wichtig sind die Pins RESET, PIN_MOSI, PIN_MISO und PIN_SCK, da damit der ATtiny85 programmiert werden kann. Diese Pins muss man mit den entsprechenden Pins des ATtiny85 verbinden. Mit dem Schaltplan findet man die externen Pins, an denen die Pins des Attiny85 herausgeführt werden. Der UNO liefert auch die Versorgungsspannung für den ATtiny85.

Kurz: Mit Jumper-Kabeln verbindet man die Pins entsprechend der folgenden Tabelle.

Signal UNO-Pin Digispark-Clone
RESET 10 P5
MOSI 11 P0
MISO 12 P1
SCK 13 P2
Vcc 5V VIN
GND GND GND

Programmiergerät und Verbindung testen

Dummerweise stellt die Arduino den Programmierer immer auf Micronucleus, wenn man den Digispark als Board auswählt. So kann man keinen Sketch auf den nackten Digispark-Clone spielen. Es gibt aber auch ein Brett für den nackten ATtiny85. Das muss man aber erst installieren. Dazu muss man in den Einstellungen/Preferences https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json als neue Board-URL hinzufügen. Danach kann man unter Tools/Board/Board Manager das Board attiny installieren.

Für den Test wählt man jetzt "ATtiny25/45/85", als Prozessor "ATtiny85", als Frequenz "16 MHz" und als Programmiergerät "Arduino as ISP" aus. Wenn man nur einen UNO angeschlossen hat, sollte der Port schon stimmen, wenn nicht muss man die entsprechende Schnittstelle auswählen.

Jetzt öffnet man den Blink-Beispiel-Sketch. Damit der Sketch sich übersetzen lässt, muss man noch den Pin für die LED definieren.

#define LED_BUILTIN 1

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

Damit wir das Kommando zum Programmieren herausfinden, müssen wir noch in den Einstellungen/Preferences die Option "Show verbose output during: upload" setzen (siehe Abbildung), dann zeigt die Arduino-IDE unter anderem den Aufruf von avrdude mit allen notwendigen Argumenten an.

./arduino-preferences.png

Jetzt kompilieren und laden wir den Blink-Sketch auf den ATtiny85.

Die LED sollte jetzt blinken. Wenn sie blinkt, funktioniert das Programmiergerät und wir können damit die Firmware auf den Digispark-Clone brennen.

Firmware laden

Die Firmware findet man im Github Repository. Leider wird die neueste Version nicht vom Micronucleus-Werkzeug für den Digispark nicht unterstützt. Man kann natürlich das Micronucleus-Werkzeug aktualisieren oder einfacher eine alte Version der Firmware verwenden. Die Version 1.11 des Micronucleus findet man im Github-Repository unter branch/master Tags v1.11.

Ich habe eine Kopie unter ./micronucleus-1.11.hex abgelegt.

Firmware auf den Digispark brennen

In der Konsole der Arduino-IDE suchen wir die Zeile mit dem avrdude-Aufruf. Sie sollte mit -Uflash:w:blink.hex:i enden. Diesen Aufruf kopieren wir in ein Terminal/Eingabeaufforderung und passen ihn an, damit die Fuses des ATtiny85 korrekt gesetzt werden.

Unter Linux sollte der folgende Aufruf funktionieren:

~/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino9/bin/avrdude \
  -C~/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino9/etc/avrdude.conf \
  -v -pattiny85 -cstk500v1 -P/dev/ttyACM0 -b19200 \
  -Uflash:w:micronucleus-1.11.hex:i \
  -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m

In der ersten Zeile findet man das Kommando. Das kann sich mit einer neuen Arduino-Version ändern.

In der zweiten Zeile wird die Konfigurationsdatei angegeben. Diese kann sich durch Auswahl eines anderen Programmiergeräts ändern, deshalb sollte die letzte in der Arduino-IDE das Brennen des Blink-Sketchs sein.

Die dritte Zeile legt die Firmware-Datei fest.

Die vierte Zeile legt die Fuses fest. Mit dieser Auswahl bleibt die Funktion des Reset-Pins erhalten, deshalb steht danach der Pin P5 nicht als IO-Pin zur Verfügung.

Führt man das Kommando oben aus, wird die Firmware auf den Digispark-Clone gebrannt.

Jetzt sollte der billige Clone sich wie ein normaler Digispark funktionieren.

Test des Digispark-Clones

Jetzt stellen wir das Board auf "Digispark" in der Arduino-IDE, damit wird als Programmiergerät auf "Micronucleus" gestellt.

Die Jumper-Kabel ziehen wir vom Digispark-Clone ab und den Arduino UNO vom Rechner ab. Wenn wir den Digispark-Clone in den USB-Port stecken, sollte er als Digispark erkannt werden. Die LED wird aber nicht blinken, da die Firmware den Blink-Sketch überschrieben hat.

Wir können jetzt wieder den Blink-Sketch auf den Digispark-Clone laden. Jetzt sollte die LED wieder blinken.

Wenn das Laden fehlschlägt, dann kann man in der Konsole der Arduino-IDE den Fehlergrund nachlesen. Vielleicht war es ja eine vom Micronucleus-Werkzeug nicht unterstützte Version der Micronucleus-Firmware.

Fazit

Dass die Firmware auf den billigen Clones aus China fehlt oder eine falsche Version installiert ist, ist leider ziemlich üblich. Mit dem passenden Know-how und Werkzeugen kann man meistens auch die billigen Clones zum Laufen bekommen.

Ist es legitim die billigen Clones in China zu bestellen? Da die Pläne unter CC-BY-SA 3.0 stehen, sind die Clones meiner Meinung nach rechtlich in Ordnung. Digistump lebt davon, die originalen Digisparks zu verkaufen. Neben dem Ärger mit der Firmware, dauert eine Bestellung in China manchmal ewig (ich habe auch schon einmal über sechs Wochen auf eine Lieferung gewartet). Es kann auch eine Lieferung verloren gehen. Ab und an muss man auch auf das Zollamt mit den Rechnungen, um eventuell die Einfuhrumsatzsteuer zu bezahlen. Auch wenn der Warenwert unter der Bagatellgrenze bleibt, muss man eventuell den Nachweis führen. Bei all den Nachteilen sollte man sich überlegen, ob man nicht den originalen Hersteller unterstützt und seine Produkte kauft, damit er weiter Support und Neuentwicklungen finanziert.

Wer trotzdem die Billigclones kauft, sollte genug Fachkenntnis besitzen, um sich selbst helfen zu können. Mit Recht werden die Originalhersteller sauer, wenn sie einem Billigheimer helfen sollen. Wer keine Originalprodukte kauft, darf sich auch nicht an den Support des Herstellers wenden.

Die Installation der Micronucleus-Firmware hat mich mit Recherche, Aufbau und Fehlversuchen ungefähr acht Stunden gekostet. Die Differenz im Kaufpreis von Clone (EUR 13,40 keine Versandkosten) zu Original (EUR 69,50 + Versandkosten EUR 4,95) ist EUR 61,05. Allerdings habe ich zehn Clones auf einmal gekauft, weil die Lieferung lange dauert. Bei einem Clone ist die Ersparnis EUR 10,55. Wirtschaftlich betrachtet ist der Kauf eines Clones also unsinnig.

Ich bestelle trotzdem ganz gern die billigen Teile zum Basteln in China. Auch die Fehlersuche macht schließlich Spaß und ich lerne immer etwas. Wenn mir ein Projekt aber wichtig ist und funktionieren soll, sind mir aber Originalprodukte lieber.

Die neun weiteren Digispark-Clones müssen auch noch gebrannt werden. Da sie ohne eingelötete Steckerleiste kommen, gibt es als Folgeprojekt den Bau eines Programmieradapters. Eine Menge verschiedener Federkontakte (Pogo-Pins) habe ich bereits in China bestellt…