Forum: Mikrocontroller und Digitale Elektronik Serielle Daten in Tastaturanschläge verwandeln


von Melvyn S. (melvyn757)


Lesenswert?

Hallo,

Ich will mit meinem Arduino Tastaturanschläge machen
Ich habe mit meinem Arduino ein Programm geschrieben, welches "15" in 
Hex, also ein F sendet wenn man einen Knopf drückt.
Im serial monitor kommt dieses F an, nur was muss ich jetzt machen, dass 
zum Beispiel im Word dieses F geschrieben wird?
Ich habe den Arduino Mega 2560
Gibt es eine Software für den PC, das die seriellen Daten vom USB in 
Tastaturanschläge verwandelt?

von Peter P. (nuppel)


Lesenswert?

Also:
 - hex F ist nicht ASCII F.
 - und warum nicht den µController als USB HumanInterfaceDevice anbinden
   also als Keyboard und einfach los tippern lassen.

Wenn nicht noch ne anderere Anforderung kommt würde ich es so machen

von Rudolph R. (rudolph)


Lesenswert?

Peter P. schrieb:
> - und warum nicht den µController als USB HumanInterfaceDevice anbinden
>    also als Keyboard und einfach los tippern lassen.

Weil es ein Arduino ist und es daher diese Möglichkeit gar nicht gibt?

Man könnte aus zwei I/O Pins eine PS/2 Schnittstelle machen.

Aber Scancodes zu senden ist nicht wirklich lustig, die Ings bei IBM 
müssen damals ganz schlechtes Gras geraucht haben als die sich das 
ausgedacht haben.

Edit: das ist an der Frage vorbei okay, es wird eine Windows-Software 
gesucht.
Aber das hier ist das Mikrocontroller-Forum...

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Wenn ich bei Google 'serial to keyboard' eingebe, dann bekomme ich 27 
Millionen Ergebnisse.
Schon die ersten 3 sahen nach dem aus, was du möchstest.

von STK500-Besitzer (Gast)


Lesenswert?

Rudolph R. schrieb:
> Weil es ein Arduino ist und es daher diese Möglichkeit gar nicht gibt?

Falsch!

Fertiges Beispiel:
https://www.arduino.cc/en/Reference/MouseKeyboard

von Philipp K. (philipp_k59)


Lesenswert?

Die Arduino Leonardo und Micro können das von Haus aus mit dem 
Atmega32u4.

Alle anderen Arduinos müssen mit USB HID verdrahtet und programmiert 
werden.. das ist dann nicht einfach mal die IDE öffnen und Library 
wählen, die Anschlüsse benötigen auch einige Bauteile.

Stichwort VUSB Keyboard.

von Melvyn S. (melvyn757)


Lesenswert?

Das MouseKeyboard von der offiziellen Arduino Website hab ich natürlich 
schon probiert aber das funktioniert nur mit dem Arduino Leonardo, weil 
der so ne Keyboard emulation hat.
Was kann denn da so schwierig sein, ich bekomme ein "F" beim USB herein, 
das muss ja nur mit ner Software konvertiert werden...

von keyboard (Gast)


Lesenswert?

>Was kann denn da so schwierig sein, ...

Dann mach doch.

von Wolfgang (Gast)


Lesenswert?

Rudolph R. schrieb:
> Weil es ein Arduino ist und es daher diese Möglichkeit gar nicht gibt?

Wer hat dir diesen Bären aufgebunden?

In der Arduino IDE finden sich sogar lauffähige Beispiele für 
Grundfunktionen unter Menü "Datei" - "Beispiel" - "USB" - "Keyboard"

von Wolfgang (Gast)


Lesenswert?

Melvyn S. schrieb:
> Das MouseKeyboard von der offiziellen Arduino Website hab ich natürlich
> schon probiert aber das funktioniert nur mit dem Arduino Leonardo

Der Micro kann's, der Pro Micro kann's ...
Welchen Arduino hast du denn?

von Rudolph R. (rudolph)


Lesenswert?

STK500-Besitzer schrieb:
>> Weil es ein Arduino ist und es daher diese Möglichkeit gar nicht gibt?
>
> Falsch!

Meine Güte, es ist ein Arduino Mega 2560, der kann das nicht direkt.
Und ein Uno auch nicht.

Dazu müsste man schon den USB-Seriell Umsetzer vor dem Controller 
umprogrammieren - also wenn da ein Mega16U4 drauf ist.
Unmöglich ist auch das nicht.

