Digispark – die bequeme ATtiny85 Alternative

In meinem letzten Beitrag habe ich beschrieben, wie man seine Sketche auf einen ATtiny85 (oder 84, 45, 44, 25, 24) hochlädt. Dazu muss man seinen Arduino als Programmer einrichten oder sich einen anderen Programmer, wie z.B. den USBtinyISP zulegen. Eine in mancher Hinsicht bequemere Alternative, die ich hier vorstellen möchte, ist der Digispark, der original von der Firma Digistump stammt. 

Dabei handelt es sich um ein Modul welches auf einem ATtiny85 basiert und direkt über den USB Anschluss programmiert werden kann. Es ist also keine SPI – Verkabelung für das Hochladen notwendig und auch kein Programmer. Da zudem die Stromversorgung über den USB Anschluss bereitgestellt werden kann, werden die Schaltungen sehr übersichtlich.

Ein weiterer Vorteil des Digispark gegenüber dem ATtiny85 ist, dass er I2C mit der Wire Bibliothek beherrscht. Dann sei noch erwähnt, dass man bei dem (echten!) Digispark sechs Pins als I/O Pins nutzen kann. Beim ATtiny85 sind es nur fünf. Dazu weiter unten mehr. 

Preislich gibt es keinen großen Unterschied zum ATtiny85. Je nach Quelle und Abnahmemenge ist man zwischen knapp zwei und vier, manchmal fünf Euro dabei.

Nachteilig am Digispark ist der größere Platzbedarf und ein etwas kleinerer Speicher. Von den 8k Flash Speicher werden ca. 2k für den Bootloader verwendet. Hinzu kommt eine für Microcontroller sehr lange Bootzeit von mehreren Sekunden.

Der Digispark ist hier auf den Digistump Seiten sehr gut beschrieben. Wozu dann noch dieser Beitrag? Zum einen soll er als Schritt-für-Schritt Einführung und Überblick dienen, zum anderen möchte ich meine durchaus positive Erfahrung mit dem Modul teilen. Darüber hinaus gibt es noch ein paar speziellere Informationen zu den weitverbreiteten Klonen, die naturgemäß vom Hersteller nicht dokumentiert werden.

Pinout des Digispark

Der Digispark besitzt sechs programmierbare Pins, die als als P0 bis P5 bezeichnet werden. Neben ihrer Aufgabe als digitale Ein- und Ausgänge haben die Pins folgende Zusatzfunktionen:
 
  • P0: I2C SDA, PWM („ohne Rev:“ verbunden mit On-Board LED)
  • P1: PWM (Rev2, 3, 4: verbunden mit On-Board LED)
  • P2: I2C SCK, Analog In
  • P3: Analog In, USB+
  • P4: PWM, Analog In, USB-
  • P5: Analog In (dieser Pin liefert 3V wenn er HIGH ist!)

Das ist dem ATtiny85 Pinout sehr ähnlich, was nicht verwundert, da der Digispark schließlich auf diesem basiert.

Zum Vergleich: Pinout des ATtiny85
Zum Vergleich: Pinout des ATtiny85

Verschiedene Versionen des Digispark

Es gibt verschiedene Versionen des Digispark. Revision 2, 3 und 4 haben eine entsprechende Kennzeichnung am USB Stecker (revx). Bei diesen Versionen ist die On-Board LED mit P1 verbunden, d.h. sie leuchtet wenn P1 HIGH ist. Bei den Boards ohne Revisionsnummer ist P0 mit der On-Board LED verbunden. Habt ihr diese Version, dann müsst ihr die LED auslöten oder die Verbindung zu der LED kappen, wenn ihr mit I2C arbeiten wollt. Weitere Details dazu gibt es hier

