Der Klammeraffe, ein Sondertasten-Keyboard
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