Forum: Mikrocontroller und Digitale Elektronik Arduino als HID-Keyboard: Rückinfo möglich?


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich möchte über ein Nextion-Touchdisplay eine minimalistische Tastatur 
simulieren. Die seriellen Signale des Displays gehen an einen Arduino 
Micro Pro, der als  HID-Keyboard an einem Raspi angeschlossen ist.

Aufgrund der übermittelten Keycodes soll per Javascript in mehreren auf 
dem Raspi angezeigten Websiten navigiert werden ... (<body onkeypress= 
...>)

Das Meiste davon funktioniert auch bereits, dennoch treibt mich eine 
Sorge um: Wie bzw. kann ich überhaupt überprüfen, ob auf dem Raspi auch 
tatsächlich die gewollte HTML-Page angezeigt wird? Meine Touch-Tastatur 
ändert nämlich das Layout, je nach den Inhalten der annavigierten Seite.

Es könnte also passieren, dass Tastatur-Layout und Webseite nicht zu 
einander passen, z.B. wenn der (lokale) Webserver mal hängt.

Langer Rede kurzer Sinn: Kann man auf eine HID-Tastatur (USB) aus dem 
Raspi heraus irgendwelche Infos zurückschreiben, um eine Art Überprüfung 
zu realisieren?

Alternativ dazu könnte ich in den (ebenfalls lokalen) Webseiten 
irgendwelche Skripte (PHP?) lostreten, die dann z.B. per RS232 auf den 
Arduino rückwirken, was aber einen erhöhten Hardware-Aufwand bedeuten 
würde. Eine reine Software-Lösung wäre nat. besser. Danke für Tips.

von Frank K. (fchk)


Lesenswert?

Frank E. schrieb:

> Langer Rede kurzer Sinn: Kann man auf eine HID-Tastatur (USB) aus dem
> Raspi heraus irgendwelche Infos zurückschreiben, um eine Art Überprüfung
> zu realisieren?

Nein. Eine HID-Tastatur kann das nicht.

Du musst ein Composite Device anlegen, das die HID-Tastatur als eine 
Komponente und ein Custom HID oder ein CDC-ACM als zweite Komponente 
enthält. Die letzte Komponente wäre dann für die Umschaltung der 
Tastaturlayouts zuständig.

fchk

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gerade heute drüber gestolpert:
https://github.com/NicoHood/HID

Das ist eine aufgebohrte HID-Bibliothek, die u.a. auch /composite 
devices/ unterstützt, also genau das hier gewünschte ...

von S. R. (svenska)


Lesenswert?

Frank E. schrieb:
> Wie bzw. kann ich überhaupt überprüfen, ob auf dem Raspi auch
> tatsächlich die gewollte HTML-Page angezeigt wird?

Du kannst die NumLock-LED blinken lassen...

Frank E. schrieb:
> Meine Touch-Tastatur
> ändert nämlich das Layout,
> je nach den Inhalten der annavigierten Seite.

Ist das eine gute Idee?
Ich würde versuchen, genau das zu vermeiden.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

S. R. schrieb:
> Frank E. schrieb:
>> Wie bzw. kann ich überhaupt überprüfen, ob auf dem Raspi auch
>> tatsächlich die gewollte HTML-Page angezeigt wird?
>
> Du kannst die NumLock-LED blinken lassen...

Welche Numlock-LED? Wo?

>
> Frank E. schrieb:
>> Meine Touch-Tastatur
>> ändert nämlich das Layout,
>> je nach den Inhalten der annavigierten Seite.
>
> Ist das eine gute Idee?
> Ich würde versuchen, genau das zu vermeiden.

Ja, muss sein, weil es sich quasi um Funktionstasten handelt und sich 
deren Sinn nur jeweils zusammen mit den entsprechenden Inhalten ergibt 
(z.B. Video auswählen, Video abspielen/anhalten/lauter/leiser). Ist auch 
eine Platzfrage

von Christian M. (Gast)


Lesenswert?

