GeekzeugHardwareLifehacks

Erstaunlich simpel: Eigene USB-Eingabegeräte bauen

Mit wenig Aufwand könnt Ihr Makrotastaturen, Gamepads oder Mediacenter-Controller selbst basteln

Joypad, Maus, Tastatur und Touchpad haben eines gemeinsam: Es sind Eingabegeräte, die in der Regel per USB am Rechner hängen. Per Knopfdruck werden dann Signale gesendet, die Windows zum Beispiel als Linke Maustaste oder a oder BUTTON X oder auch STRG+ALT+ENTF interpretiert. Und wenn man nun weiß, dass einige Arduino-Boards von Windows schlicht als Tastatur erkannt werden, besteht ein Eingabegerät im Grunde nur aus einem Arduino, ein paar wenigen Zeilen Code und Knöpfen – in einem Gehäuse Eurer Wahl.

Hier das Ganze mal als supereinfache, generische, übersichtsmäßige Minimalbasis für eigene Projekte – in aller Kürze!

Arduino und Material

Zunächst mal: Wenn Ihr keine Ahnung habt, was es mit Arduino auf sich hat, schaut mal hier in unsere Einführung. Und wenn Ihr mal ein komplettes Projekt sehen wollt, eine Makro-Schalttafel in einer Alu-Schiene, guckt Euch mal die Tutobar an.

Falls Ihr eines der populären Arduino-Einsteiger-Sets gekauft habt, habt Ihr vermutlich einen Arduino Mega – der funktioniert hier schon mal nicht. Es muss sich um ein Arduino-Board auf Basis des 32u4-Chips handeln, zum Beispiel einen Arduino Leonardo.

Für die Eingabe könnt Ihr beliebige Ein-Aus-Schalter verwenden – das dürfte die einfachste Variante sein. Aber natürlich lassen sich auch Sticks, Drehregler, Kippschalter und so weiter verwenden. Für die Ein-Aus-Schalter seht Ihr unten ein konkretes Beispiel, das Vorgehen ist im Grunde aber immer gleich:

  • Eingabe-Hardware gemäß Dokumentation verbinden.
  • Eine zur Hardware passende Bibliothek installieren.
  • Die Bibliothek für die Tastatur-Funktionen installieren.
  • Jeder Eingabeaktion eine Taste oder Tastenkombination zuordnen.

Das Ganze ist furchbar simpel und Ihr könnt alle Energie in das Ausdenken und Bauen von Gehäusen stecken – was wiederum nicht immer ganz so furchbar simpel ist.

Aufbau mit Pushbuttons

Die Pushbuttons sind einfache Druckknöpfe, die den Stromkreis beim Drücken schließen und beim Loslassen öffnen – wie auch die Tasten der Tastatur. Ein Beinchen kommt in die Erde, also den GND-Anschluss. Das andere Beinchen kommt in einen beliebigen IO-Anschluss vom Arduino. Mehr ist es nicht. Mit einem Steckbrett realisiert, sieht das dann zum Beispiel so aus:

arduino fritzing
Der Anschluss von Pushbuttons ist wirklich trivial.

Auch die Software-Seite ist ziemlich trivial: Zunächst installiert Ihr die Bibliotheken RBD_Buttons, RBD_Timer und Keyboard und fügt sie per include-Anweisung ein:

arduino ide
Für fast alles gibt es Bibliotheken, die die Arbeit einfach machen.

Anschließend definiert Ihr die einzelnen Buttons, sprich Ihr ordnet Ihnen die IO-Anschlüsse zu, die Ihr genutzt habt – hier wird dem button1 der Pin 3 zugeordnet:

RBD::Button button1(3);

Im Setup-Teil muss lediglich die Tastatur-Funktion gestartet werden:

void setup() {
Keyboard.begin();
}

Und schließlich werden im Loop-Teil die Zeichen für die Buttons vergeben:

void loop() {
if(button1.onPressed()) {
    Keyboard.press('a');
    delay(100);
    Keyboard.releaseAll();
  }

Was hier passiert:

  • button1.onPressed: Startet die Aktion wenn button1 gedrückt wird.
  • Keyboard.press(‚a‘): Sendet das Zeichen a.
  • delay(100): Verzögerung um 100 ms (gegen versehentliche Doppelklicks).
  • Keyboard.releaseAll: Taste wird losgelassen (sonst aaaaaaaaaaaaaa…).

Wenn Ihr Tastenkombinationen verwenden wollt, müsst Ihr diese vorher noch definieren – ein komplettes Beispiel findet Ihr im Tutobar-Artikel Teil 2 unter Arduino Sketch.

Wie geht’s weiter?

Euer Controller ist damit auch schon fertig – nun, vielleicht noch ohne Gehäuse … Und natürlich werdet Ihr in der Praxis selten mit einem Breadboard basteln, sondern müsst die Kabel auf einer Lochrasterplatte oder ähnlich verlöten oder mit einem Stecksystem verbinden. Aber die Signale kommen schon an.

Was die Signale nun auslösen, liegt wiederum bei Euch. Ihr könnt zum Beispiel Windows-Kürzel verwenden – dann übernimmt Windows die Interpretation der Eingabeaktionen. In einem Spiel oder einer Kreativsoftware lassen sich in der Regel auch Kürzel anlegen, die Ihr nur auf die entsprechenden Buttons mappen müsst. Ich persönlich lasse gerne AutoHotkey für die Interpretation laufen – das ist simpel, mächtig und ich muss das Arduino-Sketch nie ändern. Auch die Tutobar arbeitet so.

Tutobar in Demo-Action

Spezielle Eingabegeräte sind übrigens gar nicht so selten, wie man vielleicht meinen möchte: Separate Num-Blöcke, MIDI-Controller, Tastaturen für Videoschnitt, Lenkräder für Autorennen, Makrotastaturen und so weiter tummeln sich überall. Wie wäre es zum Beispiel mit ein in die Armlehnen vom Bürosessel eingebautes Gamepad? Aus ergonomischer Sicht bestimmt keine schlechte Idee ;)

