Arduino als USB HID


25

Ist es möglich, ein HID-Gerät (wie eine Tastatur) mit einem Arduino Uno zu bauen?

Zur Zeit habe ich Tasteneingänge auf dem Arduino, die Ausgänge auf der seriellen Leitung geben. Wie kann ich meine aktuelle Firmware in etwas verwandeln, das sich wie eine HID-Tastatur verhalten kann?

  • Soll ich einen neuen Windows-Gerätetreiber schreiben?
  • Soll ich eine Softwareschicht erstellen, die meine seriellen Daten aufnehmen und von Windows als HID-Eingabe lesen lässt?
  • Gibt es einen besseren Weg, dies zu erreichen, wenn es überhaupt möglich ist?

1
Ich kann mich irren, aber es geht nicht wirklich um Arduino. Es geht um die Entwicklung von Windows-seitigen Gerätetreibern.
Asheeshr

1
Erste Antwort in Google: mitchtech.net/arduino-usb-hid-keyboard ... aber Sie haben nicht angegeben, welches Arduino. Auf einem Leonardo ist es eingebaut und der entsprechende Treiber ist bereits vorhanden (siehe arduino.cc/en/Reference/MouseKeyboard ).
FredP

Ich verwende ein Uno, aber ich schaue mir an, was Sie geschrieben haben, weil wir das letzte Mal über das DFU-Update nachgedacht haben, aber wir haben ein bisschen Angst vor Ziegeleien, da die Komponenten in meiner Gegend nicht so leicht verfügbar und billig sind wie in den meisten anderen setzt.
Anomalie

3
@AsheeshR Diese Ausgabe ist jetzt auf meta: meta.arduino.stackexchange.com/q/102/46
Ricardo

1
Nun, das ist definitiv möglich, da der Arduino Uno über einen Atmega16u2 als USB-Treiberchip verfügt, kann der Benutzer entweder DFU- oder ICSP-Flashing verwenden, um eine Firmware in der Nähe des Leonardo auf dem Gerät zu installieren, wodurch sich der Arduino wie eine HID-Tastatur verhält. Es ist keine Windows-Entwicklung erforderlich, und es wird kein Treiber erstellt, da USB / HID-Geräte standardmäßig erkannt werden. dh diese Frage sollte wieder geöffnet werden.
Zmo

Antworten:


14

Ist es möglich, ein HID-Gerät (wie eine Tastatur) mit einem Arduino Uno zu bauen?

ja ist es! Und es gibt ein großartiges Tutorial, wie man das hier macht

Zur Zeit habe ich Tasteneingänge auf dem Arduino, die Ausgänge auf der seriellen Leitung geben. Wie kann ich meine aktuelle Firmware in etwas verwandeln, das sich wie eine HID-Tastatur verhalten kann?

Wie das Tutorial zeigt, müssen Sie Ihren Firmware-Code umwandeln, damit Sie, anstatt die Ereignisse auszudrucken, tatsächlich Ereignisse auslösen. Was Sie tun müssen, ist zu Ihrem Code hinzuzufügen:

