Sie wollen mal eben ein paar Relais, einige Schalter oder ein kleines Status-Display an Ihren Computer anschließen? Mit einem der neuen ”Legacy free“-PCs gar nicht so einfach, fehlen ihm doch die einst lieb gewonnenen Bastel-Interfaces mit parallel oder seriell zugänglichen Schnittstellen-Bits. Der Praktiker wählt den Umweg über USB, der inzwischen dank speziell programmierter Fertig-Bausteine gar keiner mehr ist.
Früher, als man sämtliche Portleitungen seines Computer-Systems noch mit Namen kannte, war die Verbindung zur Außenwelt kein Problem: Mal eben einen 8255-PIO- oder 6522-VIA-Baustein dazugefädelt, und schon verstand sich das handverdrahtete Einzelstück mit allerlei Sens- und Aktorik aus der Bastelkiste. Am ”IBM-Kompatiblen“ hatte man immerhin noch die parallele Drucker-Schnittstelle, die ihre Portleitungen auch schon mal zweckentfremdet zur Ansteuerung dicker Starkstrom-Schütze hergeben musste. Doch immer mehr PCs (Macs sowieso) müssen ohne derartiges Erbe auskommen - und da bleibt als Verbindung nach ”draußen“ nur noch der USB, will man nicht auf kostspielige PCI-I/O-Karten ausweichen.
Leider ist der USB-spezifische Entwicklungsaufwand für viele Anwendungen immens. Man benötigt einen Mikrocontroller mit integrierter USB-Schnittstelle, man muss Hunderte Seiten Dokumentation wälzen, ein Entwicklungssystem anschaffen, die Firmware für den Controller schreiben und kann sich dann erst der eigentlichen Implementierung widmen. Fertige ”generische“ USB-Interface-Lösungen wie der in [#literatur [1]] vorgestellte Spezialbaustein mögen zwar für Einzelstücke angemessen sein, sind aber bereits für Kleinserien zu teuer oder zu unflexibel.
Besonders preiswerte und einfach anzuwendende USB-I/O-Fertigbausteine brachte vor kurzem der Berliner USB-Spezialist Code Mercenaries auf den Markt. Zwei interessante Vertreter dieser Spezies beleuchten wir im Folgenden näher; die Firma implementiert aber auf Wunsch jede realisierbare Funktionalität in ihre Controller-Bausteine, was dank der vorhandenen Firmware-Bibliotheken schon für kleinere Fertigungsserien lohnen kann.
Der interessanteste Baustein aus der so genannten ”JoyWarrior“-Serie trägt das Kürzel JW24A8-8 und stellt eigentlich das aktive Innenleben analoger USB-Joysticks. ”Eigentlich“ deshalb, weil er sich auch vorzüglich für andere Eingabe-Zwecke verwenden lässt: Er fragt die Stellung von drei Potentiometern sowie maximal acht Eingabe-Tastern ab und kommt dabei mit einem Minimum an externen Bauteilen aus (siehe Schaltbild). Ein Jumper bestimmt, ob der Chip beim Reset eine automatische elektrische Zentrierung der Joystick-Achsen vornimmt oder die ”Rohdaten“ der Potentiometer-Stellungen an den Host-Rechner liefern soll. Letzteres ist bei kontinuierlich von Endpunkt zu Endpunkt arbeitenden Eingabe-Stellern, etwa für ein Modellbahn-Fahrpult mit Geschwindigkeits- und Brems-”Reglern“, sinnvoll.
|
Der USB-Chip JW24A8-8 kommt mit einer Hand voll externer Bauteile aus. Achten Sie beim Aufbau der Schaltung auf besonders kurze Verbindungen vom Entkopplungskondensator C1 zum IC. |
Selbstverständlich lässt sich der Baustein auch im Sinne des Erfinders zur Nachrüstung USB-unfähiger Joysticks verwenden. Hardcore-Gamer haben sich oft auf ihr geliebtes altes Gameport-Modell ”eingeschossen“, und wenn es das nicht mehr in USB-Ausführung gibt, ist Nachrüsten mit dem beschriebenen USB-Chip eine ausgesprochen ökonomische Lösung.
Der JW24A8-8 verwendet den Cypress-M8-Kern der CY7C63-Familie als Recheneinheit. Diese Controller besitzen ein internes USB-Interface und erlauben dem Entwickler, durch ihre hohe Integration mit einem Minimum an externen Bauteilen auszukommen. So ist selbst der Taktgenerator auf dem Chip integriert, der sich über eine PLL-Schaltung mit dem USB-Takt synchronisiert - ein Quarz- oder Keramik-Resonator entfällt dadurch.
Der verwendete Cypress-Chip hat per se gar keine analogen Eingänge; um kontinuierliche Werte wie eine Potentiometer-Stellung zu erfassen, würde er üblicherweise einen A/D-Wandler oder wenigstens einen externen Timer benötigen, der eine durch das Potentiometer vorgegebene Impulsbreite an den Controller liefert. Code Mercenaries griffen hier zu einem Trick, um sich diese Bauteile zu sparen: Die Eingänge des Controllers lassen sich einzeln softwaremäßig von TTL- auf CMOS-Schwellenwert schalten, und durch Auswerten der Hysterese zweier parallel geschalteter Eingänge (einer mit TTL-, der andere mit CMOS-Schaltschwelle) kann man so die Lade- und Entladegeschwindigkeit des Kondensators C2 bestimmen. Die wiederum ist ein Maß für den zwischen den Ausgängen XR1 bis ZR2 und den Eingängen A0 und A1 anliegenden Widerstandswert.
Als Anwender müssen Sie sich um diesen Kunstgriff natürlich nicht scheren, das macht die fest eingebrannte Firmware. Der Chip meldet sich als ”Human Interface Device“ (HID) im System an, besondere Treiber für den Einsatz als USB-Joystick benötigt man unter Windows und Mac OS nicht. Wie es sich für richtige USB-Peripherie gehört, besitzen die JoyWarrior-ICs eine gemeinsame Vendor-ID von Code Mercenaries ($7C0) und eine chiptypische Product-ID ($1104 beim JW24A8-8).
Das Funktionsprinzip verhindert allerdings, dass man das IC einfach an den Gameport-Stecker eines vorhandenen Joysticks anklemmen kann: Die Anschlüsse der Potentiometer (100 kOhm linear) müssen frei zugänglich sein. Andere Widerstandswerte lassen sich in gewissen Grenzen auch verwenden, wenn man C2 ”umgekehrt proportional“ anpasst (etwa verdoppelt auf 10n für 50-kOhm-Potis); bei allzu kleinen oder großen Werten leidet allerdings die Linearität und Genauigkeit deutlich.
Wie schon angesprochen, kommt dem Jumper JP1 vor allem bei zweckentfremdeten Anwendungen eine besondere Bedeutung zu. Bei Auswertung der unkalibrierten Potentiometer-”Rohdaten“ (gesteckter Jumper) kann es notwendig sein, Kondensator C2 etwas zu ”tunen“ (d. h. um einige Prozent zu vergrößern oder zu verkleinern), um einen Überlauf in den Endstellungen zu verhindern. Zweckmäßigerweise setzt man C2 dann aus zwei Normwerten der E12-Reihe zusammen, etwa aus 2n2 plus 2n2 parallel für einen Wert von 4n4 oder 2n2 plus 2n7 parallel für einen Wert von 4n9.
|
|
| Platinenvorschlag (150 %) zum Selberätzen oder Selbsterweitern für den JW24A8-8. Die Platine eignet sich auch für den JW24A8-16 mit 16er-Tastenmatrix. | |
Aber auch im kalibrierten Betrieb sollte durch Stecken des Jumpers zunächst der Wertebereich der Potentiometer überprüft werden; gegebenenfalls ist auch hier ein Feintuning des Kapazitätswertes notwendig. Nach Abgleich muss der Jumper für den selbst zentrierenden Betrieb entfernt werden.
Der zweite Kandidat universeller I/O-Bausteine für den USB ist der ”IO-Warrior40“, ein 40-poliges IC mit 32 digitalen I/O-Pins. Jeder einzelne Pin kann - frei konfigurierbar - wahlweise Ein- oder Ausgang sein. Zu diesem IC ist ein Entwicklungsboard mit Lochrasterfeld verfügbar, das zusammen mit dem beim Hersteller downloadbaren SDK und einer Hand voll passiver Bauteile ein preiswertes Starterkit ergibt. ICs und Platine erhalten Sie bei eMedia, einen Starterkit(-Bausatz) auch direkt beim Hersteller. Die ICs gibt es hier allerdings nur in größeren Gebinden.
|
Die größte Fläche der Starterkit-Platine nimmt das Lochrasterfeld ein. Q1 ist der in obiger Stückliste angegebene Resonator XTAL1. |
Um anspruchsvollere Dinge zu tun als nur ein paar Portpins zu setzen oder zu lesen, kennt der IO-Warrior die ”Special Mode Functions“. Mit einem einfachen Befehl schaltet man eine dieser Funktionen ein, der IO-Warrior übernimmt dann direkt die Kontrolle über spezielle I/O-Pins. In der momentanen Version besitzt der IO-Warrior40 Special Mode Functions für einen IIC-Bus-Master und zur Ansteuerung von LCD-Modulen (für Textdisplays nach dem Industriestandard HD44780, etwa das LTN211 von Sharp). Anstelle aufwendig Portpins hin- und herzuschalten, kann man dann einfach ein Kommando schicken, um eine Anzahl Bytes auf dem IIC-Bus zu lesen oder ein paar Zeichen auf einem LCD auszugeben. Sämtliche Optionen des Chips zu beschreiben würde an dieser Stelle zu weit führen; es sei deshalb auf das sehr ausführliche Datenblatt und das SDK zum IO-Warrior40 verwiesen.
Den IO-Warrior in eigene Software einzubinden ist für geübte Programmierer leicht. Unter Windows (ab 98 oder 2000) ermöglicht eine Library einfachen Zugriff von vielen Programmiersprachen. Beispiele für C++ und VisualBasic sind im SDK enthalten. Für Mac OS 9 und X umfasst die Unterstützung nicht nur eine Library, sondern auch einen Zugang mittels AppleEvents, was selbst Programmier-Anfängern keine Probleme bereiten sollte. Eine Kassenschublade von FileMaker aus öffnen oder iTunes-Musiktitel auf einem Status-LCD ausgeben? Mit AppleScript kein Problem! Praktische Anwendungen des IO-Warrior werden mit Sicherheit folgen ... (cm)
[1] Kai-Uwe Mrkor, Herbert Schmid, Angegrillt, Motorsteuerung per USB, c't 19/02, S. 196
[2] Herbert Schmid, Universal-Anschluss, Auch Messen, Steuern, Regeln mit dem USB, c't 17/02, S. 176
[3] Herbert Schmid, Universelle Architektur, Das Programmiermodell des USB, c't 17/02, S. 180
[#anfang Seitenanfang]
| Stückliste JW24A8-8 | |||
| IC1 | JW24A8-8 (eMedia 0308205C oder in größeren Stückzahlen auch bei Code Mercenaries) |
||
| R1 | 1k3 | ||
| C1 | 100n keramisch, RM 2,5 | ||
| C2 | 4n7 MKH, RM 2,5 | ||
| X,Y,Z | Potentiometer 100k lin. | ||
| USB | USB-Buchse Typ B (z. B. Conrad 743950-14) |
||
[#anfang Seitenanfang]
| Stückliste IO-Warrior40 | |||
| IC1 | IO-Warrior40 (eMedia 0308206C oder in größeren Stückzahlen auch bei Code Mercenaries) |
||
| D1...D8 | LED 3 mm | ||
| R1 | 7k5 | ||
| R2, R3 | 100k | ||
| C1 | 100n keramisch, RM 2,5 | ||
| C2 | 10µ 16V Tantal | ||
| S1 | Print-Taster | ||
| XTAL1 | 6 MHz Keramik-Resonator (kein Quarz!) | ||
| USB | USB-Buchse Typ B (z. B. Conrad 743950-14 |
||
| Platine eMedia 0308204B | |||
[#anfang Seitenanfang]
Dieses kleine AppleScript lässt die LEDs auf der Experimentier-Platine der Reihe nach aufblinken. Im Hintergrund muss der im SDK enthaltene IO-Warrior-AppleEvent-Server als Bindeglied zwischen AppleScript und USB-Device laufen.
tell application "IOWarriorAERelay" set result to IsIOWarriorPresent if result is equal to false then display dialog "IOWarrior not present" return end if WriteInterface0 port0 255 port1 255 port2 255 port3 254 WriteInterface0 port0 255 port1 255 port2 255 port3 253 WriteInterface0 port0 255 port1 255 port2 255 port3 251 WriteInterface0 port0 255 port1 255 port2 255 port3 247 WriteInterface0 port0 255 port1 255 port2 255 port3 239 WriteInterface0 port0 255 port1 255 port2 255 port3 223 WriteInterface0 port0 255 port1 255 port2 255 port3 191 WriteInterface0 port0 255 port1 255 port2 255 port3 127 WriteInterface0 port0 255 port1 255 port2 255 port3 223 WriteInterface0 port0 255 port1 255 port2 255 port3 239 WriteInterface0 port0 255 port1 255 port2 255 port3 247 WriteInterface0 port0 255 port1 255 port2 255 port3 251 WriteInterface0 port0 255 port1 255 port2 255 port3 253 WriteInterface0 port0 255 port1 255 port2 255 port3 254 set myResult to ReadInterface0 display dialog "Port 0:" & item 1 of myResult & ¬ ", Port 1: " & item 2 of myResult & ¬ ", Port 2:" & item 3 of myResult & ¬ ", Port 3:" & item 4 of myResult end tel
Version zum Drucken | Per E-Mail versenden | Heft bestellen
Permalink: http://heise.de/-288792
Kommentare lesen (16 Beiträge)
Das aktuelle Heft ist jetzt im Handel erhältlich.
Ältere Artikel können Sie über unser Zeitschriften-Archiv bestellen.