Arduino Leonardo als Tastaturersatz - Fehlersuche

Da immer mehr Zusi User von einem 1:1 Führerstand mit träumen, soll es zumindest an Datenaustausch nicht hapern.
Nachricht
Autor
Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Arduino Leonardo als Tastaturersatz - Fehlersuche

#1 Beitrag von Kevin1897 »

Hallo Liebes Forum,

nach langem hin und her habe Ich mich an den Leonardo herangetraut, und nach etwas Einlesen ein kleines Programm geschrieben welches die Wichtigsten Funktionen mal als Taste versendet. Genommen dafür habe ich die ASCII Codes. Was mir Auffällt, sind zum einen wenn ich die Originalen PZB Tasten/Schalter Anschließe, dann besteht das Problem, dass entweder der Falsche oder eine ganz andere Taste betätigt wird.
Habe dann in ZUSI Selbst die Tasten, die der Arduino verschickt, angepasst in Form einer eigenen Tastatur.

Ich habe eher das Gefühl, dass mir Entweder im Programm selbst ein Fehler Unterlaufen ist mit den Zeiten, als aber auch ich beim Anschluss der PZB Tasten einen Fehler gemacht habe, hier in form des "Entprellens". Habe hier einen 10k Widerstand genommen...

Vielleicht habe Ich auch nur Irgendwo einen Denk-/Anschlussfehler. Kann da jemand vielleicht Helfen. Und mir netterweise nochmal den Richtigen Anschluss der Tasten Aufzeigen. Vielleicht habe Ich da etwas Missverstanden.
Anbei der Code:

Code: Alles auswählen

#include <Keyboard.h>

//Zugbeeinflussung PZB90
int buttonStateFrei = 0;
int buttonStateWach = 0;
int buttonStateBef = 0;
//Federspeicherbremse
int buttonStateFBA = 0;
int buttonStateFBL = 0;
//Mg-Bremse
int buttonStateMg = 0;
//Fahrtrichtung
int buttonStateFV = 0;
int buttonStateFR = 0;
//Füherraum
int buttonStateFRI = 0;
int buttonStateFRO = 0;
//Hauptschalter ET
int buttonStateHSE = 0;
int buttonStateHSA = 0;
//Stromabnehmer ET
int buttonStateSTH = 0;
int buttonStateSTS = 0;
//Sand
int buttonStateSand = 0;
//SIFA
int buttonStateSifa = 0;

void setup() {
  pinMode(1, INPUT);   //PZB90 Frei
  pinMode(2, INPUT);   //PZB90 Wachsam
  pinMode(3, INPUT);   //PZB90 Befehl 40
  pinMode(4, INPUT);   //Federspeicherbremse Anlegen
  pinMode(5, INPUT);   //Federspeicherbremse Lösen
  pinMode(6, INPUT);   //Mg-Bremse
  pinMode(7, INPUT);   //Fahrtrichtung Vorwärts
  pinMode(8, INPUT);   //Fahrtrichtung Rückwärts
  pinMode(9, INPUT);   //Führerpult Aktivieren
  pinMode(10, INPUT);  //Füherpult Deaktivieren
  pinMode(11, INPUT);  //Hauptschalter Einlegen
  pinMode(12, INPUT);  //Hauptschalter Auslegen
  pinMode(13, INPUT);  //Stromabnehmer Heben
  pinMode(14, INPUT);  //Stromabnehmer Senken
  pinMode(15, INPUT);  //Sanden
  pinMode(16, INPUT);  //SIFA
  Keyboard.begin();
}