Revision 3 ist laut Digistump eine Fälschung, die man deswegen eigentlich nicht kaufen sollte, auch wenn sie prinzipiell funktioniert. Andererseits ist die Revision 3 so weit verbreitet, dass man kaum eine andere bekommt. Und so habe ich selbst auch diese Version gekauft. Sie hat nur einen Nachteil: P5 ist bei diesem Modell als Reset Pin konfiguriert und deshalb nicht ohne Weiteres als I/O Pin nutzbar. Probiert es mal aus, wenn ihr einen „rev3“ habt. Startet einen Sketch und legt P5 kurz an GND – der Digispark startet neu. Entsprechend wird auch der Blink Sketch weiter unten mit P5 nicht funktionieren. Im letzten Abschitt des Beitrages erkläre ich wie man den Mangel beheben kann und den P5 zum I/O Pin macht. 

Um die Verwirrung komplett zu machen, gibt es auch Versionen ohne Revisionsnummer, die nicht original von Digistump stammen. Auch so ein Vertreter ist mir untergekommen und er funktionierte wie „rev3“. 

Einrichtung der Arduino IDE für den Digispark

Auch wenn das Arbeiten mit dem Digispark sehr einfach ist, muss man doch zunächst ein paar Vorbereitungen treffen. Das ist aber in wenigen Minuten erledigt. Ich setze dabei voraus, dass ihr eine Arduino IDE mit der Version >= 1.6.6 verwendet. 

Schritt 1: Treiberinstallation

Das Treiberinstallationsprogramm könnt ihr hier herunterladen. Wenn ihr, so wie ich, Windows benutzt, dann wählt auf der Seite den markierten Link: 

Digispark Treiber von Github herunterladen.

Entpackt die Zip-Datei und führt „Install Drivers.exe“ für ein 32-Bit System aus oder „DPInst64.exe“ für ein 64-Bit System:

Treiberauswahl in der Zip Datei.

Schritt 2: Boardverwalter URL eintragen

Dann geht ihr in die Arduino IDE und tragt die Boardverwalter URL

„http://digistump.com/package_digistump_index.json“

in den Voreinstellungen ein:

Boardverwalter URL für den Digispark in den Voreinstellungen eintragen.

Schritt 3: Digistump Paket installieren

Dann geht ihr in

Werkzeuge -> Board: xxxx -> Boardverwalter 

Der Weg in das Boardverwalter Menü.

… und sucht dort nach „digistump“, installiert das Paket und startet die Arduino IDE neu. Das war’s auch schon.

Suche und Installation des richtigen Paketes für den Digispark.

Den ersten Sketch hochladen

Zum Testen nehme ich einen einfachen Blink Sketch. Er unterscheidet sich nicht von einem Blink Sketch für Arduino Boards. Die Pins werden bei Verwendung von digitalWrite entsprechend ihrer „P-Nummer“ angesprochen. Das heißt: 0 ist P0, 1 ist P1, 2 ist P2, usw. Klingt trivial an dieser Stelle, ist aber bei analogRead anders. 

int ledPin = 1;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);   
  delay(1000);                     
  digitalWrite(ledPin, LOW);    
  delay(1000);                     
}

 

Was die Schaltung angeht: einfacher geht es nicht. Die LED an kommt an GND bzw. P1. Der Digispark wird per USB an den PC angeschlossen, allerdings erst nach Aufforderung beim Hochladen (wird gleich klarer).

Schaltung für den Blink Sketch
Setup für den Blink Sketch

In der Arduino IDE wählt ihr „Digispark (Default – 16.5mhz)“. Die Varianten mit „no USB“ und anderem Takt funktionieren aber auch. „Port“ ist ausgegraut. Keine Sorge, das gehört so, selbst wenn der Digispark eingestöpselt ist. 

Auswahl des richtigen Boards.

Wenn ihr den Sketch jetzt hochladet, bekommt ihr folgende Meldung:

"Plug in device now" Meldung

Jetzt schließt ihr den Digispark per USB an und bekommt – wenn alles gut geht – folgende Meldung:

Hochladen vollendet - Meldung

Die LED sollte nun auch blinken. Wenn ihr ein Digispark Modell der Revision 2, 3 oder 4 habt, blinkt auch die On-Board LED, da wir ja P1 als ledPin gewählt haben. 

