Anleitung: UNO als Human Interface Device (HID) Tastatur

Referenz: Meine Anleitung versteht sich als Ergänzung zu How to Make a Arduino HID Keyboard.

Mein PC hat Win10 installiert.

Motivation: Hier im Forum taucht immer mal wieder die Frage auf, wie man einen UNO als Tastaturersatz beispielsweise im Zusammenhang mit Spielen verwenden kann. Andere Arduinos sind von sich aus besser für so ein Vorhaben geeignet, aber wer unbedingt will, soll es sich antun.

Alternativ möchte ich noch auf das Arduino HID Project und HoodLoader von NicoHood hinweisen, die ich aber noch nicht probiert habe.

Beschreibung: Die Arduino UNOs enthalten neben dem Hauptprozessor ATmega328 auch einen ATmega16U2 als Kommunikationsprozessor zwischen Hauptprozessor und dem USB-Anschluß. Nachbauten können eine andere Hardware haben. Der ATmega16U2 kann so umprogrammiert werden, daß er als HID Tastatur Tastaturdrücke zum USB-Anschluß schickt, die der angeschlossene PC dann wie von einer Tastatur kommend auswertet. Die Arduino-IDE erkennt den Arduino dann nicht mehr, weshalb kein Upload von Programmen mehr möglich ist. Aber keine Sorge, man kann in den Originalzustand zurück.

Schritt 1: Treiber für 16U2 installieren

  1. Gerätemanager des PCs öffnen und UNO anschließen.
    grafik

  2. Reset für den ATmega16U2 durch kurzes (ca. 2 sec) Verbinden der rot umrandeten Pins, wodurch die mit "L" beschriftete LED kurz blinkt:

  3. Der Gerätemanager zeigt nun ein "unbekanntes Gerät":
    grafik
    Davon die Eigenschaften/Treiber aktualisieren/Auf meinem Computer nach Treibern suchen klicken. Mein Pfad zur Datei atmel_usb_dfu.inf sieht dann so aus:


    grafik
    Nach Klicken auf "Weiter" die Sicherheitsabfrage bestätigen, dann ist der Treiber installiert:

    grafik
    Eigenschaften schließen, dann zeigt der Gerätemanager
    grafik
    grafik
    Damit ist der für ATmega16U2 notwendige Treiber installiert.

Schritt 2: Flip installieren

  1. Aus der Referenz "Step 9: Install Flip" und " Step 10: FLIP - Device Selection" durchführen.

Schritt 3: Anwendungsprogramm auf den Arduino hochladen

  1. Nun kann ein Anwendungsprogramm für den ATmega328 erstellt werden. Ich habe das Programm aus der Referenz etwas abgewandelt, indem ich INPUT_PULLUP verwende, die Pins demzufolge gegen GND schalte und auf LOW abfrage. Listing am Ende des Beitrags.
    UNO von USB trennen, wieder anschließen, dann sollte der USB-Port im Gerätemanager sichtbar sein:
    grafik

  2. Mittels Arduino-IDE Anwendungsprogramm hochladen.

Schritt 4: ATmega16U2 als HID einrichten

  1. Wie in Schritt 1.2 beschrieben, die zwei rot umrandeten Pins kurz verbinden, um einen Reset des ATmega16U2 auszulösen. Danach verschwindet im Gerätemanager die Anzeige der USB-Verbindung und stattdessen erscheint ATmega16U2:
    grafik

  2. FLIP starten (sollte eigentlich noch laufen) und µC ATmega16U2 auswählen (siehe Referenz Step 10).

  3. USB-Port öffnen (siehe Referenz Step 13).

  4. HEX-Datei Arduino-keyboard-0.3.hex auswählen (siehe Referenz Step 14).

  5. Mit "Run" die HEX-Datei auf den ATmega16U2 laden (siehe Referenz Step 15).

  6. Gerätemanager öffnen und "Tastaturen" anzeigen lassen, sieht bei mir so aus:
    grafik

  7. UNO von USB trennen und wieder verbinden. Nun gibt es eine zweite HID-Tastatur. Der PC sieht den UNO jetzt als Tastatur.

