micro ATmega 32U4 / Sonderzeichen Ø, ø und † / keyboard.h und keyboardDE.h

Hallo,

Ich habe mir einen kleinen pro micro Arduino-Clone gekauft. Ich hatte das Zeil ein paar Sonderzeichen die ich häufig nutze per Taster eingeben zu können. Leider habe ich mich, vor dem Kauf, nicht ausrelachend belesen und verzweifelt gerade an der Aufgabe.
Mit den im Titel angegebenen Bibliotheken komme ich zumindest nicht weiter. Meine sonstige Recherche war leider auch nicht erfolgreich. Es wird zwar viel vorgestellt ich habe auch versucht einiges nachzubauen. Leider bin ich nicht erfolgreich. Es gibt einfach zu viele ALT, ASCII, UTF-8 oder Unicode Möglichkeiten.
Gibt es jemanden der eben diese Sonderzeichen, sozusagen als USB-Tastatur, an einen Computer senden kann und der bereit ist sein Wissen mit mir zu teilen?

Gruß Thilo

Hallo,

du möchtest das der Arduino Sonderzeichen an einen PC sendet?
Dann lasse erstmal den gesamten "ASCII" Code übertragen und schaue welcher Code welchem Sonderzeichen entspricht.
Stichwort Serial.write, nicht Serial.print.
Würde ich jetzt erstmal machen.

Zu einem Keyboard gehören immer zwei Programme, eines das Daten sendet und eines das die Daten am PC interpretiert (Keyboard Treiber). Zu meiner Zeit [tm] hat ein Keyboard nur Scancodes gesendet, und die Zuordnung von Zeichen hat der Treiber übernommen. Es wäre also erst einmal zu prüfen, auf was für ein Verfahren sich PC und Arduino geeinigt haben.

Sonderzeichen müssen dann eigentlich im Keyboard Treiber am PC eingebaut werden, wäre also ein PC Problem. Es gibt aber noch die Eingabe mit ALT und Numpad, die IMO jeder Keyboard Treiber beherrscht. Dann müßte der Arduino der Reihe nach die Scancodes dieser Tasten übertragen.

Doc_Arduino:
Hallo,

du möchtest das der Arduino Sonderzeichen an einen PC sendet?
Dann lasse erstmal den gesamten "ASCII" Code übertragen und schaue welcher Code welchem Sonderzeichen entspricht.
Stichwort Serial.write, nicht Serial.print.
Würde ich jetzt erstmal machen.

Nein, die Tastatur versendet kein Ascii.
Auch kein Serial sonder Keyboard.
Grüße Uwe

Leider schreibst du nicht

  • mit welchem Betriebssystem du arbeitest
  • bei welchen Anwendungen du diese Sonderzeichen einsetzen willst
  • wie du bisher diese Sonderzeichen generiert hast
    Je nach Betriebssystem gibt es unterschiedliche Methoden um Sonderzeichen zu generieren.
    Unter Windows können etliche Sonderzeichen jedenfalls durch Drücken und Halten der Alt-Taste und Eintippen einer 4stelligen Zahl am Numpad generiert werden. Bei diesen 3 Sonderzeichen ist das der Fall.
    (Damit die Zeichen auch dargestellt werden können müssen sie natürlich in der Schriftart, die gerade in der Anwendung verwendet wird vorhanden sein.)

Folgender Beispiel-Sketch funktioniert bei mir unter Windows und generiert diese 3 Sonderzeichen. Es wird dabei die oben beschriebene Methode verwendet. Gedacht ist der Sketch für Arduino Leonardo / Micro / Pro Micro (alle: ATmega 32U4) und 3 Taster an 8/9/10:

//  Sonderzeichen Ø, ø und † mit Arduino Leonardo/Micro für Windows (allgemein)

#include "Keyboard.h"

const byte tasterOgrossPin = 8;    // Taster an Pin 8 gegen GND: Ø
const byte tasterOkleinPin = 9;    // Taster an Pin 9 gegen GND: ø
const byte tasterKreuzPin = 10;    // Taster an Pin 10 gegen GND: †
bool tasterOgrossStatus;
bool tasterOkleinStatus;
bool tasterKreuzStatus;
bool tasterOgrossLetzterStatus;
bool tasterOkleinLetzterStatus;
bool tasterKreuzLetzterStatus;