Genauso könnt ihr die fünf anderen Pins für diesen Sketch benutzen, mit der Einschränkung, dass P5 drei Volt anstelle fünf Volt liefert oder gar nicht funktioniert, weil ihr die Revision 3 oder andere Klone habt.

Langsames Booten

Erstaunlich ist, dass der Digispark nach Einschalten der Spannungsversorgung gute fünf Sekunden braucht bis er den Sketch startet. Da ist ein ATtiny85 mit dem Standard Bootloader schneller. In meinem Beitrag über Funksteckdosen und Handsender hatte ich einen Selbstbauhandsender auf Basis eines ATtiny85 vorgestellt. Die Funktaste war dabei ein Taster der den ATtiny85 mit Strom versorgt hat und so den Funksketch gestartet hat. Würde ich dasselbe mit dem Digispark bauen, müsste ich mindestens fünf Sekunden auf meine Funktaste drücken, was nicht besonders anwenderfreundlich wäre. Zugegebenermaßen ist so eine Anwendung aber eher die Ausnahme, so dass in den meisten Fällen diese Bootzeit nicht weiter störend sein dürfte. 

Analog Read mit dem Digispark

Analog Read ist an den Pins 2, 3, 4 und 5 möglich. Verwirrend ist jedoch, dass hier im Gegensatz zum Digital Read die physikalische Pinnummer nicht mit der Analog Read Nummer übereinstimmt. Diese Eigenschaft hat der Digispark vom ATtiny85 geerbt bei dem es sich genauso verhält. Die Zuordnung ist:

  • P2: analogRead(1)
  • P3: analogRead(3)
  • P4: analogRead(2)
  • P5: analogRead(0)

In meinem kleinen Beispiel dazu wird die Spannung an P2 überprüft. Überschreitet sie einen bestimmten Wert, leuchtet eine LED an P4. Der Sketch dazu sieht dann so aus: 

int ledPin = 4;
int analogInPin2 = 1; // analogRead(1) erfolgt an P2

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if(analogRead(analogInPin2)>100){
    digitalWrite(ledPin, HIGH);   
  }
  else{                     
    digitalWrite(ledPin, LOW);    
  }                     
}

 

Und hier eine einfache Testschaltung dazu:

Schaltung: Besipiel für analogRead am Digispark

I2C mit dem Digispark

Wie schon erwähnt funktioniert die Ansteuerung von I2C Bausteinen direkt mit der Wire Bibliothek, was einen Vorteil gegenüber dem ATtiny85 darstellt. Als Beispiel habe ich die Steuerung des Portexpanders MCP23017 gewählt. Die gelbe Leitung an P0 ist SDA, die grüne Leitung an P2 ist SCL. Diese sind mit den entsprechenden SDA / SCL Pins am MCP23017 verbunden. Wichtig sind die 4.7 kOhm Pull-Up Widerstände an den I2C Leitungen. 

Der Digispark am MCP23017 - Ein Beispiel für eine I2C Anwendung
Der Digispark am MCP23017 – Ein Beispiel für eine I2C Anwendung

Der Vollständigkeit halber hier noch ein Beispielsketch dazu (wer mehr über den MCP23017 lesen möchte, kann dazu einen Beitrag von mir hier finden).  

#define MCP_ADDRESS 0x20 // (A2/A1/A0 = LOW) 
#include <Wire.h>
#include <MCP23017.h> // meine MCP23017 Bibliothek
MCP23017 myMCP(MCP_ADDRESS,5); // 5: Reset - brauchen wir hier nicht
int wT = 1000; // wT = waiting time

void setup(){ 
  Wire.begin();
  myMCP.Init();  
  myMCP.setPortMode(B11111111, A); 
  delay(wT);
}

void loop(){ 
  myMCP.setAllPins(A, ON); 
  delay(wT);
  myMCP.setAllPins(A, OFF);
  delay(wT);
  myMCP.setPin(0, A, ON); 
  delay(wT); 
  myMCP.setPin(4, A, ON);
  delay(wT);
  myMCP.setPin(7, A, ON); 
  delay(wT);
} 

 