Frank E. schrieb:
> Die seriellen Signale des Displays gehen an einen Arduino Micro Pro, der
> als  HID-Keyboard an einem Raspi angeschlossen ist.

Wieso machst Du nicht alles mit dem Raspi? Der könnte das und hättest 
diese Probleme nicht!

Gruss Chregu

von Mick (Gast)


Lesenswert?

Frank E. schrieb:
> Aufgrund der übermittelten Keycodes soll per Javascript in mehreren auf
> dem Raspi angezeigten Websiten navigiert werden ... (<body onkeypress=
> ...>)

Das ist ja ein Riesengebastel. Nextion kommuniziert üblicherweise über 
die serielle Schnitstelle. Diese lässt sich direkt (evtl. Pegelwandler 
notwendig) mit dem Raspberry über die GPIOs verbinden.

Das Senden/Empfangen kann man mit diversen Programmiersprachen oder 
Tools realisieren. Da gibt es genügend Anleitungen im Internet.

von S. R. (svenska)


Lesenswert?

Frank E. schrieb:
>>> Wie bzw. kann ich überhaupt überprüfen, ob auf dem Raspi auch
>>> tatsächlich die gewollte HTML-Page angezeigt wird?
>> Du kannst die NumLock-LED blinken lassen...
> Welche Numlock-LED? Wo?

Eine normale Tastatur hat drei LEDs (NumLock, CapsLock, ScrollLock), die 
seit dem PC/AT frei angesteuert werden können. Das gilt auch für 
USB-Tastaturen, also hat HID diese Funktion ohne Klimmzüge.

Du kannst also Informationen an "die Tastatur" schicken, ohne ein 
Composite-Device zu bauen oder vom Tastatur-Standardschema abzuweichen. 
Du musst die zu übertragende Information also nur passend codieren (z.B. 
als Blinkmuster) und die Tastatur irgendwie zur Auswertung überreden 
(Report abholen und auswerten).

>> Frank E. schrieb:
> Ja, muss sein, weil es sich quasi um Funktionstasten handelt und sich
> deren Sinn nur jeweils zusammen mit den entsprechenden Inhalten ergibt
> (z.B. Video auswählen, Video abspielen/anhalten/lauter/leiser). Ist auch
> eine Platzfrage

Naja, die Tastatur kann ja auch fixe Codes senden (wie die F-Tasten 
einer normalen Tastatur auch), und es ist die Aufgabe der Webseite, die 
richtige Funktion auszuwählen. Da brauchst du nicht ständig das Layout 
ändern...

Es sei denn, du willst auch mit jeder Seite die "Beschriftung" der 
Tasten ändern, aber dann wäre es vermutlich sinnvoll, wenn die Seite 
selbst die Beschriftung wählt (und die Codes passend auswertet). Die 
Tastatur selbst braucht dann kaum Intelligenz und - wichtig - wird nie 
asynchron zur dargestellten Webseite.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Christian M. schrieb:
> Frank E. schrieb:
>> Die seriellen Signale des Displays gehen an einen Arduino Micro Pro, der
>> als  HID-Keyboard an einem Raspi angeschlossen ist.
>
> Wieso machst Du nicht alles mit dem Raspi? Der könnte das und hättest
> diese Probleme nicht!
>
> Gruss Chregu

Kennst du Code, der serielle Eingaben als "normale" Keystrokes ins 
System einspeist? Nicht nur in die Konsole, sondern z.B. auch in den 
Webbrowser? Dann versuche ich das ...

Und was heisst "Probleme nicht haben"? 'Nen Key absenden und die 
gewünschte Webseite tatsächlich auch geladen bekommen, sind auch dann 
immer noch zwei verschiedene Dinge ...

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Mick schrieb:
> Frank E. schrieb:
>> Aufgrund der übermittelten Keycodes soll per Javascript in mehreren auf
>> dem Raspi angezeigten Websiten navigiert werden ... (<body onkeypress=
>> ...>)
>
> Das ist ja ein Riesengebastel. Nextion kommuniziert üblicherweise über
> die serielle Schnitstelle. Diese lässt sich direkt (evtl. Pegelwandler
> notwendig) mit dem Raspberry über die GPIOs verbinden.
>
> Das Senden/Empfangen kann man mit diversen Programmiersprachen oder
> Tools realisieren. Da gibt es genügend Anleitungen im Internet.

