Datenhandschuh: SubD9♂ SubD9♂ Adern- textile Fingerkuppen-Kontaktfläche bzw. Pin farbe 24LC02B (Kennungs-IC im Steckergehäuse) 1 gn Daumen 2 rt Zeigefinger 3 ge Mittelfinger 4 sw Ringfinger 5 ws kleiner Finger 6 (4)+(7) GND + kein Schreibschutz 7 (8) Ucc 8 (6) SCL 9 (5) SDA Kontaktwiderstand: ca. 1,5 kΩ 24LC02: 256-Byte-EEPROM mit I²C-Bus (Kopier-Erschwernis?) ┌──────────────────┐ │Box-Eigenschaften │ └──────────────────┘ Ohne oder mit falschem Handschuh wird beim Einschalten die zugehörige LED rot, ansonsten grün aufleuchten. Nix mit PnP! Die Box funkioniert auch mit nur einem Handschuh. Inhalt: Mikrocontroller 68HC711 (4KB ROM, 192 Byte RAM, 1x COM, 26 E/As) sowie diverses Fußvolk; Eingangsgleichrichter! (Blechgehäuse-Erdung gefährlich!) Schnittstelle: 9600,n,8,1 Anwesenheitstest: Senden Empfang 2A 2A 82 3F 8F Protokoll ohne Zeitstempel: 80 8F (wird bei jeder Veränderung automatisch gesendet) Kontaktgruppen = 0 oder mehr Kontaktgruppe = 2 Bytes für max. 10 Kontakte, erstes Byte = linker Handschuh zweites Byte = rechter Handschuh jeweils Bit 4 = Daumen bis Bit 0 = kleiner Finger Die Kontaktgruppen sind in der Reihenfolge der letzten Änderung sortiert, d.h. die neueste Verbindung kommt zuerst Protokoll mit Zeitstempel: 81 8F Zeitstempel = 2 Bytes für 14 Bit Zeitdifferenz zum letzten Paket in ms (max. 16383, kein Wrap-Around!) erstes Byte = untere 7 Bit zweites Byte = obere 7 Bit Sonstige Daten: Antwort auf Zeitstempel-Einschaltung "T1": 82 31 80 Antwort auf Zeitstempel-Ausschaltung "T0": 82 30 80 Abfrage linker Handschuh "CL": 82 "L MED GL-8002 V2.0B 320402" 8F Abfrage rechter Handschuh "CR": 82 "R MED GL-8003 V2.0B 320402" 8F Wenn Handschuh abgezogen: 82 26x{FF} 8F (Bug oder Feature?) Wenn kein Handschuh angesteckt: 82 "R NO GLOVE" 8F Abfrage Firmware "CP": 82 "V3.0B PINCH by Fakespace Inc. 1995 (C) All Rights Reserved" 8F Es sind Pausen beim Senden zwischen den Zeichen erforderlich! (mehr als 2 Stoppbits) ┌─────────────────────────────────────┐ │Eigenschaften der Eigenbau-Steuerung │ └─────────────────────────────────────┘ Kompatibel zur Box. Mikrocontroller: ATmega8 oder ATmega88. * Die Buchse X1 ist die (bei Vorderansicht) linke Buchse. Die LED ist in der Nähe von X1. * Die Buchse X2 ist die rechte Buchse. * Wo welcher Datenhandschuh angesteckt wird, ist der Firmware egal. Der reguläre Anschluss ist: X1 = linker Handschuh. * Die Präsenz des Datenhandschuhs wird entweder wie gehabt durch den seriellen EEPROM im Stecker des Datenhandschuhs (erstes Byte = 'L' für den linken und = 'R' für den rechten Handschuh), oder durch eine Brücke (6-9 = links, 6-8 = rechts) detektiert. * Auch ohne Präsenzkennung werden entsprechende Kontakte gemeldet. Nur die automatische Links-Rechts-Erkennung ist dann außer Kraft. * Die Steuerung implementiert ein „serielles USB-Gerät“ mittels AVRUSB (siehe http://www.obdev.at/products/avrusb/index-de.html) und AVR-CDC (siehe http://www.recursion.jp/avrcdc/). Kein Treiber ist unter Windows und Linux erforderlich. Unter Windows ist lediglich eine .INF-Datei erforderlich. Die USBSER.INF ermöglicht einen generellen Zugriff auf (künftig) alle solche Geräte, die GLOVES.INF ist maßgeschneidert für diese Steuerung. * Dieses Gerät benötigt nur 20 mA USB-Strom; im Standby-Betrieb (bspw. bei heruntergefahrenem Laptop) nur 200 µA, das absolute Minimum für USB-Geräte. * Die Steuerung kennt einen Bootload-Betrieb. Dieser wird aktiviert, indem beim an X1 angesteckten Handschuh der Daumen und der kleine Finger kontaktiert wird, während USB angeschlossen wird. Dann wird ein USB-HID-Gerät (HID = Human Interface Device) erkannt. Mit einer speziellen Software „bootloadHID.exe“ kann ein Firmware-Update (max. 6 Kilobyte) über USB ausgeführt werden (siehe Quelltext). * Der Austausch oder die Änderung des Bootloaders (2 Kilobyte) kann nur über ein ATmega-typisches Programmiergerät erfolgen. Dazu muss das Gehäuse geöffnet und der Programmier-Adapter an 4-5 Lötinseln kontaktiert werden. * Die zur Verfügung gestellte serielle Schnittstelle kann ganz regulär mit CreateFile("COMx") geöffnet werden. Baudrate und sonstige übertragungsparameter sind egal und werden allesamt ignoriert. │ Protokoll └─────────── Die seriellen (Stream-)Daten werden durch spezielle Bytes mit gesetztem Bit 7 in Datagramme (Datenpakete) zerlegt. Zeitstempel einschalten: Senden Empfang "T1" 82 "1" 8F Fortan bei jedem Kontakt-Ereignis Datenpaket mit Startbyte 81h und Zeitstempel Zeitstempel ausschalten: Senden Empfang "T0" 82 "0" 8F Fortan bei jedem Kontakt-Ereignis Datenpaket mit Startbyte 80h Masseverbindung einschalten: Senden Empfang "G1" 82 "1" 8F Fortan auch Masseverbindungen melden (Kennung: Bit 5 beider Bytes gesetzt) Masseverbindung ausschalten: Senden Empfang "G0" 82 "0" 8F Fortan keine Masseverbindungen melden (solche Finger haben „keinen Kontakt“, auch nicht untereinander) Abfrage linker Handschuh: Senden Empfang "CL" 82 "L MED GL-8002 V2.0B 320402" 8F wenn Handschuh mit EEPROM "CL" 82 "L GLOVE" 8F wenn Handschuh mit Brücke "CL" 82 "L NO GLOVE" 8F wenn kein Handschuh Abfrage rechter Handschuh: Senden Empfang "CR" 82 "R MED GL-8002 V2.0B 320402" 8F wenn Handschuh mit EEPROM "CR" 82 "R GLOVE" 8F wenn Handschuh mit Brücke "CR" 82 "R NO GLOVE" 8F wenn kein Handschuh Abfrage der Firmware: Senden Empfang "CP" 82 "V3.0B PINCH by Fakespace Inc. 1995 - haftmann#software" 8F Wortlaut und Länge kann sich später noch ändern. Anwesenheitstest: Senden Empfang xx xx 82 "?" 8F xx muss zwischen 20 und 7E liegen und keine der oben beschriebenen Kombinationen "CP", "CL", "CR", "T0", "T1", "G0" oder "G1" sein. Protokoll ohne Zeitstempel: Empfang 80 8F (wird bei jeder Veränderung automatisch gesendet) Kontaktgruppen = 0 oder mehr Kontaktgruppe = 2 Bytes für max. 10 Kontakte, erstes Byte = linker Handschuh zweites Byte = rechter Handschuh jeweils Bit 4 = Daumen bis Bit 0 = kleiner Finger Bit 5 = Masseverbindung (siehe "G1") Die Kontaktgruppen sind in der Reihenfolge der letzten Änderung sortiert, d.h. die neueste Verbindung kommt zuerst Maximale Paketlänge: 12 Bytes Protokoll mit Zeitstempel: Empfang 81 8F Zeitstempel = 2 Bytes für 14 Bit Zeitdifferenz zum letzten Paket in ms (max. 16383, kein Wrap-Around!) erstes Byte = untere 7 Bit zweites Byte = obere 7 Bit Maximale Paketlänge: 14 Bytes Alle Sendekommandos bestehen aus 2 Bytes. Zur Resynchronisation sollte ein Byte außerhalb des Bereiches 20h-7Eh gesendet werden. ┌─────────────────────────────────────────────────────────────────────┐ │ Tipp zur benutzerfreundlichen Auswahl einer seriellen Schnittstelle │ └─────────────────────────────────────────────────────────────────────┘ Man sieht viel Unsinn, wenn sich Programmierer damit quälen, dem Anwender eine gescheite Liste mit den im System vorhandenen seriellen Schnittstellen anzubieten. Die Endlösung, welche eine Combobox sogar bei Plug-and-Play-Ereignissen aktualisiert (die Eigenbau-Steuerung darf also während der Auswahl munter angesteckt und abgezogen werden), ist hier zu sehen: http://www-user.tu-chemnitz.de/~heha/viewzip.cgi/hs_freeware/Funkuhr.zip/src/DlgHardware.c?ainv=C#HardwareDlgProc besonders der Abschnitt bei WM_DEVICECHANGE. Die Baudrate stellt man am einfachsten mittels BuildCommDCB() ein. Mit geschickt gewählten Timeouts bekommt man von Windows keine Datenpaket-Bruchstücke, sondern ganze Pakete. heha, 080221