P5 zum I/O Pin umfunktionieren

Beim ATtiny85 lassen sich grundsätzlich nur 5 Pins als I/O Pins nutzen. Pin 1 (PB5, RESET) des ATtiny85 ist nur über Umwege als I/O Pin einsetzbar. Das Problem ist, dass man dabei die Resetfunktion verliert und der ATtiny85 damit nicht mehr ohne Weiteres neu programmiert werden kann. Man sperrt sich sozusagen aus. Auch das lässt sich wieder beheben, aber nur mit Programmern, die über eine Hochspannungsfunktion verfügen. 

Beim Digispark braucht man die Resetfunktion am P5 nicht, da die Programmierung über USB erfolgt. Somit hat man 6 I/O Pins zur Verfügung. Die Produzenten der Revision 3 und anderer Klone hingegen haben die Resetfunktion an P5 beibehalten. Wenn ihr nur 5 Pins braucht oder vielleicht die Resetfunktion nutzen wollt, dann lasst alles wie es ist. Wenn ihr hingegen alle Pins als I/O Pins nutzen wollt, dann könnt ihr das mit dieser Anleitung ändern. 

Für die Aktivierung des P5 als I/O Pin bzw. die Deaktivierung der Resetfunktion muss das entsprechende Fuse-Bit (RSTDISBL) „eingeschaltet“ werden. Ich möchte hier zwei Möglichkeiten vorstellen, wie man das bewerkstelligt.  

Option 1: Mit WinAVR und Arduino UNO

Das Schöne an dieser Methode ist, dass die meisten einen Arduino UNO (Nano, Pro Mini, usw. gehen auch) haben und das benötigte Programm WinAVR nichts kostet. 

Als Erstes ladet ihr das Programm WinAVR z.B. hier herunter und installiert es. 

Im nächsten Schritt ladet ihr den ArduinoISP Sketch aus den Beispielen auf den Arduino. Durch diese Maßnahme wird der Arduino zum Programmer. 

ArduinoISP aus den Beispielen wählen
ArduinoISP aus den Beispielen wählen

Dann verbindet ihr den Digispark mit dem Arduino wie folgt:

  • P0 –> 11
  • P1 –> 12
  • P2 –> 13
  • P3 –> 10

Schließlich verbindet ihr noch GND mit GND, 5V mit 5V und setzt einen 10 µF Kondensator zwischen den Arduino Reset und GND (Polarität beachten: Minus des Kondensators an GND).

Schaltplan für die Programmierung des Digispark mittels Arduino

Dann öffnet ihr im PC ein Eingabeaufforderungsfenster. Je nachdem, ob ihr Pfade gesetzt habt oder nicht, müsst ihr vielleicht in das Verzeichnis wechseln, in dem ihr WinAVR installiert habt. Ihr gebt Folgendes ein, wobei ihr COM14 durch den Port ersetzt an dem euer Arduino hängt:

avrdude -P COM14 -b 19200 -c avrisp -p attiny85 -n

Ihr bestätigt mit Enter, gebt die nächste Zeile ein und bestätigt wieder mit Enter:

avrdude -P COM14 -b 19200 -p attiny85 -c avrisp  -U hfuse:w:0x5F:m 

Wenn alles gut geht, solltet ihr Meldungen ähnlich wie diese hier bekommen:

Rückmeldungen von avrdude beim setzen des Fuse-Bits im Digispark

Jetzt könnt ihr den Blink Sketch von vorhin auch mit P5 als ledPin hochladen – nun blinkt die LED. Nur eben etwas weniger hell als an den anderen Pins, da P5 nur 3 Volt liefert. 

Option 2: mit Atmel Studio und geeignetem Programmer

Was man braucht