void loop() {
  buttonStateFrei = digitalRead(1);
  if (buttonStateFrei == HIGH) {
    Keyboard.press(46);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateWach = digitalRead(2);
  if (buttonStateWach == HIGH) {
    Keyboard.press(45);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateBef = digitalRead(3);
  if (buttonStateBef == HIGH) {
    Keyboard.press(44);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBA = digitalRead(4);
  if (buttonStateFBA == HIGH) {
    Keyboard.press(228);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBL = digitalRead(5);
  if (buttonStateFBL == HIGH) {
    Keyboard.press(252);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMg = digitalRead(6);
  if (buttonStateMg == HIGH) {
    Keyboard.press(109);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFV = digitalRead(7);
  if (buttonStateFV == HIGH) {
    Keyboard.press(118);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFR = digitalRead(8);
  if (buttonStateFR == HIGH) {
    Keyboard.press(114);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRI = digitalRead(9);
  if (buttonStateFRI == HIGH) {
    Keyboard.press(105);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRO = digitalRead(10);
  if (buttonStateFRO == HIGH) {
    Keyboard.press(111);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSE = digitalRead(11);
  if (buttonStateHSE == HIGH) {
    Keyboard.press(104);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSA = digitalRead(12);
  if (buttonStateHSA == HIGH) {
    Keyboard.press(110);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTH = digitalRead(13);
  if (buttonStateSTH == HIGH) {
    Keyboard.press(101);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTS = digitalRead(14);
  if (buttonStateSTS == HIGH) {
    Keyboard.press(99);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSand = digitalRead(15);
  if (buttonStateSand == HIGH) {
    Keyboard.press(115);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSifa = digitalRead(16);
  if (buttonStateSifa == HIGH) {
    Keyboard.press(32);
    delay(100);
    Keyboard.releaseAll();
  }
}
Beste Grüße und Vielen Dank
Kevin
BR620/622/642 BR8442 ;-)

Benutzeravatar
F. Schn.
Beiträge: 6698
Registriert: 24.10.2011 18:58:26

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#2 Beitrag von F. Schn. »

Der Arduino denkt hier zu viel mit. Die Tastatur unterscheidet die 0 auf der Haupttastatur und die 0 vom Numblock. (Und analog , und Enter.) Die Keyboard.press()-Methode wirft das aber dann wieder dumm zusammen. Soweit ich sehen kann, wäre der korrekte Code 0x62 (0), 0x63 (,) und 0x58, aber das wird nicht funktionieren, weil der Aduino das dann wild als Großbuchstaben und Kleinbuchstaben gem. Ascii-Code uminterpretieren wird.

Nach kurzem Quellcode anschauen wird es vermutlich gehen, indem du deine eigene Keymap definierst:

Code: Alles auswählen

  buttonStateBef = digitalRead(3);
  if (buttonStateBef == HIGH) {
    uint8_t keymap = 0x62;
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_en_US);
    delay(100);
    Keyboard.releaseAll();
  }
(Code ist jetzt nicht getestet, nur geschätzt, dass es so gehen könnte.)

Für alle Tasten der Haupttastatur müsste dein Code aber funktionieren.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#3 Beitrag von Kevin1897 »

DerArduino denkt zuviel? Dafür Programmiere ich doch das Ding damit ich das nicht tun muss :D

Nur damit ich das Richtig verstehe, sollte Ich dann den Block "PZB" mit der Keymap umschreiben, und den Rest kann Ich dann so belassen?

Das das Tastaturlayout auf US Steht kann ich aber auf DE ändern oder?

Wie löse Ich das mit dem Anschluss der Tasten?

Hier der Korrigierte Code noch auf US

Code: Alles auswählen

#include <Keyboard.h>

//Zugbeeinflussung PZB90
int buttonStateFrei = 0;
int buttonStateWach = 0;
int buttonStateBef = 0;
//Federspeicherbremse
int buttonStateFBA = 0;
int buttonStateFBL = 0;
//Mg-Bremse
int buttonStateMg = 0;
//Fahrtrichtung
int buttonStateFV = 0;
int buttonStateFR = 0;
//Führeraum besetzt
int buttonStateFRI = 0;
int buttonStateFRO = 0;
//Hauptschalter ET
int buttonStateHSE = 0;
int buttonStateHSA = 0;
//Stromabnehmer ET
int buttonStateSTH = 0;
int buttonStateSTS = 0;
//Sand
int buttonStateSand = 0;
//SIFA
int buttonStateSifa = 0;

void setup() {
  pinMode(1, INPUT);   //PZB90 Frei
  pinMode(2, INPUT);   //PZB90 Wachsam
  pinMode(3, INPUT);   //PZB90 Befehl 40
  pinMode(4, INPUT);   //Federspeicherbremse Anlegen
  pinMode(5, INPUT);   //Federspeicherbremse Lösen
  pinMode(6, INPUT);   //Mg-Bremse
  pinMode(7, INPUT);   //Fahrtrichtung Vorwärts
  pinMode(8, INPUT);   //Fahrtrichtung Rückwärts
  pinMode(9, INPUT);   //Führerpult Aktivieren
  pinMode(10, INPUT);  //Führerpult Deaktivieren
  pinMode(11, INPUT);  //Hauptschalter Einlegen
  pinMode(12, INPUT);  //Hauptschalter Auslegen
  pinMode(13, INPUT);  //Stromabnehmer Heben
  pinMode(14, INPUT);  //Stromabnehmer Senken
  pinMode(15, INPUT);  //Sanden
  pinMode(16, INPUT);  //SIFA
  Keyboard.begin();
}

void loop() {
   buttonStateFrei = digitalRead(1);
  if (buttonStateFrei == HIGH) {
    uint8_t keymap = 0x63;
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_en_US);
    delay(100);
    Keyboard.releaseAll();
  }


  buttonWach = digitalRead(2);
  if (buttonStateWach == HIGH) {
    uint8_t keymap = 0x58;
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_en_US);
    delay(100);
    Keyboard.releaseAll();
  }


   buttonStateBef = digitalRead(3);
  if (buttonStateBef == HIGH) {
    uint8_t keymap = 0x62;
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_en_US);
    delay(100);
    Keyboard.releaseAll();
  }


  buttonStateFBA = digitalRead(4);
  if (buttonStateFBA == HIGH) {
    Keyboard.press(228);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBL = digitalRead(5);
  if (buttonStateFBL == HIGH) {
    Keyboard.press(252);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMg = digitalRead(6);
  if (buttonStateMg == HIGH) {
    Keyboard.press(109);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFV = digitalRead(7);
  if (buttonStateFV == HIGH) {
    Keyboard.press(118);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFR = digitalRead(8);
  if (buttonStateFR == HIGH) {
    Keyboard.press(114);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRI = digitalRead(9);
  if (buttonStateFRI == HIGH) {
    Keyboard.press(105);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRO = digitalRead(10);
  if (buttonStateFRO == HIGH) {
    Keyboard.press(111);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSE = digitalRead(11);
  if (buttonStateHSE == HIGH) {
    Keyboard.press(104);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSA = digitalRead(12);
  if (buttonStateHSA == HIGH) {
    Keyboard.press(110);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTH = digitalRead(13);
  if (buttonStateSTH == HIGH) {
    Keyboard.press(101);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTS = digitalRead(14);
  if (buttonStateSTS == HIGH) {
    Keyboard.press(99);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSand = digitalRead(15);
  if (buttonStateSand == HIGH) {
    Keyboard.press(115);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSifa = digitalRead(16);
  if (buttonStateSifa == HIGH) {
    Keyboard.press(32);
    delay(100);
    Keyboard.releaseAll();
  }
}
BR620/622/642 BR8442 ;-)

Benutzeravatar
F. Schn.
Beiträge: 6698
Registriert: 24.10.2011 18:58:26

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#4 Beitrag von F. Schn. »

Genau.
Ja, geht.
Was meinst du damit? Widerstände sind keine Entprell-Elemente. Zum Entrprellen nimmt man entweder sehr kleine Kondensatoren oder Software. Dazu müsste aber jemand erfahreneres was sagen.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#5 Beitrag von Kevin1897 »

Super Kompilieren hat mal funktioniert.

Naja ich scheine wohl beim Anschluss der PZB Tasten einen Fehler gemacht zu haben, denn in Vielen Tutorials setzten diejenigen Widerstände vor die Tasten.

Habe ja die Originalen PZB Tasten Frei/Wachsam und den Schalter Befehl 40.

Wie schließe ich die nun an, denn ich vermute mal dass er das nicht direkt mit 5V was anfangen kann auf dem Eingang.
BR620/622/642 BR8442 ;-)

Benutzeravatar
F. Schn.
Beiträge: 6698
Registriert: 24.10.2011 18:58:26

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#6 Beitrag von F. Schn. »

Die Reihenfolge von zweipoligen, hintereinander geschalteten elektronischen Bauelementen ist im Prinzip immer egal.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#7 Beitrag von Kevin1897 »

oki super. dh. so wäre meine Interpretation, kein widerstand nix.
Einer an 5V, der Andere an den Ausgang, sobald der dann "High" ist, wird der Anschlag versendet. Sehe ich das Richtig?
BR620/622/642 BR8442 ;-)

Benutzeravatar
F. Schn.
Beiträge: 6698
Registriert: 24.10.2011 18:58:26

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#8 Beitrag von F. Schn. »

Ne, der Widerstand kann trotzdem Sinn machen, z.B. als Board-Schutz. Da müsste jemand anderes was dazu sagen.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Benutzeravatar
KlausMueller
Beiträge: 721
Registriert: 08.12.2001 08:16:10
Aktuelle Projekte: Elektrifizierung von Dänemark, Neubaustrecke Ägypten, Straßenbahn Kopenhagen usw. - im Original
Wohnort: Münchberg (an der KBS 850), jetzt Erlangen
Kontaktdaten:

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#9 Beitrag von KlausMueller »

F. Schn. hat geschrieben: 20.08.2023 13:27:57 Die Reihenfolge von zweipoligen, hintereinander geschalteten elektronischen Bauelementen ist im Prinzip immer egal.
Das ist im Prinzip etwas zu allgemeingültig formuliert, auch wenn es hier wohl zutrifft. In dem Teil der Elektrotechnik, in dem man die Energie hört, sieht und riecht, kann es eine geeignete Maßnahme für den Nachweis sein, dass Elektronik mit Schall und Rauch funktioniert — kaum sind sie entwichen, geht die Elektronik nicht mehr.

Benutzeravatar
Thomas U.
Beiträge: 3291
Registriert: 15.03.2004 16:39:15
Wohnort: Gelsenkirchen

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#10 Beitrag von Thomas U. »

Kevin1897 hat geschrieben: 20.08.2023 13:25:37denn in Vielen Tutorials setzten diejenigen Widerstände vor die Tasten
"Vor die Taste", also Reihe zum Taster, wäre mir jetzt neu.

Meinst du evtl. einen Pullup/-down-Widerstand, der den Pin mit V+/GND verbindet, während am Taster das jeweils andere anliegt? Der ist bei der Verwendung des Pinmode "Input" notwendig, weil der Pin in unbetätigtem Zustand ansonsten irgendwas liefert, da er kein festgelegtes Potential hat.

Praktischer ist es, den Pinmode "INPUT_PULLUP" zu verwenden. Dann wird der Pin intern an V+ gelegt, ist also dauerhaft "1". Die Taster werden an GND angeschlossen und ziehen den Pin bei Betätigung runter (in der Abfrage also auf "LOW" prüfen).

Als Entprellung reicht bei diesem Projekt die Version über ein kurzes Delay. Während man einen Taster drückt, gibt es ja nichts anderes, was der Microcontroller tun müsste, daher ist diese einfache Variante schon in Ordnung.

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#11 Beitrag von Kevin1897 »

Müsste dann nicht dann eigentlich in meinem Projekt dann der Befehl INPUT_PULLDOWN zum Einsatz kommen?
Es soll ja standartmäßig LOW sein und High wird ausgewertet.
BR620/622/642 BR8442 ;-)

Benutzeravatar
Thomas U.
Beiträge: 3291
Registriert: 15.03.2004 16:39:15
Wohnort: Gelsenkirchen

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#12 Beitrag von Thomas U. »

Kevin1897 hat geschrieben: 20.08.2023 16:53:22Müsste dann nicht dann eigentlich in meinem Projekt dann der Befehl INPUT_PULLDOWN zum Einsatz kommen?
Theoretisch ja. Praktisch spricht dagegen, dass Arduinos keine internen Pulldown-Widerstände besitzen (außer, ich habe was verpasst). Andere µC-Plattformen bieten das teilweise. Historisch gewachsen ist allerdings die Low-active-Variante bei Tastereingängen eher verbreitet.

Wenn du am Gedrückt=High festhalten willst, bleibt also nur das Hinzufügen eines externen Pulldown-Widerstands zwischen Pin und GND. Irgendwas um 10kOhm tut's dafür. Einfacher ist die Pullup-Variante, auch wenn Gedrückt=Low erstmal komisch erscheint, aber man gewöhnt sich mit der Zeit dran.

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#13 Beitrag von Kevin1897 »

Gut, dann wäre das ja klar. Habe nämlich den Pulldown Befehl probiert, und der Code lässt sich nicht mehr kompillieren.

Ich versuche es mal mit dem Befehl INPUT_PULLUP und setzte HIGH auf LOW.

@Tante EDIT: Hat Funktioniert mit dem PULLUP und das setzten auf LOW.

Kann mir jemand noch was zum Anschluss verraten, habe da wohl was missverstanden...
BR620/622/642 BR8442 ;-)

Benutzeravatar
Thomas B
Beiträge: 411
Registriert: 28.03.2007 16:41:08
Wohnort: Bergisch Gladbach
Kontaktdaten:

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#14 Beitrag von Thomas B »

Hier ist die Geschichte mit Pull-Widerständen gut erklärt:
https://www.elektronik-kompendium.de/pu ... /pullr.htm

Das Konzept muss man schon verstanden haben, wenn man es einsetzen will. Mit Entprellung hat es übrigens gar nichts zu tun, das wäre ein Fall für Kondesatoren.
Grüße,
Thomas (eh. ElektrikTrick)

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#15 Beitrag von Kevin1897 »

Also solangsam bin ich am Rande der verzweiflung.
Jetzt habe ich vor lauter Code mir wohl einen Fehler in den Quellcode gebastelt.

Habe den Block mit "PZB" Auf Keymap umgebaut.

Habe die Bibliotheken
#include <Keyboard.h>
#include <Keyboard_de_DE.h> Eingefügt.

Jetzt habe ich Leider noch das Tastenproblem. Es kommt entweder garnichts, oder was Falsches dabei raus!
Wie werden die Tastencode im einzerlnen Befehl eingegeben (HEX, DEZ)?

Code: Alles auswählen

#include <Keyboard.h>
#include <Keyboard_de_DE.h>

//Zugbeeinflussung PZB90
int buttonStateFrei = 0;
int buttonStateWach = 0;
int buttonStateBef = 0;
//Federspeicherbremse
int buttonStateFBA = 0;
int buttonStateFBL = 0;
//Mg-Bremse
int buttonStateMg = 0;
//Fahrtrichtung
int buttonStateFV = 0;
int buttonStateFR = 0;
//Führeraum besetzt
int buttonStateFRI = 0;
int buttonStateFRO = 0;
//Hauptschalter ET
int buttonStateHSE = 0;
int buttonStateHSA = 0;
//Stromabnehmer ET
int buttonStateSTH = 0;
int buttonStateSTS = 0;
//Sand
int buttonStateSand = 0;
//SIFA
int buttonStateSifa = 0;

void setup() {
  pinMode(1, INPUT_PULLUP);   //PZB90 Frei
  pinMode(2, INPUT_PULLUP);   //PZB90 Wachsam
  pinMode(3, INPUT_PULLUP);   //PZB90 Befehl 40
  pinMode(4, INPUT_PULLUP);   //Federspeicherbremse Anlegen
  pinMode(5, INPUT_PULLUP);   //Federspeicherbremse Lösen
  pinMode(6, INPUT_PULLUP);   //Mg-Bremse
  pinMode(7, INPUT_PULLUP);   //Fahrtrichtung Vorwärts
  pinMode(8, INPUT_PULLUP);   //Fahrtrichtung Rückwärts
  pinMode(9, INPUT_PULLUP);   //Führerpult Aktivieren
  pinMode(10, INPUT_PULLUP);  //Führerpult Deaktivieren
  pinMode(11, INPUT_PULLUP);  //Hauptschalter Einlegen
  pinMode(12, INPUT_PULLUP);  //Hauptschalter Auslegen
  pinMode(13, INPUT_PULLUP);  //Stromabnehmer Heben
  pinMode(14, INPUT_PULLUP);  //Stromabnehmer Senken
  pinMode(15, INPUT_PULLUP);  //Sanden
  pinMode(16, INPUT_PULLUP);  //SIFA
  Keyboard.begin();
}

void loop() {
  buttonStateFrei = digitalRead(1);
  if (buttonStateFrei == LOW) {
    uint8_t keymap = 0x62; //Taste . (Punkt)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }
 
  buttonStateWach = digitalRead(2);
  if (buttonStateWach == LOW) {
    uint8_t keymap = 0x63; //Taste - (Minus)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateBef = digitalRead(3);
  if (buttonStateBef == LOW) {
    uint8_t keymap = 0x58; //Taste , (Komma)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBA = digitalRead(4);
  if (buttonStateFBA == LOW) {
    Keyboard.press(228);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBL = digitalRead(5);
  if (buttonStateFBL == LOW) {
    Keyboard.press(252);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMg = digitalRead(6);
  if (buttonStateMg == LOW) {
    Keyboard.press(109);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFV = digitalRead(7);
  if (buttonStateFV == LOW) {
    Keyboard.press(118);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFR = digitalRead(8);
  if (buttonStateFR == LOW) {
    Keyboard.press(114);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRI = digitalRead(9);
  if (buttonStateFRI == LOW) {
    Keyboard.press(105);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRO = digitalRead(10);
  if (buttonStateFRO == LOW) {
    Keyboard.press(111);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSE = digitalRead(11);
  if (buttonStateHSE == LOW) {
    Keyboard.press(104);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSA = digitalRead(12);
  if (buttonStateHSA == LOW) {
    Keyboard.press(110);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTH = digitalRead(13);
  if (buttonStateSTH == LOW) {
    Keyboard.press(101);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTS = digitalRead(14);
  if (buttonStateSTS == LOW) {
    Keyboard.press(99);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSand = digitalRead(15);
  if (buttonStateSand == LOW) {
    Keyboard.press(115);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSifa = digitalRead(16);
  if (buttonStateSifa == LOW) {
    Keyboard.press(20);
    delay(100);
    Keyboard.releaseAll();
  }
}
BR620/622/642 BR8442 ;-)

Benutzeravatar
Thomas B
Beiträge: 411
Registriert: 28.03.2007 16:41:08
Wohnort: Bergisch Gladbach
Kontaktdaten:

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#16 Beitrag von Thomas B »

Ich kenne mich jetzt nicht speziell mit Arduino und der Keyboard-Lib aus, aber hast du dir mal die Beschreibung dazu angeguckt?
https://www.arduino.cc/reference/en/lan ... /keyboard/

Weil das hier scheint mir keinen Sinn zu ergeben:

Code: Alles auswählen

    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
Die begin-Methode wird laut meinem Verständnis einmal beim Setup aufgerufen und kann nur ein Tastatur-Layout als Argument bekommen. Keyboard.end() solltest du eigentlich gar nicht benutzen.
Danach würdest du in der Loop wenn der Pin auf LOW geht, ein Keyboard.press(...) und bei HIGH ein Keyboard.release(...) schicken. Also zumindest in der Logik mit Pull-Up Widerständen.
Grüße,
Thomas (eh. ElektrikTrick)

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#17 Beitrag von Kevin1897 »

Das würde zumindest erklären warum ich an diesen 3 Anschlüssen keine Reaktion gezeigt bekomme.
Ich nehme mal Keyboard.begin und keyboard.end Raus.

Keyboard.begin wird ja schon im setup aufgerufen.

Nach der Änderung sieht es dann so aus:

Code: Alles auswählen

void setup() {
  pinMode(1, INPUT_PULLUP);   //PZB90 Frei
  pinMode(2, INPUT_PULLUP);   //PZB90 Wachsam
  pinMode(3, INPUT_PULLUP);   //PZB90 Befehl 40
  pinMode(4, INPUT_PULLUP);   //Federspeicherbremse Anlegen
  pinMode(5, INPUT_PULLUP);   //Federspeicherbremse Lösen
  pinMode(6, INPUT_PULLUP);   //Mg-Bremse
  pinMode(7, INPUT_PULLUP);   //Fahrtrichtung Vorwärts
  pinMode(8, INPUT_PULLUP);   //Fahrtrichtung Rückwärts
  pinMode(9, INPUT_PULLUP);   //Führerpult Aktivieren
  pinMode(10, INPUT_PULLUP);  //Führerpult Deaktivieren
  pinMode(11, INPUT_PULLUP);  //Hauptschalter Einlegen
  pinMode(12, INPUT_PULLUP);  //Hauptschalter Auslegen
  pinMode(13, INPUT_PULLUP);  //Stromabnehmer Heben
  pinMode(14, INPUT_PULLUP);  //Stromabnehmer Senken
  pinMode(15, INPUT_PULLUP);  //Sanden
  pinMode(16, INPUT_PULLUP);  //SIFA
  Keyboard.begin(KeyboardLayout_de_DE);
}

Code: Alles auswählen

void loop() {
  buttonStateFrei = digitalRead(1);
  if (buttonStateFrei == LOW) {
    uint8_t keymap = 0x58; //Taste . (Punkt)
    Keyboard.press(0);
    delay(100);
    Keyboard.releaseAll();
  }
 
  buttonStateWach = digitalRead(2);
  if (buttonStateWach == LOW) {
    uint8_t keymap = 0x62; //Taste - (Minus)
    Keyboard.press(0);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateBef = digitalRead(3);
  if (buttonStateBef == LOW) {
    uint8_t keymap = 0x63; //Taste , (Komma)
    Keyboard.press(0);
    delay(100);
    Keyboard.releaseAll();
  }
Aber passieren tut nichts.
BR620/622/642 BR8442 ;-)

Benutzeravatar
Thomas B
Beiträge: 411
Registriert: 28.03.2007 16:41:08
Wohnort: Bergisch Gladbach
Kontaktdaten:

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#18 Beitrag von Thomas B »

Grundsätzlich sehe ich hier ein Verständnis-Problem.
Alles innerhalb von Loop() wird ständig wiederholt. D.h. so wie du es da programmiert hast, bombardierst du deinen PC mit Tastenanschlägen. Keymap bezieht sich außerdem nur auf das Tastenlayout, den Tastencode musst du bei Press und Release eingeben. Die Press- oder Release-Methode sollten auch jeweils nur dann gesendet werden wenn sich das Signal am Pin ändert
So z.B.

Code: Alles auswählen

if (buttonStateFrei != digitalRead(1)) {
  buttonStateFrei = digitalRead(1);
  if (buttonStateFrei == LOW) {
    Keyboard.press(0x58);
  } else {
    Keyboard.release(0x58);
  }
} 
So wird der Zustand vom Pin mit dem Zustand aus dem letzten Schleifendurchlauf verglichen und das Ereignis dahinter wird nur ausgeführt wenn sie sich unterscheiden.
Bin mir nicht 100% sicher dass es so geht und man kann es wahrscheinlich auch noch eleganter lösen, aber ich schreib gerade vom Handy aus.
Grüße,
Thomas (eh. ElektrikTrick)

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#19 Beitrag von Kevin1897 »

Grundsätzlich ist dein Gedankenansatz schon richtig, aber wird in ZUSI eh nur ein Befehl akzeptiert?

Code habe ich etwas abgeändert:

Code: Alles auswählen

 #include <Keyboard.h>
#include <Keyboard_de_DE.h>

//Zugbeeinflussung PZB90
int buttonStateFrei = 0;
int buttonStateWach = 0;
int buttonStateBef = 0;
//Federspeicherbremse
int buttonStateFBA = 0;
int buttonStateFBL = 0;
//Mg-Bremse
int buttonStateMg = 0;
//Fahrtrichtung
int buttonStateFV = 0;
int buttonStateFR = 0;
//Führeraum besetzt
int buttonStateFRI = 0;
int buttonStateFRO = 0;
//Hauptschalter ET
int buttonStateHSE = 0;
int buttonStateHSA = 0;
//Stromabnehmer ET
int buttonStateSTH = 0;
int buttonStateSTS = 0;
//Sand
int buttonStateSand = 0;
//SIFA
int buttonStateSifa = 0;
//Türen
int buttonStateTL = 0;
int buttonStateTR = 0;
int buttonStateTZ = 0;
//Makrofon
int buttonStateMak = 0;


void setup() {
  pinMode(0, INPUT_PULLUP);   //PZB90 Frei
  pinMode(1, INPUT_PULLUP);   //PZB90 Wachsam
  pinMode(2, INPUT_PULLUP);   //PZB90 Befehl 40
  pinMode(3, INPUT_PULLUP);   //Federspeicherbremse Anlegen
  pinMode(4, INPUT_PULLUP);   //Federspeicherbremse Lösen
  pinMode(5, INPUT_PULLUP);   //Mg-Bremse
  pinMode(6, INPUT_PULLUP);   //Fahrtrichtung Vorwärts
  pinMode(7, INPUT_PULLUP);   //Fahrtrichtung Rückwärts
  pinMode(8, INPUT_PULLUP);   //Führerpult Aktivieren
  pinMode(9, INPUT_PULLUP);  //Führerpult Deaktivieren
  pinMode(10, INPUT_PULLUP);  //Hauptschalter Einlegen
  pinMode(11, INPUT_PULLUP);  //Hauptschalter Auslegen
  pinMode(12, INPUT_PULLUP);  //Stromabnehmer Heben
  pinMode(13, INPUT_PULLUP);  //Stromabnehmer Senken
  pinMode(14, INPUT_PULLUP);  //Sanden
  pinMode(15, INPUT_PULLUP);  //SIFA
  pinMode(16, INPUT_PULLUP);  //Tür Links
  pinMode(17, INPUT_PULLUP);  //Tür Rechts
  pinMode(18, INPUT_PULLUP);  //Tür Zu
  pinMode(19, INPUT_PULLUP);  //Tür Makrofon
  Keyboard.begin();
}

void loop() {
  buttonStateFrei = digitalRead(0);
  if (buttonStateFrei == LOW) {
    Keyboard.print("F"); //Taste F
    delay(100);
    Keyboard.releaseAll();
  }
 
  buttonStateWach = digitalRead(1);
  if (buttonStateWach == LOW) {
    Keyboard.print("."); //Taste . (Punkt)
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateBef = digitalRead(2);
  if (buttonStateBef == LOW) {
    Keyboard.print(","); //Taste , (Komma)
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBA = digitalRead(3);
  if (buttonStateFBA == LOW) {
    Keyboard.print("A"); //Taste A
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBL = digitalRead(4);
  if (buttonStateFBL == LOW) {
    Keyboard.print("U"); //Taste U
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMg = digitalRead(5);
  if (buttonStateMg == LOW) {
    Keyboard.print("M"); //Taste M
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFV = digitalRead(6);
  if (buttonStateFV == LOW) {
    Keyboard.print("V"); //Taste V
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFR = digitalRead(7);
  if (buttonStateFR == LOW) {
    Keyboard.print("R"); //Taste R
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRI = digitalRead(8);
  if (buttonStateFRI == LOW) {
    Keyboard.print("I"); //Taste I
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRO = digitalRead(9);
  if (buttonStateFRO == LOW) {
    Keyboard.print("O"); //Taste O
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSE = digitalRead(10);
  if (buttonStateHSE == LOW) {
    Keyboard.print("H"); //Taste H
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSA = digitalRead(11);
  if (buttonStateHSA == LOW) {
    Keyboard.print("N"); //Taste N
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTH = digitalRead(12);
  if (buttonStateSTH == LOW) {
    Keyboard.print("E"); //Taste E
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTS = digitalRead(13);
  if (buttonStateSTS == LOW) {
    Keyboard.print("C"); //Taste C
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSand = digitalRead(14);
  if (buttonStateSand == LOW) {
    Keyboard.print("S"); //Taste S
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSifa = digitalRead(15);
  if (buttonStateSifa == LOW) {
    Keyboard.print("B"); //Taste B
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateTL = digitalRead(16);
  if (buttonStateTL == LOW) {
    Keyboard.print("L"); //Taste L
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateTR = digitalRead(17);
  if (buttonStateTR == LOW) {
    Keyboard.print("Q"); //Taste Q
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateTZ = digitalRead(18);
  if (buttonStateTZ == LOW) {
    Keyboard.print("Z"); //Taste Z
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMak = digitalRead(19);
  if (buttonStateMak == LOW) {
    Keyboard.print("P"); //Taste P
    delay(100);
    Keyboard.releaseAll();
  }
}
Was ich gerade noch zu lösen versuche, wie bekomme ich die Analogpins A0-A5 als Input Pin 15-19 deklariert?
BR620/622/642 BR8442 ;-)

Benutzeravatar
Thomas U.
Beiträge: 3291
Registriert: 15.03.2004 16:39:15
Wohnort: Gelsenkirchen

Re: Arduino Leonardo als Tastaturersatz - Fehlersuche

#20 Beitrag von Thomas U. »

Kevin1897 hat geschrieben: 21.08.2023 15:14:20Was ich gerade noch zu lösen versuche, wie bekomme ich die Analogpins A0-A5 als Input Pin 15-19 deklariert?
Wie die digitalen Pins auch, pinMode(A0,INPUT_PULLUP).

Ich habe mir mal schnell&schmutzig was zusammengeklöppelt (mit 'nem Pro Micro, dem kleinen Bruder des Leonardo). Funktioniert bei mir tadellos, keine seltsamen Tastendrücke zu finden.

Code: Alles auswählen

#include <Keyboard.h>

byte Wach=1, Frei=1;

void setup()
{
  pinMode(10,INPUT_PULLUP);
  pinMode(A0,INPUT_PULLUP);
  Keyboard.begin(KeyboardLayout_de_DE);
}

void loop()
{
  if(Wach != digitalRead(10))
  {
    Wach = digitalRead(10);
    if(Wach == 0)
    {
      Keyboard.press(KEY_KP_ENTER);
    }
    else
    {
      Keyboard.release(KEY_KP_ENTER);
    }
    delay(100);
  }

  if(Frei != digitalRead(A0))
  {
    Frei = digitalRead(A0);
    if(Frei == 0)
    {
      Keyboard.press(KEY_KP_DOT);
    }
    else
    {
      Keyboard.release(KEY_KP_DOT);
    }
    delay(100);
  }
}
KEY_KP_... sind fertige Definitionen aus der Keyboard.h, spart einem kryptische Tastencodes.

Antworten