von Klaus (Gast)


Lesenswert?

Melvyn S. schrieb:
> Das MouseKeyboard von der offiziellen Arduino Website hab ich natürlich
> schon probiert aber das funktioniert nur mit dem Arduino Leonardo, weil
> der so ne Keyboard emulation hat.
> Was kann denn da so schwierig sein, ich bekomme ein "F" beim USB herein,
> das muss ja nur mit ner Software konvertiert werden...

Nun, das schwierige ist, dass so ein PC mit einem Betriebssystem eine 
"Organisationsform" ist. D.h. in Bezug auf Dein Problem, dass es 
gewisse, fest umschriebene (d.h. definierte) Wege gibt, Daten über die 
Schnittstelle in den PC zu bringen und dort zu verarbeiten. Das Problem 
ist möglicherweise, dass Du von dieser Struktur sehr wenig weisst.

Deswegen nimmst Du, wiederum möglicherweise, an, dass es sich nur darum 
handelt ein 'F' von irgend woher nach irgend wohin zu transportieren. 
Zwar ist das physisch durchaus korrekt. Aber dennoch geht das, um im 
Gesamtsystem korrekt zu sein, d.h. die Wirkung zu haben, die Du 
wünschst, nur auf ganz bestimmte Arten und Weisen.

Du hast zunächst einmal folgenden Bedarf an Wissen:

1. Kodierung, Schreibweise bzw. verbale Beschreibung von Literalen
"Der Buchstabe 'F'" wird z.B. in C als 'F' beschrieben, wobei das in 
Hochkommata eingeschlossene ein ASCII-Zeichen ist. Der ASCII-Zeichensatz 
stellt eine Zuordnung zwischen Zahlen und Zeichen her. Insofern als 
Zahlen gemeint sind, können diese als "Dezimalzahl 70" oder als 
"Hexadezimalzahl 46" verbal beschrieben werden. In C könnte man auch 
"70" oder "0x46" schreiben.

Was Du also willst ist, vermutlich, dass ASCII-Zeichen 'F', 0x46, 70 an 
Word weitergeben.


2. USB-Gerätetypen, serielle Schnittstelle, Tastatur, Treiber
An einen PC können verschiedene Peripheriegeräte angeschlossen werden. 
Das ist Dir soweit klar. Ein Betriebssystem spezifiziert gewisse Regeln, 
auf welche Weise diese Geräte gesteuert und wie von ihnen Daten 
empfangen werden. Konkret heisst das, wie und in welcher Reihenfolge 
welche I/O-Pins gesetzt werden oder eingelesen. Ausserdem natürlich zu 
welchem Zeitpunkt im Ablauf, die von einem I/O-Port gelesenen Daten 
beispielsweise als Zeichen von einer Tastatur oder als Byte von der 
Festplatte und damit als Teil einer Datei interpretiert werden und wohin 
das weiterzuleiten ist. Diese Beschreibung nennt man "Protokoll", die 
Software dazu "Treiber"; die Verbindung zwischen "Treiber" und 
Betriebssystem ist eine "Softwareschnittstelle", auch durch eine 
"Aufrufkonvention", eine Einsprungadresse und einige weitere Details 
beschrieben.
Das gilt für Festplatten, wie für Tastaturen und auch serielle 
Schnittstellen.

Du hast hier den Spezialfall, dass ein USB-Gerät eine serielle 
Schnittstelle nachbildet, die mittels Treiber dem Betriebssystem 
gegenüber als serielle Schnittstelle dargestellt wird.

3, Benutzerinteraktion im Betriebssystem
In der Regel ist vorgesehen, dass der Benutzer mittels Maus und Tastatur 
mit dem PC interagiert. Das Betriebssystem stellt diese Daten einer 
Anwendung zur Verfügung. Dafür gibt es einen Satz von Funktionen: die 
Windows-API. Die Funktion zum Einlesen von Zeichen von der Tastatur ist 
dazu definiert, benannt und über einige Zwischenschritte wird ein 
bestimmtes Stück Software ausgeführt, dass prüft ob ein Zeichen von der 
Tastatur vorliegt, oder, im Falle von Windows, die Anwendung wird 
angestossen, falls ein Zeichen vorliegt.
Wesentlich ist, das die Anwendung definiert, auf welche Weisen, über 
welche Wege (Tastatur etc.) sie Eingaben akzeptiert.

An sich ist Word nicht darauf eingerichtet, von der seriellen 
Schnittstelle Daten zu empfangen und diese als Eingabe zu 
interpretieren, die den Text ausmacht.