Diese Methode ist weniger kryptisch, sie erfordert aber die Installation des recht großen, aber auch kostenlosen Softwarepaketes Atmel Studio (derzeit Version 7). Zusätzlich benötigt ihr noch einen kompatiblen Programmer. Atmel Studio 7 bekommt man hier. Wer tiefer in die Programmierung von Atmel Microcontrollern auf Registerebene und in „C“ einsteigen möchte, sollte sich sowieso mit diesem Programm beschäftigen. Um nur mal ein Fuse-Bit zu ändern, ist es schon ein wenig übertrieben sich dieses mächtige Werkzeug auf die Festplatte zu beamen. In einem späteren Beitrag werde ich noch einmal detaillierter auf Atmel Studio eingehen.

Die Programmer für Atmel Studio sind relativ teuer. Einer der günstigeren ist der USB ISP-Programmer von Tremex/Diamex, den ihr für ca. 20 Euro bei z.B. hier bei Amazon bekommt. Ich habe ihn ausprobiert und er funktioniert absolut problemlos mit Atmel Studio. Bei Verwendung von Windows 10 muss nicht einmal ein Treiber installiert werden.

Besser, aber auch teurer sind der AVR Dragon oder der Atmel-ICE. Ersterer ist für 50-80 Euro zu haben, letzterer ab 120 Euro. Mit diesen beiden Modellen ist auch Debugging möglich. Darüber hinaus beherrscht der Dragon HVSP (High Voltage Serial Programming) womit man den Eingriff am P5 auch wieder rückgängig machen kann. Der Atmel-ICE kann das nicht, wird dafür aber im schicken Gehäuse geliefert. 

AVR Dragon, Atmel-ICE und USB ISP-Programmer von Tremex/Diamex
Von links nach rechts: AVR Dragon, Atmel-ICE, USB ISP-Programmer (Tremex/Diamex)

Wenn ihr in einen Programmer investiert, dann empfehle ich euch auch gleich einen Breadboardapter wie diesen hier zu besorgen:

Breadboardadapter - sinnvoll für die Programmierung des Digispark

Es erleichtert einem die Arbeit und vermeidet Fehler bei der Schaltung. Kaufen kann man so ein Teil z.B. hier oder mit 2 x 3 Pinleiste hier.

Die Schaltung

Das Anschlussschema von Programmer und Digispark sieht folgendermaßen aus:

Schaltung Digispark und Programmer

Zu beachten ist, dass der AVR Dragon den Digispark nicht mit Strom versorgen kann. Man benötigt eine separate Stromquelle. Der günstige USB ISP-Programmer hingegen kann das, sofern die Dipschalter 1 und 2 auf „ON“ sind. 

Atmel Studio 7 verwenden

Wenn ihr einen Dragon oder Atmel-ICE verwendet, sollten diese von Atmel Studio automatisch erkannt werden. Den USB ISP-Programmer von Tremex/Diamex müsst ihr zunächst integrieren. Dazu geht ihr im Menü auf

Tools –> Add Target… –> Select Tool 

Wählt STK500 und den Port, dann bestätigt mit „Apply“.

In der Menüleiste findet ihr ein kleines Symbol für „Device Programming“. Klickt darauf.  

Auwwahl Menü des Atmel Studios

Falls das Tool im nächsten Fenster noch nicht ausgewählt ist, wählt es hier im Drop-Down Menü. Als Device wählt ihr den ATtiny85. Interface ist ISP. Dann klickt auf „Apply“.

Device Programming Fenster - Auswahl von Tool und Device

Ihr könnt dann die Versorgungsspannung überprüfen und ob die richtige Signatur vorhanden ist. Es sollte 0x1E930B sein. Geht nun auf den Menüpunkt „Fuses“.

Device Programming Fenster - weitere Auswahlen

Macht einen Haken hinter „HIGH.RSTDISBL“, klickt auf „Program“ und auf „Continue“ im aufpoppenden Warnfenster. Wenn alles geklappt hat sollte unten in den Meldungen „Verify Registers …. OK“ stehen.

Device Programming Fenster - Auswahl der Fuse-Bits

P5 sollte jetzt als I/O Pin einsatzfähig sein. 

Wenn ihr Lust habt mehr über Atmel Studio 7 zu erfahren, dann haltet die Augen offen – in einem der nächsten Beiträge werde ich eine Einführung geben. 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.