ASCII Code Probleme

Hallo^^
Ich bastle an einem kleinen Macrokeyboard welches ich fürs coden einsetzen möchte. Dabei will ich beispielsweise eine Taste haben die mir folgendes printed:
if(){

}
Das hat soweit alles funktioniert nur der ASCII Code für die Klammern scheint irgendwie nicht richtig zu sein. In der ASCII Tabelle steht für ( die 40 und für ) die 41. Jetzt ist es aber so dass wenn ich 40 eingebe ) kommt und 41 ist =. Die linke Klammer konnte ich bisher nicht finden, ich dachte sie wäre die 39, aber das ist ä.
Ich nutze den keyboard.write() Befeehl um die Zeichen auszugeben. der Keyboard.print() Befehl funktioniert genauso wenig da die Keyboard Library das Deutsche Tastaturlayout bisher nicht verwendet.
Wäre cool wenn jemand dafür ne Lösung hätte^^

Es dreht sich eigentlich nicht so sehr um ASCII Tabellen, sondern eher um Tastaturen und ihre Scancodes.

Eins Schnellschuss GitHub - BesoBerlin/Arduino-German-Keyboard: Workaround to use Arduino Leonardo/Micro with german keyboard layout vielleicht ist das ja was für dich.

Hier ist noch eine library dafür

Man könnte das ganze auch rein softwaretechnisch auf dem PC mit Autohotkey lösen.
https://www.autohotkey.com/download/

Als hotstring könnte das dann so aussehen
:R:ifk::if () {r r}

Erklärung:

:R:: achtung jetzt kommt eine hotstring-defintion

"ifk" : der hotstring

if () {r r}