Also das Auswerten von Keystrokes per Javascript ist keine "Bastelei", 
das funktioniert im Prinzip zuverlässig, habe ich bereits getestet.

Aber getreu dem Grundsatz "was schief gehen kann, geht auch schief" 
hätte ich eben gerne irgend eine Rückkopplung, ob es denn tatsächlich 
auch geklappt hat ...

: Bearbeitet durch User
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

S. R. schrieb:

>
> Naja, die Tastatur kann ja auch fixe Codes senden (wie die F-Tasten
> einer normalen Tastatur auch), und es ist die Aufgabe der Webseite, die
> richtige Funktion auszuwählen. Da brauchst du nicht ständig das Layout
> ändern...
>
> Es sei denn, du willst auch mit jeder Seite die "Beschriftung" der
> Tasten ändern, aber dann wäre es vermutlich sinnvoll, wenn die Seite
> selbst die Beschriftung wählt (und die Codes passend auswertet). Die
> Tastatur selbst braucht dann kaum Intelligenz und - wichtig - wird nie
> asynchron zur dargestellten Webseite.

Ich verstehe im Moment unseren Disput nicht - wir sind quasi einer 
Meinung. Also konkret geht es um eine Art Video-Abspiel-Station in einem 
Museum, bestehend aus einem "normalen" 24-Zoll curved Display für die 
Inhalte und daneben ein Nextion zur Bedienung. Auf dem Abspiel-Screen 
werden zunächst die Videos und eine kurze Inhaltsangabe gelistet. Man 
kann mit den Cursortasten auf dem Nextion (neben dem Abspiel-Screen*) 
hoch/runter eines auswählen und auf den Start-Button tipen. Wenn das 
Video läuft, ändert sich der Inhalt des Nextion zu Stop/Start, 
Vor/Zurück, Laut/Leise, zurück zur Übersicht ... eben mit andern Buttons 
und Icons.

*es gibt keine curved Touchscreens, und der große Abspiel-Screen soll 
nach den Wünschen der Direktion kein Touch sein, deshalb das Nextion 
daneben

von Quax (Gast)


Lesenswert?

Wir haben für eines unserer Produkte ein ähnliches Szenario. Auf die HID 
Implementierung würde ich von Anfang an verzichten.
Für deine Installation würde ich dir folgendes empfehlen.

Nextoin <-> Serial <-> Raspberry Pi <-> Node.js <-> Socket.IO <-> 
Browser

Falls du weitere Infos wünschst, helfe ich dir gerne weiter.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Quax schrieb:
> Wir haben für eines unserer Produkte ein ähnliches Szenario. Auf
> die HID
> Implementierung würde ich von Anfang an verzichten.
> Für deine Installation würde ich dir folgendes empfehlen.
>
> Nextoin <-> Serial <-> Raspberry Pi <-> Node.js <-> Socket.IO <->
> Browser
>
> Falls du weitere Infos wünschst, helfe ich dir gerne weiter.

Node.js habe ich durchaus auf dem Schirm.

M.W. wird dort z.B. ein Socket-Server aufgesetzt, den die Website dann 
aber aktiv abfragen muss ... scheint auch nicht ganz simpel. Die 
RS232-Schnittstelle ist wohl auf dem Raspi auch nicht so ganz einfach 
zuverlässig zu betreiben ...

An HID (Keyboard) fasziniert mich die (scheinbare?) Einfachheit inkl. 
Daten und Stromversorgung auf einem (USB-) Kabel. Lediglich die 
verdammte Rückkopplung/Bestätigung fehlt ... zumindest mit einfachen 
Mitteln und ohne zus. Hardware.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Warum aber muss das "Keyboard" unterschiedliche Dinge senden, je 
nachdem, was für eine "Webseite" o.ä. geladen ist?