Diese Wege lassen sich, mit guter Kenntnis der Zusammenhänge auch 
modifizieren oder umgehen. Dazu gibt es entweder fertige Software oder 
man muss sie selber schreiben.
Es gab z.B., für eine alte Excel-Version einen Zusatz, der Daten von der 
seriellen Schnittstelle empfängt. Das ist ein Satz von Makros, der 
Zellinhalte ändert. Ich weiss nicht mehr genau. Mag sein, es war eine 
DLL die sich als Paket zu Excel dazu installieren liess.

Ich weiss nicht ob es das auch für Word gibt, aber es ist anzunehmen. Da 
ich nicht weiss, welches Betriebssystem oder welches Word Du verwendest, 
kann weder ich noch jemand anders einen konkreten Hinweis dazu geben. 
Suche doch einfach mal im Internet.

Ein anderer Weg (ein Umweg) wäre, die Daten von der Emulation der 
seriellen Schnittstelle in eine Text-Datei zu kopieren. Das Kommando 
dazu sieht etwa so aus: "copy con Datei.txt" Dazu solltest Du aber 
nochmal genau in der Hilfe zum Copy-Kommando nachlesen.

Ein dritter Weg wäre, die schon erwähnte Möglichkeit, ein USB-HID-Device 
auf dem uC laufen zu lassen. Auch dazu gibt es fertige Software. Evtl. 
brauchst Du einen anderen uC oder musst das Arduino-Paradigma verlassen.


Was ich schrieb sollte Dir aber zumindest erst einmal Anregungen geben, 
auf welchen Gebieten Du Dir, mit welchen Stichworten, Wissen aneignen 
solltest.

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


Lesenswert?

Wie wäre es mit einem klitzekleinen Treiberlein/Dämon auf PC-Seite, 
geschrieben in ... z.B. 20 Zeilen Basic oder Delphi, um die seriellen 
Daten per DLL-Call als Tastendrücke erscheinen zu lassen?

Beispiel: 
http://www.vbaccelerator.com/home/VB/Tips/SendKeys_using_the_API/article.asp

von Philipp K. (philipp_k59)


Lesenswert?

Rudolph R. schrieb:
> Meine Güte, es ist ein Arduino Mega 2560, der kann das nicht direkt.
> Und ein Uno auch nicht.
>
> Dazu müsste man schon den USB-Seriell Umsetzer vor dem Controller
> umprogrammieren - also wenn da ein Mega16U4 drauf ist.
> Unmöglich ist auch das nicht.

Na klar können die das ohne Löten und Deinen Umbau Vorschlag.

: Bearbeitet durch User
von Rudolph R. (rudolph)


Lesenswert?

Philipp K. schrieb:
> Na klar können die das..

Der Mega328 und der Mega2560 wahrscheinlich schon - aber als Arduino?

Jemand der 0x0f für 'F' über die serielle schickt wird sicher nicht mit 
der direkten Programmierung der Controler überfordert sein.

von Philipp K. (philipp_k59)


Lesenswert?

Ein Arduino bleibt zu 100% ein AVR.

z.B.
http://blog.petrockblock.com/2012/05/19/usb-keyboard-with-arduino-and-v-usb-library-an-example/

Hier muss man dann nur noch das zeichen übergeben.

EDIT: mit viel optimierung könnte das Programm sogar noch in einen 
Tiny85 passen.

: Bearbeitet durch User
von Rudolph R. (rudolph)


Lesenswert?

Philipp K. schrieb:
> Ein Arduino bleibt zu 100% ein AVR.

Jain, die loop() und die Abstraktion fressen Performance.
Was ja auch für viele Anwendungen nicht so schlimm ist.

Na okay, offenbar hat doch jemand einen Weg gefunden.

von Philipp K. (philipp_k59)


Lesenswert?

Rudolph R. schrieb:
> Jain, die loop() und die Abstraktion fressen Performance.
> Was ja auch für viele Anwendungen nicht so schlimm ist.
>
> Na okay, offenbar hat doch jemand einen Weg gefunden.

Hält ja niemanden davon ab VUSB auch in der Arduino-IDE zu verwenden..

Merke: "Der" Arduino ist nur die Hardware, womit Du die programmierst 
ist egal.

von Rudolph R. (rudolph)


Lesenswert?

Philipp K. schrieb:
> Merke: "Der" Arduino ist nur die Hardware, womit Du die programmierst
> ist egal.

