Der Klammeraffe, ein Sondertasten-Keyboard       

von Ralf Beesner                 
Elektronik-Labor   Projekte   AVR 

 

In der analogen Welt gibt es Standardisierungsgremien, die zwar langsam arbeiten, aber sich auf Kompromisse einigen, die allen mehr oder weniger gerecht werden.

In der IT wird einfach irgendwas probiert, und wenn es gerade nichts besseres gibt, wird es erfolgreich und bildet einen Quasi-Standard, mit dem sich dann alle jahrzehntelang herumärgern.

So war es wohl bei der Erfindung der Programmiersprache "C"; Dennis und Ritchie hatten keine Lust aufs Tippen und verwendeten für allerlei Funktionen statt englischer Funktionsnamen irgendwelche auf der US-Tastatur bequem erreichbaren Sonderzeichen.

Diese Seuche schleppt sich auch durch neuere Programmiersprachen, und so brechen sich ganze Programmierergenerationen entweder die Finger, um die Sonderzeichen " {}[]\|~ " auf einer kontinentaleuropäischen Tastatur einzugeben, oder sie benutzen resignierend Tastaturen mit US-Layout und schreiben fürderhin "Yeichen" statt "Zeichen", wenn sie mal an eine deutsche Tastatur geraten ;-) .


Für die Nutzer von US-Tastaturen hat mal jemand ein VUSB-Sondertasten-Keyboard mit Umlaut-Tasten geschaffen; ich habe nun den umgekehrten Weg versucht und ein Sondertasten-Keyboard mit geschweiften und eckigen Klammern sowie Backslash und Tilde aufgelegt.

Es nutzt die VUSBduino-Hardware mit einem ATTiny 84A. Die frei nutzbaren sieben Pins werden per interner Pullup-Widerstände auf "high" gezogen und mit sieben Tastern beschaltet, die gegen Masse gehen.


USB-Keyboards senden ein Grundzeichen und ggf. Modifier wie "SHIFT_LEFT, "CONTROL_RIGHT" oder "ALT_RIGHT" (ALT_RIGHT entspricht der Alt-Gr-Taste, die den deutschen Nutzer zur Fingergymnasik zwingt).

Das Grundzeichen ist nicht in ASCII codiert (ein "a" ist z.B. als Byte 0x04 codiert). Daher muss man in ein USB-Dokument gucken, um herauszufinden, welche Grundzeichen durch welches Byte repräsentiert werden.

Beispiel: eine geschweifte Klammer "{" ist aus der "7" (USB-Byte 0x24, dezimal 36) und dem Modifier "ALT_RIGHT" zusammengesetzt.

USB-Tastaturen senden stets die amerikanische Tastaturbelegung, egal, was auf die Tastenkappe draufgedruckt wurde. Erst der PC-Tastaturtreiber macht das lokalisierte Zeichen daraus. Man muss daher schauen, welches Zeichen die fragliche Taste auf der US-Tastatur erzeugt.

Beispiel: der Backslash "\" liegt auf der Taste mit dem Grundzeichen "ß" - auf der US-Tastatur gibt's das aber dort nicht, auf ihr liegt dort das "-", im USB-Sprech 0x2D oder dezimal 45, das man zusammen mit dem Modifier "ALT_RIGHT" senden muss.


// Sondertasten-Keyboard für die auf kontinentaleuropäischen Tastaturen nur
// umständlich zu erreichenden Tasten { } [ ] | \ /

#include "VUSB_Keyboard.h"

void setup() {
  pinMode (2, INPUT_PULLUP);
  pinMode (3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode (5, INPUT_PULLUP);
  pinMode (6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
}


void loop() {
  // this is generally not necessary but with some older systems it seems to   // prevent missing the first character after a delay:   VUSB_Keyboard.sendKeyStroke(0);

  if (digitalRead(2) == 0) {
      VUSB_Keyboard.sendKeyStroke(36,MOD_ALT_RIGHT); // Zeichen {   }                           if (digitalRead(3) == 0) {
      VUSB_Keyboard.sendKeyStroke(39,MOD_ALT_RIGHT); // Zeichen }   }   if (digitalRead(4) == 0) {
      VUSB_Keyboard.sendKeyStroke(37,MOD_ALT_RIGHT); // Zeichen [   }   if (digitalRead(5) == 0) {
      VUSB_Keyboard.sendKeyStroke(38,MOD_ALT_RIGHT); // Zeichen ]   }    if (digitalRead(6) == 0) {
      VUSB_Keyboard.sendKeyStroke(100,MOD_ALT_RIGHT); // Zeichen |   }   if (digitalRead(7) == 0) {
      VUSB_Keyboard.sendKeyStroke(45,MOD_ALT_RIGHT); // Zeichen \   }    if (digitalRead(8) == 0) {
      VUSB_Keyboard.sendKeyStroke(48,MOD_ALT_RIGHT); // Zeichen ~   }    VUSB_Keyboard.delay(300);
}

Da man das durch die Arduino-Umgebung erzeugte Hex-File aus dem Temp-Ordner fischen kann, habe ich es beigefügt. Man kann es auch ohne Arduino-IDE und ohne Bootloader direkt in einen ATtiny 84 flashen. Die Fusebits müssen für Quarztakt und Vorteiler 1:1 gesetzt sein (lfuse 0xff, hfuse 0xdd).


Download des Sketches und des Hexfiles:  0615-vusb-klammeraffe.zip  


Elektronik-Labor   Projekte   AVR