Was ist dadurch gewonnen?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Rufus Τ. F. schrieb:
> Warum aber muss das "Keyboard" unterschiedliche Dinge senden, je
> nachdem, was für eine "Webseite" o.ä. geladen ist?
>
> Was ist dadurch gewonnen?

Es ist kein Keyboard für Leute, die täglich am Computer arbeutem sondern 
eine "dynaische Bedienoberfläche", die sich der Situation anpasst. Auf 
einer Seite zur Auswahl von Videos hat diese (virtuelle) Tastatur z.B. 
nur drei Tasten: Hoch, Runter, Auswahl.

Wenn dann ein Video läuft, ändert sich der notwendige Befehlsvorrat (und 
die dargestellten Tasten), weil z.B. Hoch/Runter keinen Sinn mehr 
ergeben. Statt dessen z.B. Laut/Leise, Stop/Start, zurück zur Übersicht 
usw.

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Frank E. schrieb:
> Ich verstehe im Moment unseren Disput nicht - wir sind quasi einer
> Meinung. Also konkret geht es [...]

Wenn man mal den Touchscreen wegignoriert, dann passt du nicht das 
Layout der Tastatur an (welche Tastaturcodes gesendet werden), sondern 
du passt den Aufdruck der Tasten und deren Anzahl an. Das ist sinnvoll. 
:-)

Frank E. schrieb:
> Die RS232-Schnittstelle ist wohl auf dem Raspi auch nicht so ganz
> einfach zuverlässig zu betreiben ...

Das würde mich aber schon wundern... wichtig ist, dass du einen 
passenden Pegelwandler drin hast, um den Pi nicht zu grillen, und dass 
du dem Kernel verbietest, seine Logdaten auf die Schnittstelle zu 
kippen.

Frank E. schrieb:
> An HID (Keyboard) fasziniert mich die (scheinbare?) Einfachheit inkl.
> Daten und Stromversorgung auf einem (USB-) Kabel. Lediglich die
> verdammte Rückkopplung/Bestätigung fehlt ...

Die wäre über die LEDs ohne Treiber machbar, ansonsten musst du in den 
sauren Apfel beißen und ein Composite-Device (oder was eigenes mit HID) 
bauen und deine Anwendung damit klarkommen lassen.

Frank E. schrieb:
> Kennst du Code, der serielle Eingaben als "normale" Keystrokes ins
> System einspeist? Nicht nur in die Konsole, sondern z.B. auch in den
> Webbrowser? Dann versuche ich das ...

Mit "xdotool" kannst du synthetische Eingaben für den X-Server erzeugen 
und deinen Browser aus einem Shellscript fernsteuern.

Ansonsten gibt es nicht-traditionelle Eingabegeräte für Leute, die 
klassische Eingabegeräte nicht bedienen können. Die sind üblicherweise 
seriell angebunden, und Microsoft hat Treiber dafür schon seit 
mindestens MS-DOS 5.0 mitgeliefert. Das Protokoll ist dokumentiert, aber 
mit solchen Geräten haben ich keine Erfahrung.

Unter Linux gibt es "inputattach", mit dem man serielle Eingabegeräte 
(Mäuse, Trackballs, aber auch Tastaturen) dem Kernel selbst 
bereitstellen kann. Damit kannst du auch den Browser fernsteuern.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank E. schrieb:
> Es ist kein Keyboard für Leute, die täglich am Computer arbeutem sondern
> eine "dynaische Bedienoberfläche", die sich der Situation anpasst.

Das mag ja sein, aber das lässt sich auch im Kontext der Webseite 
erledigen. Die Tasten senden immer den gleichen Code/das gleiche 
Zeichen, aber wie sie interpretiert werden, legt die Webseite (bzw. das 
vermutliche Javascript-Programm dazu) fest.

Taste 1 sendet "A", Taste 2 sendet "B" und Taste 3 "C".