Ah, vorsichtig mit solchen Aussagen.
Das ist sicher nicht falsch aber auch nicht korrekt, da Arduino nun 
einmal Hardware und Software ist, kann die Hardware alleine gemeint 
sein, muss aber nicht.

Also pauschal zu behaupten, dass jeder das gleiche meint wenn er Arduino 
erwähnt, ist eher nicht korrekt.

Ich bin davon ausgegangen, dass der TE Hardware+Software meint.
Und aufgrund der Timing-Anforderungen von USB und dem was die Arduino 
Software so an Performance frisst bin ich davon ausgegangen, dass VUSB 
keine Option ist.

Scheint aber doch zu funktionieren, auch gut.

Ich fürchte nur, viel mehr als USB wird der Arduino dann nicht mehr 
machen.
So blockierend umgesetzte Geschichten wie serielle Ausgabe, 
AD-Wandlungen oder LCD-Ausgabe dürften das sehr leicht unbrauchbar 
machen.
Der Mega 2560 wäre dann leicht verschwendet an die Aufgabe.

von Wow (Gast)


Lesenswert?

Ein Dreizeiler in Visual Studio, der die Schnittstelle einliest und in 
den keyboardbuffer schreibt.

Dann landen die Daten im yFocus adelnder Applikation wie WinWord.

Oder fertiges Programm:

ftp://support-datalogic.de/ADC/HHS/06.Verschiedenes/Windows_COM-Port_KBD 
_Umleitung-v1.3g.pdf

von Wow (Gast)


Lesenswert?

Im Focus deiner Applikation.......doofes iPad!

von Philipp K. (philipp_k59)


Lesenswert?

Rudolph R. schrieb:
> Ah, vorsichtig mit solchen Aussagen.

Dito.. Ziemlich viel Text für wenig Aussage und keine Antwort auf die 
Frage des TE.

von Werner M. (Gast)


Lesenswert?

Philipp K. schrieb:
> Merke: "Der" Arduino ist nur die Hardware, womit Du die programmierst
> ist egal.

Was ist an der Hardware eines Arduino-Boards Arduino? Meinst du die 
Pin-Anordnung und -Nummerierung oder die LEDs?
Den Bootloader kann mal wohl kaum als Hardware bezeichnen.

von Philipp K. (philipp_k59)


Lesenswert?

Habe

Werner M. schrieb:
> Was ist an der Hardware eines Arduino-Boards Arduino? Meinst du die
> Pin-Anordnung und -Nummerierung oder die LEDs?
> Den Bootloader kann mal wohl kaum als Hardware bezeichnen.

Seit ihr heute alles Halb lesende Erbsenzähler?
Hab ich nicht geschrieben..Arduino ist eine OpenSource Marke, die 
besteht nunmal  Hauptsächlicherweise aus einer Sammlung Minimalistischer 
Developerboards mit Seriellem Bootloader die bis auf wenige Ausnahmen 
uneingeschränkte Funktion des belöteten AVRs bereitstellen. Wenn man 
noch keine Erfahrung hat kann man mit der Arduino IDE programmieren und 
die Sinngemäßen Pseudobezeichnungen beim Programmieren benutzen,auch 
jede andere Software verwenden, auch den Bootloader löschen oder sogar 
seine eigenen Projekte in die IDE einbetten.

Es ging mir nur darum das hier der Arduino ab und zu 
hauptsächlicherweise nicht als AVR dargestellt wird oder Nachteile aus 
der Luft geholt werden wie "Das Projekt geht nicht mit nem Arduino", 
wobei ein Projekt nur zu groß sein kann weil der Bootloader nen KB 
zuviel belegt.

von Jope (Gast)


Lesenswert?

>Gibt es eine Software für den PC, das die seriellen Daten vom USB in
>Tastaturanschläge verwandelt?

Eventghost: http://www.eventghost.org/

von Peter D. (peda)


Lesenswert?

Rudolph R. schrieb:
> Man könnte aus zwei I/O Pins eine PS/2 Schnittstelle machen.
>
> Aber Scancodes zu senden ist nicht wirklich lustig, die Ings bei IBM
> müssen damals ganz schlechtes Gras geraucht haben als die sich das
> ausgedacht haben.

Nö, die haben einfach vom Tastatur-MC 8051 den UART-Mode 0 genommen.

Ich sehe auch kein Problem, mit 2 IOs des AVR das PS/2 Protokoll 
nachzubilden.

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.