Schritt 5: UNO als HID verwenden

  1. Beispielsweise einen Editor öffnen.
  2. Eine der Tasten kurz drücken, der entsprechende Buchstabe 'w', 'a', 's' oder 'd' wird wiederholt ausgegeben.
  3. Eigentlich wäre man an dieser Stelle am Ziel, würde das Anwendungsprogramm schon tun, was man möchte. Bei dem Testprogramm wird das kaum der Fall sein, also sollte der UNO wieder in den Originalzustand versetzt werden, um ein verändertes Anwendungsprogramm hochladen zu können.

Schritt 6: Anwendungsprogramm ändern

  1. Wie in Schritt 1.2 beschrieben, die zwei rot umrandeten Pins kurz verbinden, um einen Reset des ATmega16U2 auszulösen. Danach verschwindet im Gerätemanager die Anzeige der HID-Tastatur und stattdessen erscheint ATmega16U2:
    grafik

  2. FLIP starten (sollte eigentlich noch laufen) und µC ATmega16U2 sollte noch ausgewählt sein.

  3. USB-Port öffnen.

  4. HEX-Datei Arduino-usbserial-uno.hex auswählen.

  5. Mit "Run" die HEX-Datei auf den ATmega16U2 laden.

  6. UNO von USB trennen und wieder verbinden. Nun sollte der USB-Port, eventuell mit anderer Portnummer, sichtbar sein:
    grafik
    Der UNO hat nun wieder seinen Originalzustand.

  7. Arduino-IDE öffnen, Anwendungsprogramm ändern und hochladen, dann weiter mit Schritt 4.
    Die Schritte 4 bis 6 so lange wiederholen, bis das Anwendungsprogramm tut, was es soll. Wem das zu umständlich ist, möge bei NicoHood nach Alternativen schauen, da sind drei Möglichkeiten beschrieben


Listing zu Punkt 5:

/* Example code
 * by Eward Hage
 */
uint8_t buf[8] = { 0 };   //Keyboard report buffer

#define PIN_W 4 // Pin for w
#define PIN_A 5 // Pin for a
#define PIN_S 6 // Pin for s
#define PIN_D 7 // Pin for d

void setup() {
  Serial.begin(9600); // Setup Serial communication

  //Set pinmode of Input pins
  pinMode(PIN_W, INPUT_PULLUP);
  pinMode(PIN_A, INPUT_PULLUP);
  pinMode(PIN_S, INPUT_PULLUP);
  pinMode(PIN_D, INPUT_PULLUP);
}

void loop() {
//When button representing W is pressed  
  if (digitalRead(PIN_W) == LOW) { 
    buf[2] = 26;   // W keycode
    Serial.write(buf, 8); // Send keypress
   // Serial.println("W");
    releaseKey();
  }
   
//When button representing A is pressed
  if (digitalRead(PIN_A) == LOW) {
    buf[2] = 4;   // A keycode
    Serial.write(buf, 8); // Send keypress
   // Serial.println("A");
    releaseKey();
  } 
  
//When button representing S is pressed
  if (digitalRead(PIN_S) == LOW) {
    buf[2] = 22;   // S keycode
    Serial.write(buf, 8); // Send keypress
   // Serial.println("S");
    releaseKey();
  } 
  
//When button representing D is pressed
  if (digitalRead(PIN_D) == LOW) {
    buf[2] = 47;   // [ keycode
    Serial.write(buf, 8); // Send keypress
  //  Serial.println("[");
    releaseKey();
  } 
  
}
// Function for Key Release
void releaseKey() 
{
  buf[0] = 0;
  buf[2] = 0;
  Serial.write(buf, 8); // Send Release key  
}
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.