void triggerKey(uint8_t mod, uint8_t chr) {
    uint8_t buf[8] = {mod, chr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    // press key
    Serial.write(buf, 8);
    // emulate key press delay
    delay(10);
    buf[1] = 0x00;
    // release key
    Serial.write(buf, 8);
}

Was Sie hier tun, ist das Senden von Ihren wichtigsten Arduino-Mikrocontroller-Ereignissen über die serielle Leitung an den kleineren Mikrocontroller, der die USB-Kommunikation verwaltet. Dieser Mikrocontroller nimmt diese "Schlüsselpuffer" und überträgt sie, wenn die Taste der USB-HID-Tastatur über USB gedrückt wird.

Beachten Sie, dass das Schlüsselzeichen ( chrim Code hier) tatsächlich ein über USB gesendeter Schlüsselcode ist, der von Ihrem USB-HID-Treiber interpretiert wird und der ihn dann unter Verwendung des aktuellen Layouts, das Sie für Ihre Tastatur eingerichtet haben, in ein reales Zeichen umsetzt.

Das mod Zeichen ist eine der Modifizierertasten auf der Tastatur (Umschalttaste, Steuerungstaste, Alttaste ...) und 0x00kein Modifizierer.

  • Soll ich einen neuen Windows-Gerätetreiber schreiben?

Nein, brauchst du nicht! Mit dem DFU-Upgrade wird Ihr Arduino von Windows als USB-Tastatur erkannt.

  • Soll ich eine Softwareschicht erstellen, die meine seriellen Daten aufnehmen und von Windows als HID-Eingabe lesen lässt?

Das müssen Sie auch nicht tun, und das ist aus vielen Gründen eine sehr schlechte Idee:

  • Ihre Lösung wäre nicht portabel und Sie müssten daher für jede Plattform, die Sie verwenden, etwas hacken.
  • Ihre Lösung würde viel neuen Code beinhalten. Je mehr Code man schreibt, desto mehr Fehler sind wahrscheinlich in Ihrem System,
  • Ihre Lösung wäre wirklich hackisch, da sie sich wie ein Gerätetreiber (dh Kernel Land ) verhält , der Eingaben von einem Benutzerprogramm (dh Benutzer Land ) entgegennimmt und wahrscheinlich nicht funktioniert, eine Hölle zum Debuggen ist und für Sicherheitsprobleme anfällig ist. ..Wenn das überhaupt geht!

Ich verwende ein Uno, aber ich werde sehen, was Sie geschrieben haben, weil wir das letzte Mal über das DFU-Update nachgedacht haben, aber wir haben ein bisschen Angst vor Ziegelei

Schließlich haben Sie in einem Kommentar Bedenken, Ihr Arduino zu ziegeln. Bitte glauben Sie mir und dem Autor des Artikels, dass Sie Ihr Arduino bei einem Firmware-Flash nicht ziegeln können:

HINWEIS: Es besteht keine Möglichkeit, das Gerät mit dieser Methode zu „mauern“. Die Arduino-Bootloader-Firmware kann immer mit dem DFU-Protokoll aktualisiert werden!

Falls etwas wirklich schlimmes schief geht und Sie eine Bootloader-Beschädigung im kleinen AVR (atmega8u2) feststellen, können Sie es mit einem anderen Arduino oder einem Atmel-Programmierer mithilfe der 6 Pins neben dem USB-Stecker erneut flashen .

Am Ende wissen Sie, dass der einzige Weg, einen AVR, also auch einen Arduino, zu ziegeln, darin besteht, mit den Sicherungen zu spielen und die Programmiersicherungen zurückzusetzen. Und selbst dann können Sie HVSP verwenden , um Ihr Gerät zu speichern, obwohl es oft einfacher ist , nur einen neuen Chip zu nehmen.


1
Vielen Dank für all die nützlichen Informationen.
Anomalie

Nun, der richtige Weg, einen AVR zu ziegeln, ist mit Überstrom / Überspannung. Dann wird es geröstet ...
user2973

Aber dann heißt es nicht Backen, sondern Braten, oder wie Sie sagen, Toasten. Setzen Sie 15 Ampere durch die MCU, und ich wette, Sie werden sehen, wie sie durch den Raum
springt ;-)

Wie kann ich einen bestimmten Schlüssel freigeben? Ich möchte eine Taste emulieren und dann loslassen. Und auch in der Verknüpfung geht das Zeichen zu Array [2], während hier zu [1] geht. Warum?
5argon

Nun, wie in meinem Beispiel gezeigt, machst du das in zwei Schritten: Erst drückst du die Taste, dann gibt es die Verzögerung und dann lässt du sie los. Dann müssen Sie sich selbst ein Bild davon machen, wie die Hardware-Tastaturimplementierung funktioniert. Das ist nicht selbstverständlich, und jeder Wert des Arrays hat eine Bedeutung. Verzeihen Sie mir, dass ich keinen Link habe, um atm zu teilen, aber wenn Sie etwas finden, das das Web durchsucht, posten Sie bitte einen neuen Kommentar ☺
zmo

6

Ich habe ein Projekt erstellt, das den Arduino Bootloader vollständig ersetzt. Sie können Skizzen hochladen und als HID verwenden. Siehe Project HID auf Github: https://github.com/NicoHood/HID


4
Willkommen bei Arduino SE! Können Sie etwas über die Verwendung Ihrer Bibliothek hinzufügen? Vielen Dank!
Anonymous Penguin

2
Lies die Readme und probiere die Beispiele? Es ist alles da, keine Notwendigkeit, alles hier zu täuschen. Alles auf Github ist auf dem neuesten Stand :)

Sorry Alter, es sieht aus wie eine coole Bibliothek, aber deine Dokumentation ist verrückt, es fehlt. Es gibt keine wirklichen Installationsanweisungen, soweit ich das beurteilen kann, und ganze Themen in Ihrem Wiki sagen einfach "TODO" (speziell das Gamepad-Thema ist so komplett leer). : - /
BrainSlugs83

1
Tatsächlich muss hier eine grundlegende Beschreibung vorgelegt werden: Antworten müssen auch ohne den externen Link aussagekräftig sein, der sterben könnte. Und dieser ist nicht.
Chris Stratton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.