Hinweis: Im Text befinden sich allerlei Amazon-Partnerlinks – die Kurzversion: Wenn Ihr klickt und kauft, bekommen wir Provision. Danke dafür. Die Langversion ist wirklich ziemlich lang.

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

5 Kommentare

  1. immer wenn ich versuche das Programm hochzuladen, bekomme ich diese Nachricht.

    C:\Users\rapha\AppData\Local\Temp.arduinoIDE-unsaved2024116-1780-i08g38.5mf4\sketch_feb16a\sketch_feb16a.ino: In function ‚void setup()‘:
    C:\Users\rapha\AppData\Local\Temp.arduinoIDE-unsaved2024116-1780-i08g38.5mf4\sketch_feb16a\sketch_feb16a.ino:9:1: error: ‚Keyboard‘ was not declared in this scope
    Keyboard.begin();
    ^~~~~~~~
    C:\Users\rapha\AppData\Local\Temp.arduinoIDE-unsaved2024116-1780-i08g38.5mf4\sketch_feb16a\sketch_feb16a.ino: In function ‚void loop()‘:
    C:\Users\rapha\AppData\Local\Temp.arduinoIDE-unsaved2024116-1780-i08g38.5mf4\sketch_feb16a\sketch_feb16a.ino:14:3: error: ‚Keyboard‘ was not declared in this scope
    Keyboard.press(‚a‘);
    ^~~~~~~~
    Mehrere Bibliotheken wurden für „Keyboard.h“ gefunden
    Benutzt: C:\Users\rapha\OneDrive\Documents\Arduino\libraries\Keyboard
    Nicht benutzt: C:\Users\rapha\AppData\Local\Arduino15\libraries\Keyboard
    exit status 1

    Compilation error: ‚Keyboard‘ not found. Does your sketch include the line ‚#include <Keyboard.h>‘?

  2. Kann so auch testen in einen EIngabe maske einen geben?
    schritt 1 wäre ein Mouse klicken und die eingabe zu aktivieren
    Schritt 2 wäre die Eingabe einer Nummer
    Schritt 3 eine dann Enter
    dir nummern kämmen aus einer Datei

  3. Hallo
    wie sieht denn der Sketch aus wenn ich mehrere Buchtaben zufügen möchte ? void loop() {
    if(button1.onPressed()) { ?????
    Keyboard.press(‘a’); ?????
    delay(100);
    Keyboard.releaseAll();
    }
    vielen Dank im voraus
    Carlos

    1. Ich habe hier gerade nichts zum Testen, aber schau doch mal in den zweiten Teil der Tutobar-Artikel. Die Tutobar war quasi eine praktische Umsetzung eines solchen USB-Eingabegeräts. In dem Artikel ist ein Beispiel für Tasten mit Modifiern (ALT, STRG, SHIFT):

      void loop() {

      // Alle Pushbuttons mit Kürzeln der Art
      // STRG+ALT+UMSCHALT+buchstabe belegen
      // Pushbutton 1
      if(button1.onPressed()) {
      Keyboard.press(ctrlKey);
      Keyboard.press(altKey);
      Keyboard.press(shiftKey);
      Keyboard.press('a');
      delay(100);
      // Tasten wieder loslassen - sonst spamt
      // der Arduino den PC komplett voll ;)
      Keyboard.releaseAll();
      }
      [...]

      Man kann einfach mehrere Tasten/Befehle unterhalb einer if-Abfrage versammeln. Vermutlich musst Du die einzelnen Tasten, die gesendet werden sollen dann aber einzeln über Keyboard.release() loslassen statt alle zusammen über Keyboard.releaseAll().

  4. void loop() {
    if(button1.onPressed()) {
    Keyboard.press(‚a‘);
    delay(100);
    Keyboard.releaseAll();
    }

    hier fehlt am ende noch eine }
    Danke für den tollen Artikel :-)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Schaltfläche "Zurück zum Anfang"
Schließen

Ooopsi!

Bitte deaktiviere Deinen Adblocker.