void setup() {
  Keyboard.begin();
  pinMode(tasterOgrossPin, INPUT_PULLUP);
  pinMode(tasterOkleinPin, INPUT_PULLUP);
  pinMode(tasterKreuzPin, INPUT_PULLUP);
}

void loop() {
  tasterOgrossStatus = digitalRead(tasterOgrossPin);
  tasterOkleinStatus = digitalRead(tasterOkleinPin);
  tasterKreuzStatus = digitalRead(tasterKreuzPin);

  // Ø  Großer lateinischer Buchstabe O mit Querstrich: Alt+0216  (Unicode: U+00D8)
  if (tasterOgrossStatus != tasterOgrossLetzterStatus) {
    delay(30);
    if (!tasterOgrossStatus) {
      Keyboard.press(KEY_LEFT_ALT);   // Alt-Taste drücken
      delay(20);
      Keyboard.write(234);     // Numpad 0
      Keyboard.write(226);     // Numpad 2
      Keyboard.write(225);     // Numpad 1
      Keyboard.write(230);     // Numpad 6
      delay(20);
      Keyboard.releaseAll();   // Alt-Taste loslassen
    }
  }

  // ø  Kleiner lateinischer Buchstabe o mit Querstrich:  Alt+0248 (Unicode: U+00F8)
  if (tasterOkleinStatus != tasterOkleinLetzterStatus) {
    delay(30);
    if (!tasterOkleinStatus) {
      Keyboard.press(KEY_LEFT_ALT);   // Alt-Taste drücken
      delay(20);
      Keyboard.write(234);     // Numpad 0
      Keyboard.write(226);     // Numpad 2
      Keyboard.write(228);     // Numpad 4
      Keyboard.write(232);     // Numpad 8
      delay(20);
      Keyboard.releaseAll();   // Alt-Taste loslassen
    }
  }

  // †  Kreuz/Dagger: Alt+0134  (Unicode: U+2020)
  if (tasterKreuzStatus != tasterKreuzLetzterStatus) {
    delay(30);
    if (!tasterKreuzStatus) {
      Keyboard.press(KEY_LEFT_ALT);   // Alt-Taste drücken
      delay(20);
      Keyboard.write(234);     // Numpad 0
      Keyboard.write(225);     // Numpad 1
      Keyboard.write(227);     // Numpad 3
      Keyboard.write(228);     // Numpad 4
      delay(20);
      Keyboard.releaseAll();   // Alt-Taste loslassen
    }
  }

  tasterOgrossLetzterStatus = tasterOgrossStatus;
  tasterOkleinLetzterStatus = tasterOkleinStatus;
  tasterKreuzLetzterStatus = tasterKreuzStatus;
}

Hallo und vielen Dank für die Antworten.

@Doc_Arduino - Der gesammte Code kann nicht einfach so übertragen werden die Bibliothek Keyboard.h unterstützt nur 128 Zeichen. Meine Sonderzeichen sind da nicht dabei.

@DrDiettrich - ich suche natürlich nach einer Lösung ohne an PC-Treibern rumzubauen.

@uxomm - Wow, vielen Dank funktioniert bei mir völlig problemlos. :slight_smile:

Eine fertige Lösung hatte nicht nicht erwartet.
Mein Ansatz war:

Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('0');
Keyboard.release('0');
Keyboard.press('2');
Keyboard.release('2');
Keyboard.press('1');
Keyboard.release('1');
Keyboard.press('6');
Keyboard.release('6');
Keyboard.release(KEY_LEFT_ALT);
Keyboard.releaseAll();

Damit hatte ich keinen Erfolg.

Dankeschön
Thilo

Gut, dass es bei dir nun auch funktioniert.

Bei deinem Ansatz stimmte die Richtung, aber ein Detail hat noch nicht gepasst. :slight_smile:
Denn es funktioniert nur mit den Zifferntasten des Numpads (siehe auch: Keyboard.Write with Number Pad Keys from Leonardo - Programming Questions - Arduino Forum)