Virtuelle Keyboards mit Arduino Leonardo     

Von Ralf Beesner                    

Elektronik-Labor   Projekte   AVR 





Die klassischen Arduinos mag ich eigentlich nicht. Der AtMega 328 selbst ist für die meisten meiner Anwendungen zu groß, eigene Shields aus einseitigen Lochrasterplatinen zu bauen ist sehr umständlich und die nutzbare Fläche auf ihnen ist zu gering. Die verwendeten Quarzfreqenzen passen nicht gut zu den üblichen seriellen Bitraten; die meist auf neueren Boards verwendeten Keramik-Resonatoren sind zu ungenau für Zeitmessungen. Batteriebetrieb ist nur sehr eingeschränkt möglich, weil auf den Boards Dauerstromverbraucher sitzen (z.B der Spannungsregler) und die Programmierumgebung Energiesparmodi nicht gut unterstützt. Auch durch die Bootloader wird man eingeschränkt.

Aber den Ardunino Leonardo und insbesondere seine kompakte Variante auf einem DIL-Board 
http://arduino.cc/en/Main/ArduinoBoardMicro
finde ich sehr interessant, weil wenige Zeilen Code sie in virtuelle USB-Keyboards bzw. -Mäuse verwandeln. Fabian Kainka hatte diese Nutzung bereits kurz vorgestellt: Der Arduino Leonardo

Die Arduino-Programmierumgebung liefert bereits einige Beispiele für den Einsatz als virtuelles USB-Keyboard mit. Sie sind allerdings an deutschen Rechnern nur mit kleinen Hindernissen nutzbar, denn sie bilden ein US-Keyboard nach: übergibt man ein "Z" an die Funktion Keyboard.write(), kommt ein "Y" raus, statt "/" kommt "(", statt "_" kommt "?" usw.

Um die Nutzung an deutschen Rechnern zu vereinfachen, habe ich mir mit Hilfe des Arduino-Beispielprogramms "KeyboardSerial" und des Terminalprogramms "Hterm" eine Übersetzungstabelle angelegt und in die Header-Datei "usToDE.h" übertragen.

Die Headerdatei muss einfach nur in den Ordner des eigenen Sketches kopiert werden und mit
#include "usToDE.h"
in den eigenen Sketch aufgenommen werden.

Im eigenen Programmcode muss man vor Aufruf der Funktion "Keybord.write()" die auszugebende Variable erst mal durch die Funktion "usToDE()" jagen. Als Beispiel ist der Sketch KeybordSerialDE beigefügt. Er wandelt serielle Signale (9600bit/s) an Pin1 (Rx1) des Arduino in einen Keyboard-Tastendruck um. Achtung, es muss ein TTL-Signal sein, also nicht direkt eine serielle PC- Schnittstelle mit Pin1 verbinden!


Die Funktion Keyboard.print() ist dafür gedacht, ganze Strings komfortabel auszugeben. Die Ausgabe erfolgt jedoch ebenfalls "auf amerikanisch". Sind nur wenige Sonderzeichen in den Strings enthalten, kan man innerhalb des Strings die Zeichen austauschen, also z.B. statt einen "Z" jeweils ein"Y" schreiben.  Bei zahlreichen Sonderzeichen bleibt nur der umständliche Weg, den String jeweils in Chars zu zerlegen, diese an "usToDE()" zu übergeben und mit "Keyboard.write()" auszugeben.

Download: KeyboardSerialDe.zip

/* 
bases on:
http://www.arduino.cc/en/Tutorial/KeyboardSerial

gibt seriell empfangene Signale über KB aus (umgemappt)
*/

#include "usToDE.h"

void setup() {
// open the serial port:
Serial1.begin(9600);
// initialize control over the keyboard:
Keyboard.begin();
}

void loop() {


// check for incoming serial data:
if (Serial1.available() > 0) {
// read incoming serial data:
unsigned char inChar = Serial1.read();
// map US-keyboard to german keyboard
unsigned char key = (usToDE[inChar]);
// Type the next ASCII value from what you received:
Keyboard.write(key);
}
}


Datei usToDE.h:

// ummappen für deutsches KeyBoard-Layout
// klappt nicht für alle Zeichen (z.B. Umlaute)

unsigned char usToDE[256] =
{
// 0, 0, 0, 0, 0, 0, 0, 0, BS, TB, CR, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 0, 0, 13, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

// BL, !, Ä, §, $, %, /, ä, ), =, (, `, ,, ß, ., -,
// " & / ( ) * + - /
32, 33, 64, 0, 36, 37, 94, 38, 42, 40,125,184, 44, 47, 46, 38,

// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, Ö, ö, ;, ´, :, _,
// : ; = ?
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 62, 60, 0, 41, 0, 95,

// ", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O,
// 0
0, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,

// P, Q, R, S, T, U, V, W, X, Z, Y, ü, #, +, &, ?,
// Y Z [ \ ] ^ _
80, 81, 82, 83, 84, 85, 86, 87, 88, 90, 89, 0, 0, 0, 96, 63,

// ^, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o,
// `
43, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,

// p, q, r, s, t, u, v, w, x, z, y, Ü, , *, °, 0,
// y z { | } ~
112,113,114,115,116,117,118,119,120,122,121, 0, 0, 0, 0, 0,


//
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

};


Elektronik-Labor   Projekte   AVR