VUSBduino, ein ATtiny84-Arduino        

von Ralf Beesner, DK5BU        
Elektronik-Labor   Projekte   AVR 

 

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.



Elektronik-Labor   Projekte   AVR