Die Zeichen die statt des hotstrings ausgeben werden sollen
`r bedeutet carriage return
Ergebnis

haach Mist die accents werden nicht alle dargestellt es sollte so aussehen
grafik

du schreibt ifk + Leertaste oder ifk + Entertaste und im Editor erscheint

if () {
  
}

Wenn man es statt mit hotstring mit skripting macht dann kann man sogar noch den Cursor wieder eine Zeile hochsetzen
Das Skripting geht auch per hotkey also zum Beispiel Strg-Alt-I startet das Skript

vgs

Geht das Ganze nur mit Autohotkey oder ist das auch einfach in der Arduino IDE umsetzbar?

Vermutlich kann die Arduino-IDE es nicht direkt.
Man kann andere Texteditoren anstatt Arduino-IDE verwenden.

Oder du nimmst eben doch einen USB-HID-fähigen Microcontroller der auf Tastendrücke
auf dem extra Makrokeyboard wartet und dann entsprechende Tastendrücke an den PC sendet.

vgs

Damit meinst du wahrscheinlich solche wie den Arduino Micro, den verwende ich^^

Fast, nur das funktioniert irgendwie auch nicht richtig, jetzt hab ich zwar die runden Klammern aber anstatt den geschweiften ein Ü XD Oder ich bin einfach zu doof das richtig zu benutzen

Weil das deutsche Tastaturlayou anders ist als das englische und die Befehle die man da sendet eine bestimmte Tastenposition und eben nicht ein bestimmtes ASCII-Zeichen sind
passt das dann bei den spezielleren Zeichen nicht. Deshalb musst du eine library verwenden die das richtig umsetzt.

Die Libary von John Wasser macht das. Da gibt es im Source-Code einen Unterordner

in dem dann für jedes landessprachliche Tastaturlayout eine passende header-Datei enthalten ist.

Und da musste dir dann die passende Header-Datei heraussuchen.

In der Headerdatei selbst steht in den Kommentaren auch welches Zeichen das werden soll
Aussschnitt

{0x007b, 0x24 | MOD_ALTGR},	// Left Curly Bracket
  {0x005b, 0x25 | MOD_ALTGR},	// Left Square Bracket
  {0x005d, 0x26 | MOD_ALTGR},	// Right Square Bracket
  {0x007d, 0x27 | MOD_ALTGR},	// Right Curly Bracket
  {0x005c, 0x2d | MOD_ALTGR},	// Reverse Solidus
  {0x0040, 0x14 | MOD_ALTGR},	// Commercial At
  {0x20ac, 0x08 | MOD_ALTGR},	// Euro Sign
  {0x007e, 0x30 | MOD_ALTGR},	// Tilde
  {0x007c, 0x64 | MOD_ALTGR},	// Vertical Line
  {0x00b5, 0x10 | MOD_ALTGR},	// Micro Sign
  {0x00b0, 0x35 | MOD_SHIFT},	// Degree Sign
  {0x0021, 0x1e | MOD_SHIFT},	// Exclamation Mark
  {0x0022, 0x1f | MOD_SHIFT},	// Quotation Mark
  {0x00a7, 0x20 | MOD_SHIFT},	// Section Sign
  {0x0024, 0x21 | MOD_SHIFT},	// Dollar Sign
  {0x0025, 0x22 | MOD_SHIFT},	// Percent Sign

vgs

Ich verwende Arduino Leonardo oder Micro relativ häufig um Keyboard-Eingaben am PC zu machen. Ich würde das, was ich damit mache zwar nicht unbedingt als "Macrokeyboard" bezeichnen, aber eine gewisse Ähnlichkeit ist durchaus vorhanden :slight_smile:

Generell ist das "Problem" bei der Benutzung der Keyboard-Library bei der Arduino-IDE, dass eigentlich von einem Englischen Keyboard-Layout (QWERTY) ausgegangen wird.
Zwar gibt es seit Version 1.0.3 der Keyboard-Library (Nov. 2021) die Möglichkeit verschiedene Keyboard-Layouts zu wählen (z.B. DE, ES, FR, IT), diese Library ist aber nicht automatisch in der Arduino-IDE enthalten und muss händisch eingefügt werden (siehe: https://github.com/arduino-libraries/Keyboard/tree/1.0.3 )
Damit funktionieren die meisten der Interpunktionszeichen sowie y und z mit deutschem Keyboard-Layout. Umlaute und scharfes S (ß) funktionieren allerdings nicht.
Auch gibt es Versuche von verschiedenen anderen Seiten, wie z.B. die erwähnte Lib von John Wasser. Da habe ich jedenfalls nicht mal den Beispielsketch zufriedenstellend zum Laufen gebracht (zumindest nicht unter einer aktuellen Windows- und Arduino-IDE Version).

Wenn ich "komplexe" Keyboardausgaben brauche verwende ich oft den Teensy, denn da funktionieren die verschiedenen Keyboard-Layouts ziemlich gut.

Allerdings gelingt es mir meist auch ohne spezielle Library dem Leonardo/Micro jene Tastendrücke zu entlocken, die ich brauche.
Ich habe ja schon ein wenig Erfahrung :slight_smile:

Das würde ich zum Beispiel so machen:

    Keyboard.print("if*(");
    Keyboard.press(KEY_RIGHT_ALT);    // = AltGr
    Keyboard.write('7');
    delay(20);
    Keyboard.releaseAll();
    Keyboard.write(KEY_RETURN);
    Keyboard.write(KEY_RETURN);
    Keyboard.press(KEY_RIGHT_ALT);
    Keyboard.write('0');
    delay(20);
    Keyboard.releaseAll();

Auf meinem Windows-PC gibt mir der Micro (bzw. Leonardo) die gewünschten Zeichen aus.

Und hier noch ein kompletter Mini-Sketch (ein Taster hängt an Pin 8 und GND):

// Keyboard-Output:
//   if(){
//
//   }

#include "Keyboard.h"

const byte tasterPin = 8;
bool tasterStatus;
bool lastTasterStatus;

void setup() {
  Keyboard.begin();
  pinMode(tasterPin, INPUT_PULLUP);
}

void loop() {
  tasterStatus = digitalRead(tasterPin);
  if (lastTasterStatus != tasterStatus) {
    if (!tasterStatus) {        // Button was pressed
      Keyboard.print("if*(");
      Keyboard.press(KEY_RIGHT_ALT);    // = AltGr
      Keyboard.write('7');
      delay(20);
      Keyboard.releaseAll();
      Keyboard.write(KEY_RETURN);
      Keyboard.write(KEY_RETURN);
      Keyboard.press(KEY_RIGHT_ALT);
      Keyboard.write('0');
      delay(20);
      Keyboard.releaseAll();
    }
    lastTasterStatus = tasterStatus;
  }
}
1 Like

So. Ich hatte vor längerer Zeit schon einmal eine Modifikation der keyboard.h geschrieben.
Dazu habe ich jetzt einen Democode geschrieben und getestet.

Und an dieser Stelle will ich mal über die weitverbreitete Faulheit vieler library-Schreiber schimpfen:

Da wird in den Democodes wenig bis nichts kommentiert, die Instanzennamen sind nur ansatzweise selbsterklärend und auf irgendwelche Schwierigkeiten und Fallen wird erst recht nicht hingewiesen.

Ich habe die library und den Democode jetzt mit einem Seeeduino XIAO und einem Arduino micro (= Arduino Leonardo) getestet und es funktioniert. Der Democode selber will es besser machen als die Schimpfe oben. Für so eine Doku gilt natürlich das gleiche wie für code selbst:

Code Ist niemals fertig. Höchstens bug-arm lauffähig. Man kann auch die Doku immer weiter ausbauen. Wenn jemand Ideen dazu hat immer her damit.

Die zipdatei entpackt man unter
/...arduino-installation/libraries/
Es gibt einen Unterordner examples
Darin ist dann der Democode

Diese Modifikation mag nicht die kompakteste Codeversion sein aber sie funktioniert.
Und schreibt wirklich ALLE Zeichen die man auf einer deutschen Tastatur hat.
Wenn man noch weitere Tasten hinzufügen will kann man über die neue function

SendScanCode(ScanCode)

herausfinden welcher Scancode was macht.

vgs
KeyboardGER2.zip (6.7 KB)

1 Like

Super gemacht!!

Eine kleine Kleinigkeit, die zumindest bei mir noch nicht ganz funktioniert:
Diese Zeile des Demo-Codes:

myKeyBoard.typeText("²³{[]}\',;.:-_<|>");

führt zu folgender Keyboard-Ausgabe:

²³[]',;.:-_<|>

Also die geschweiften Klammern und der Backslash werden nicht ausgegeben.

[System: Windows 10, Arduino-IDE: 1.8.19 portable, Controller: Leonardo]

Bin zurzeit noch unterwegs und habe deshalb weder anderen Computer noch anderes Board zur Verfügung. Sobald ich zuhause bin, werde ich noch auf anderen Systemen testen.

Bei den geschweiften Klammern gibts wohl ein Problem, aber ein Text mit Backslash wird z.B. so geschrieben
"x\\y" (3 Zeichen: x, Backslash, y)

1 Like

geschweifte Klammern habe ich jetzt herausgefunden

const KEY_MOD_VALUE key_mod_values[KEY_MOD_TABLE_SIZE] = {
               // the numbers below in the short block-comment /* NNN */ 
               // are the ASCII-Codes of each character 
   {0x00, 0 }, /* 0  */
...
   {0x2C, 0 }, /* 32  */  
   {0x1E, KEY_SHIFT }, /* 33   !  */
   {0x1F, KEY_SHIFT }, /* 34   "  */
   {0x31, 0 }, /* 35   #  */
   {0x21, KEY_SHIFT }, /* 36   $  */
   {0x22, KEY_SHIFT }, /* 37   %  */
...
   {0x24, KEY_CTRL_ALT }, /* 123   { */
   {0x64, KEY_CTRL_ALT }, /* 124   | */
   {0x27, KEY_CTRL_ALT }, /* 125   } */
   {0x30, KEY_CTRL_ALT }, /* 126   ~ */

Das mit dem backslash verstehe ich noch nicht
vgs

1 Like

[OT]
Der Backslash ist glaube ich das Einziige, was ich als Sonderzeichen mit anderer Kombination von Windows übrig behalten habe :slight_smile:
Wenn Du ALT(links) und auf dem aktivierten Numerik-Block 92 drückst und dann ALT(links) loslässt...

@michael_x
Ja, du hast natürlich vollkommen recht: Der Backslash muss "verdoppelt" werden, damit er ausgegeben wird. Das ist ja wohl C++ geschuldet :slight_smile:
Also die Zeile im Beispiel-Sketch:

myKeyBoard.typeText("²³{[]}\\',;.:-_<|>");        // Backslash doppelt!

@StefanL38
Nach dem Update in key_mod_values funktionieren jetzt auch die geschweiften Klammern.
Super Arbeit!!
Ich glaube, das ist die erste Library zum Thema "Deutsches Keyboard Layout und Arduino Leonardo (etc)" die wirklich gut funktioniert! Und ich hab schon einige ausprobiert!
Vielen Dank!

freut mich wenn es euch gefällt.

Das mit doppelt-backslash habe ich getestet. Das klappt noch nicht.
Der ASCII-Code muss ja in einen Scancode übersetzt werden

Das backslash-Problem habe ich jetz soweit eingegrenzt
backslash hat den ASCII-Code dezimal 92 (hex 0x5C)

for what reason ever jetzt geht es doch !

Das ist also der 93te Eintrag im constanten-Array

const KEY_MOD_VALUE key_mod_values[KEY_MOD_TABLE_SIZE] = {
               // the numbers below in the short block-comment /* NNN */ 
               // are the ASCII-Codes of each character 

Dieser Array macht die Übersetzung von ASCII-Code nach Tastatur-Scancode.
Der Tastaturcode besteht wiederum aus key und modifier
modifier meint Shift-Taste, Strg-Taste, Alt-Taste und Kombinationen davon

Bei den meisten AltGR-Tasten nimmt man den Scancode der Taste ohne AltGr und nimmt als modifier AltGr hinzu
Zum Beispiel die Taste "2" die hat als Scancode 31
wenn man das kleine "hoch zwei" ² erzeugen möchte dann ist das
key = 31 und Ctrl-Alt

          if (SecondByte == mue2_2ndByte) { // if it's an ²
            key = 31; 
            modifiers   = CtrlAlt;
            break;
          }

Das "²" wird als Zweibyte-Wert in einem string repräsentiert

Das erste byte vom "²"-Zeichen ist dezimal

const byte mue23_1stByte = 194;

und das zweite ist

const byte mue2_2ndByte  = 178;

vgs

Generalisieren und über anderer Arbeit schimpfen finde ich unhöflich.
Das würde ich mich nicht mal trauen, wenn ich davon überzeugt wäre, dass mein Code und meine Dokumentation perfekt sei. Daher habe ich mir mal dein Beispiel und deinen Code angesehen - vieleicht kann ich was dazu lernen. Nun ja.

"Kommentare" ersetzen keine Dokumentation.
Und es kann ja jeder halten wie er will, aber ohne properties, keywords und einer Beschreibung im docs Verzeichnis ist das keine "Arduino Library" - maximal ein Beispiel-Code.

Bezüglich bugarm ist mir dann noch etwas aufgefallen.
Das ist zwar auskommentiert, aber wenn ein Anfänger das probiert wird er da drüber fallen:

if (digitalRead(myButtonPin == low)

Du könntest da noch etwas Zeit in deine Arbeit investieren. Zum Thema "Library" und Beispiele schreiben verweise ich gern auf

https://www.sparkfun.com/news/3245

Hi,
danke für die Antwort, ich kam leider jetzt erst dazu deinen Vorschlag auszuprobieren (Unistress und so) Er hat funktioniert, vielen Dank^^
Mein Fehler war die Klammern in den String mit reinzusetzen, was dann halt aufgrund der deutschen Tastatur die ich verwende für den Arduino nicht gepasst hat^^
Grüße,
T0rion

Super, dass es funktioniert und danke für die Rückmeldung.

Meine Variante läuft ja sozusagen mit "Boardmitteln" und da kann die geschweifte Klammer eben nur in Verbindung mit "AltGr" generiert werden.
Aber mit der Library von StefanL38 aus Beitrag #12 können (fast*) alle Zeichen "direkt" als Zeichenkette verwendet werden.
(* Ausnahmen sind Backslash und Anführungszeich, da braucht es davor einen Backslash).

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