
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