Und "A" bedeutet auf der Auswahlseite halt "hoch", während es im Player 
"pause" bedeutet.

Dazu muss nur der die Tastendrücke auswertende Teil der Software 
angepasst werden, und der Drops ist dauerhaft final gelutscht, ohne daß 
es zu Synchronisationsproblemen zwischen Tastaturbelegung und Gerät 
kommen könnte.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Rufus Τ. F. schrieb:

> Das mag ja sein, aber das lässt sich auch im Kontext der Webseite
> erledigen. Die Tasten senden immer den gleichen Code/das gleiche
> Zeichen, aber wie sie interpretiert werden, legt die Webseite (bzw. das
> vermutliche Javascript-Programm dazu) fest.
>
> Taste 1 sendet "A", Taste 2 sendet "B" und Taste 3 "C" ...

Verstehe schon, aber die Anzahl der Tasten und deren Icons sind 
unterschiedlich, ich will keine extra Erklärung anzeigen müssen ... dann 
hätte ich ja auch (langweilige) mechanische Taster nehmen können :-)

Im Prinzip würde mir wahrscheinlich die Info zur Numlock-LED genügen, 
muss mal prüfen, ob das in der keyboard-Klasse für den Arduino irgendwie 
durchgeleitet wird.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank E. schrieb:
> Verstehe schon, aber die Anzahl der Tasten und deren Icons sind
> unterschiedlich,

So allmählich wird es klarer; Du willst also auch ein anderes Bild auf 
Deiner Tastatur darstellen, es geht also nicht zwingend um andere 
Tastencodes.

Tja, dann ... ist die Variante mit Composite-USB-Device (HID-Tastatur 
und CDC) vermutlich eine Hilfe. Die HID-Tastatur macht nichts anderes 
als eine HID-Tastatur, und alle Steuerfunktionen, die der Tastatur 
irgendwas spezielles mitteilen, gehen über den CDC-Kanal.

Weiter oben habe ich eine erweiterte Arduino-HID-Bibliothek verlinkt, 
mit der dieser Composite-Device-Betrieb möglich ist.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Rufus Τ. F. schrieb:
> Frank E. schrieb:
>> Verstehe schon, aber die Anzahl der Tasten und deren Icons sind
>> unterschiedlich,
>
> So allmählich wird es klarer; Du willst also auch ein anderes Bild auf
> Deiner Tastatur darstellen, es geht also nicht zwingend um andere
> Tastencodes.

Hast aber ganz schön lange gebraucht, steht bereits im Eingangsposting:

" ... Meine Touch-Tastatur ändert nämlich das Layout, je nach den 
Inhalten der annavigierten Seite ..."

Nun könnte man daüber streiten, was mit "Layout" gemeint ist. Ich meine 
Anzahl, Position und Beschriftung der (virtuellen) Tasten. :-)

> Tja, dann ... ist die Variante mit Composite-USB-Device (HID-Tastatur
> und CDC) vermutlich eine Hilfe. Die HID-Tastatur macht nichts anderes
> als eine HID-Tastatur, und alle Steuerfunktionen, die der Tastatur
> irgendwas spezielles mitteilen, gehen über den CDC-Kanal.
>
> Weiter oben habe ich eine erweiterte Arduino-HID-Bibliothek verlinkt,
> mit der dieser Composite-Device-Betrieb möglich ist.

Jaaaa ... da ist aber noch der Raspi, mal sehen was der dazu meint. Und 
die Hürde, per Javascript oder Node.js diese Methode auch nutzen zu 
können. Mal sehen ... Danke.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank E. schrieb:
> . da ist aber noch der Raspi, mal sehen was der dazu meint

Was soll der dazu schon groß meinen; ein CDC wird er ansteuern können.

Frank E. schrieb:
> Und die Hürde, per Javascript oder Node.js diese Methode auch nutzen zu
> können.

Serielle Schnittstelle ansteuern. Oder einem anderen Prozess mitteilen, 
daß er das machen soll.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.