VUSBduino, ein ATtiny84-Arduino
Die Arduino-IDE (-Programmierumgebung) wurde mit den Versionen 1.5.x
bzw. 1.6.x für Dritthardware geöffnet; es ist nun leichter, sie um
eigene Hardware-Definitionen zu erweitern.
Seit Version 1.6.4 gibt es sogar einen "Boards Manager", der
eine Datenbank externer Definitionen aus dem Internet abfragt und diese
automatisch installiert. Sie "landen" unter Windows im Ordner
C:\Users\(username)\AppData\Roaming\Arduino15 und unter Linux im Ordner
/home/(username)/.arduino15; die Arduino IDE findet sie dort und bindet
sie automatisch in die Menüs ein. Unter dem Menüpunkt "Datei -
Voreinstellungen" kann man unter "Additional Boards Manager URLs"
weitere Internet-Quellen eintragen.
Daneben wurde es weiter erleichtert, Erweiterungen von Hand im
Sketch-Ordner anzulegen, so dass man nicht im
Original-Arduino-Programmordner "herumpfuschen" muss, sondern eigene
Erweiterungen getrennt halten kann (und sie somit nicht bei einem
Update der Arduino-Software versehentlich löscht oder überschreibt).
Ein Beispiel für eine solche Erweiterung wurde
hier
bereits von Heinz D. beschrieben.
Ich finde diese Lösung aber unpraktisch. 28-polige (oder gar
40-polige) ICs sind auf Lochrasterplatinen recht umständlich zu
verarbeiten; sie sind groß, sperrig und erfordern lange Drahtbrücken,
wenn die benötigten Pins auf der "falschen" Seite des ICs sitzen. Sie
lassen sich nur schwer aus der IC-Fassung heraushebeln und häufig
werden nur wenige I0-Pins tatsächlich genutzt, während die meisten
unbeschaltet bleiben.
Man kann jedoch auch die kleinen 8-poligen und 14-poligen
ATtinies in der Arduino-IDE programmieren, wenn man eine passende
Erweiterung nachinstalliert.
Möchte man Programme für ATtiny 44/45/84/85 erstellen, die man
zwar in der Arduino IDE programmiert, aber aus der Arduino IDE heraus
mit einem ISP-Programmer (z.B. einem USBasp) flasht, ist die winzige
Erweiterung von David A. Mellies (damellis) empfehlenswert. Sie enthält
keine Bootloader, daher ist ein ISP-Programmer erforderlich. Aber den
braucht man ja ohnehin, wenn man die Hardware selbst baut, denn einen
Bootloader bekommt man nur mit einem Programmer in den ATtiny
(Henne-Ei-Problem).
Mellies ist einer der Arduino-Gründer und pflegt das Paket
schon seit längerer Zeit; es ist also keine "Eintagsfliege". Es lässt
sich
hier
herunterladen. Seit neuestem kann man es auch per "Bords Manager" einspielen;
Mellis erklärt das Vorgehen ausführlich in einem
tutorial .
Im Paket ist der Ordner "Attiny" enthalten. Bei der
"händischen" Installation legt man im Sketchbook-Ordner, in dem die
bereits erstellten Sketches liegen, einen Ordner "hardware" an und
kopiert den Ordner "Attiny" aus dem "damellis"-Paket in diesen Ordner.
Im Gegensatz zu einigen anderen ATtiny-Paketen kommt es nicht
mit einem eigenen Core daher, sondern setzt auf den regulären
Arduino-Core auf. Auch nutzt es elegant die Gruppierungsmöglichkeiten
für Menüeinträge; es macht sich also nicht mit zahllosen Einträgen im
"Boards"-Menü breit. Es sind allerdings keine auf die ATinies
angepassten Libraries enthalten, die muss man sich anderswo
zusammensuchen (z.B. aus dem Adafruit-Trinket bzw. Digispark-Umfeld).
Möchte man nur mit ATtiny 85 arbeiten, ist die
"Komplett-IDE"
von Digistump ein guter Einstieg. Sie ist jedoch mittlerweile veraltet
und wurden lange nicht mehr upgedatet, im Vordergrund steht anscheinend
der Verkauf der Hardware. Adafruit setzt übrigens für seine
Trinket-Boards nun auch auf den "Boards Manager".
Baut man USB-Gadgets mit den ATtiny85-Varianten Trinket und Digispark bzw.
Digispar,
sind zwei Pins für den USB belegt und es bleiben nur drei digitale Pins
frei verwendbar (davon nur ein AD-Wandler-Pin). Außerdem ist die
Taktfrequenz des RC-Oszillators nicht sehr genau. Der
Digispark Pro wäre
die Antwort auf diese Einschränkungen, ist aber leider "broken by
design". Unbegreiflicherweise wurden AVCC und AGND nicht beschaltet, so
dass der ADC und der gesamte Port A nur über Schleichwege mit der
Betriebsspannung versorgt werden.
Ich habe es daher mit Selbsthilfe versucht. Es entstand ein
Arduino mit ATtiny 84(A), VUSB, 12 MHz Quarztakt und 3,3V
Spannungsversorgung. Es bleiben dann noch immerhin sieben frei
verwendbare Pins, davon können sechs als Analogeingänge konfiguriert
werden, und der Chip ist im bastelfreundlichen DIP-Gehäuse erhältlich.
Abbildung 1: Schaltplan
Abbildung 2: Streifenraster-Platinen-Layout
Die Betriebsspannung von 3,3V hat zwei Vorteile:
- inzwischen sind viele I2C- und SPI-ICs nur noch für 3,3V
ausgelegt, man kann sie ohne Pegelwandler direkt an die
Mikrocontroller-IOs anschliessen.
- 3,3V aus einem Spannungsregler sind als Referenz für den ADC
besser geeignet als die rohe USB-Spannung und vermutlich sogar genauer
als die interne 1,1V-Referenz des ATtiny, denn die ist recht ungenau.
Der Quarztakt hat zwei Vorteile:
- das OSCCAL-Getrickse der VUSB-Library entfällt, dieses macht die Programme robuster
- der genaue Takt liefert verlässliches Timing für Anwendungen, die genaue Zeitintervalle benötigen.
Da 16 MHz Takt bei 3,3V Betriebsspannung jedoch jenseits der
Atmel-Spezifikation liegen, fiel die Wahl auf 12 MHz.
Die Digispark-Libs sind bereits mit #ifdef-Weichen für den
Attiny 84 vorbereitet, aber leider nicht für Quarz-Betrieb, denn an
einen der Pins, die für USB verwendet werden, müßte der Quarz
angeschlossen werden. Diese Libs setzen voraus, daß der ATtiny 84 für 8
MHz RC-Takt gefust ist und über das OSCCAL-Register auf 12 MHz
"hochgejubelt" wird, denn der ATtiny 84 hat keine PLL, die 8,25
MHz-RC-Takt auf 16,5 MHz verdoppeln könnte.
Es blieb mir daher nur übrig, die DigiSpark-USB-Libs für den
Quarz-ATtiny 84 zu patchen. Um sie von den Original-Digispark-Libraries
unterscheidbar zu machen, habe ich sie in VUSB_Keyboard, VUSB_Mouse,
VUSB_CDC und VUSB_HID umbenannt. Die Digistump Vendor Strings sind
sicherheitshalber entfernt (Markenrechte), die Product Strings auf
"VUSB_" statt "Digi" geändert. Damit sind sie näher an den
Originalbezeichnungen, denn Digistump hat sich ja bei der VUSB-Lösung
von www.obdev.at bedient und sie mit eigenen Namen versehen.
Auch einige Vendor IDs und Product IDs sind auf die freien IDs
von www.obdev.at geändert; bei der Vendor ID und Product ID für die
VUSB_CDC-Library musste ich allerdings eine Ausnahme machen, weil man
für Windows signierte Treiber benötigt und der
Digistump-Windows-CDC-Treiber nur diese IDs akzeptiert (CDC-Library und
Windows-Treiber emulieren eine serielle Schnittstelle, die sich ganz
normal über Terminalprogramme ansprechen lässt, wenn sie denn
funktioniert; die Lösung scheint etwas wackelig und nicht an jedem
USB-Anschluss und mit jedem Terminalprogramm zu arbeiten).
An sich mag ich keine Bootloder und flashe lieber per
ISP-Programmer, aber bei der Entwicklung von USB-Anwendungen erscheinen
sie mir doch recht praktisch. Der micronucleus-Bootloader, der für
Digisparks und littleWire-Boards verwendet wird, unterstützt jedoch in
der Version 1.x nur den ATtiny 85. Nach ein bisschen Gefummel und
Gepatche wurde jedoch eine passende Variante für den 12
MHz-Quarz-ATtiny 84 daraus (der geänderte Quellcode ist unten
beigefügt).
Die zusammengesuchten und gepatchten Varianten habe ich zu
einer Erweiterung für die Arduino-IDE-1.6.x (zur Zeit ist 1.6.4
aktuell) gepackt, die man im Sketchordner ("~/Arduino" unter Linux,
"C:\Users\(username)\Arduino" unter Windows) in den Unterordner
"hardware" entpacken muss. Es wird der reguläre Arduino-Core verwendet,
das Paket setzt also nicht auf den Digistump-Core.
Abbildung 3: die neuen Boards im Arduino-Menü
Die Erweiterung erzeugt unter "Werkzeuge - Platine" einen
Gruppen-Eintrag "VUSB-Attinies". Wählt man ihn an, erscheinen unter
"Werkzeuge - Prozessor" zwei Einträge: "VUSB-ATtiny85 (PLL)" und
"VUSB-ATtiny84 (12 MHz)". Die für den Quarz-ATtiny 84 angepassten
VUSB-Libs (die auch den ATtiny 85 unterstützen) werden unter "Sketch -
Bibliothek importieren" nur eingeblendet, wenn zuvor die VUSB-ATtinies
ausgewählt wurden. Auch wenn man mehrere Erweiterungen installiert hat,
bleiben so die Menüs halbwegs übersichtlich (im Gegensatz zu vielen
Erweiterungen, die sich in den Hauptmenüs breitmachen und sie
vollmüllen).
"Fabrikfrische" ATtiny 84(A) (bzw. ATtiny 85) können über den
Menüpunkt "Werkzeuge - Bootloader brennen" automatisch geflasht und
gefust werden.
Unter Linux sollte nur das Anlegen neuer udev-Regeln
erforderlich werden (sofern nicht bereits erfolgt), Windows braucht wie
üblich Dritthersteller-Treiber, die unter Windows 7 und 8.X auch noch
signiert sein müssen. Wie üblich erweist sich das als sinnlose
Schikane, denn Bösewichte wissen das schnell auszuhebeln, und auch für
redliche Programmierer scheint es mittlerweile Wege zu geben, Treiber
selbst zu signieren. Ich habe mich nicht näher damit beschäftigt, hatte
aber aus den Treiber-Konfigurationsfiles den Eindruck gewonnen, dass
Digistump seine Digispark-Treiber selbst signiert hat.
Wenn man sich damit nicht auseinandersetzen will, ist es am
einfachsten, die beiden benötigten Treiber (für den Bootloader und für
die virtuelle serielle CDC-Schnittstelle) bei Digistump "auszuborgen".
Man installiert zunächst die komplette
Digistump-IDE ;
die Installationsroutine führt den Nutzer automatisch durch die
Treiber-Installation. Möchte man statt der Digistump-IDE die neueste
Arduino-IDE nutzen, kann man die Digistump-Arduino-Version wieder
deinstallieren (die Treiber bleiben erhalten) oder einfach parallel
weiternutzen.
Die DigiUSB-Kommandozeilen-Tools sind in einem größeren
SoftwarePaket enthalten, das nicht mehr gepflegt wird. Ich habe die
relevanten Programme beigefügt; Windows-Binaries sind enthalten -
Linux-User müssen den Quellcode selbst übersetzen
Reichelt hat leider keine ATtiny84A, sondern nur überteuerte
ATtiny84V. Eine günstige Bezugsquelle für ATtiny84A ist jedoch die
Firma
Guloshop .
Update 1
Die Links auf die spezielle Digistump-IDE sind veraltet, Digistump setzt
inzwischen auch auf den "Boards Manager". Man installiert die aktuelle Arduino-Version
(Download)
und muss lediglich unter Datei - Voreinstellungen im Feld
"Additional Boards Manager URLs:" eine Konfigurations-URL eintragen
(es sind auch mehrere Einträge möglich). Ist sie eingetragen, erscheint im Menü
Werkzeuge - Platine - Boards Manager der Eintrag
"Digistump AVR Boards by Digistump Version 1.6.5". Nach einem Click in
das Feld erscheint dort der Button Install. Unter Windows werden
automatisch die erforderlichen Treiber installiert bzw. aktualisiert.
Die Digistump-Konfigurations-URL lautet: http://digistump.com/package_digistump_index.json
Download der Arduino-Erweiterung: 0615-vusbduino.zip
Download der DigiUSB-Kommandozeilen-Tools: 0615-digiusb-commandline.zip
Download des modifizierten Bootloader-Sourececodes: 0615-micronucleus-t84.tgz
Update 2
Der micronucleus-Bootloader wurde weiterentwickelt, die Version 2.03 ist robuster und noch kleiner (danke,Tim!).
Ich habe daher die VUSBduino-Erweiterung aktualisiert. Neben den HEX-Files im Ordner vusb_attiny/avr/bootloader wurde auch das Kommandozeilen-Programmiertool, das im Ordner vusb_attiny/avr/tools liegt, erneuert. Wer ein 64bit-Linux einsetzt, muss micronucleus-64 in micronucleus umbenennen.
Download der aktualisierten Arduino-Erweiterung: 0516-vusbduino.zip
Das Kommandozeilen-Programmiertool ist abwärtskompatibel zu den alten
Bootloadern der Version 1.11, man sollte die Attinies jedoch mit einem
ISP-Programmer auf die neue Bootloader-Version upgraden, um an den
Verbesserungen Teil zu haben. Ist das nicht möglich, muss man zwei
Einträge in der Datei vusb_attiny/avr/boards.txt auf die alten Werte ändern:
attiny.menu.cpu.attiny85.upload.maximum_size=6012
attiny.menu.cpu.attiny84.upload.maximum_size=6012
Anderenfalls könnte ein zu grosses Programm auf den Attiny geladen werden, das den (alten,grösseren) Bootloader überschreibt.
Der Joystick-Beispielsketch wurde aktualisiert; der Rest ist
gleichgeblieben und funktioniert auch in der derzeit neuesten
Arduino-IDE 1.6.9.
Der Quellcode des Bootloaders liegt unter
https://github.com/micronucleus/micronucleus . Die Modifikationen am Bootloader-Sourcecode sind in dieser Datei enthalten:
0516-micronucleus-config.tar.gz
Ich habe inzwischen gar kein Windows mehr (schon gar nicht
Windows 10) und kann es nicht testen, aber offenbar macht Microsoft es
ständig schwerer, unsignierte Treiber zu installieren. Im Originalpaket
https://github.com/micronucleus/micronucleus/archive/master.zip
befindet sich auch ein Windows-Treiber und das Tool zadig.exe. Falls
der Umweg über die Installation der Digistump-Erweiterung (siehe oben
unter "Update") nicht zum Erfolg führt, kann man sein Glück mit
zadig.exe versuchen.
Attiny84A sind mittlerweile auch bei Reichelt erhältlich.