Dauerhaftes Leuchten der RX-LED

Grüß Gott,

Ich habe nun seit etwa 2 Wochen meinen neuen Arduino Leonardo.
Am Anfang lief auch alles gut, bis gestern. Ich habe ein Programm geschrieben, dass eine Tastatur emuliert für die Steuerung eines Spiels.
Als Eingabe nutze ich normale Wippschalter und für mehr Pins benutze ich 4 4051.
Alles hat auch geklappt. Die Wippschalter, die 4051's, und auch das Programm.

Doch seit gestern leuchtet nur noch die RX-LED dauerhaft und das emulieren der Tastatur funktioniert auch nicht mehr.
Unter dem Geräte-Manager in Windows wir bei Eingabegeräte nur noch "USB-Eingabegerät" angezeigt, mit einem Warn-Dreieck wegen Treiber Probleme. Ich hab auch schon manuell versucht die Treiber zu installieren, aber ohne Erfolg.
Nach meiner Suche im Internet, habe ich dem Tipp mit dem Reset des Arduinos und dann das Hochladen des Blink-Programms ausprobiert --> RX-LED aus, Arduino läuft.
Ich hab mir gedacht, dass es vielleicht an der Tastatur Emulierung liegt.
Also Tastatur und Maus Beispiel hochgeladen, Serial Monitor geöffnet und eingaben gesendet --> RX-LED aus, Arduino empfängt Eingaben, Maus bewegt sich.

Nun nach stundenlangem Verzweifeln kommt mir die Vermutung, dass das Programm dran schuld ist. Vielleicht kann jemand mal drüberschauen und findet meinen blöden Fehler:

#include "Keyboard.h"
//Variablen
//Software Variablen
//KeyCode-Tabelle
char KeyTable[45];
//Key-Variable
char key = ' ';
int data[7][3];
int old[7][3];
///Input Config (4051 Anschluesse)
int Input1 = 5;
int Input2 = 6;
int Input3 = 7;
int Input4 = 8;
int SelectOut1 = 2;
int SelectOut2 = 3;
int SelectOut3 = 4;
int bit1 = 0;
int bit2 = 0;
int bit3 = 0;
int InVar1 = 0;
int InVar2 = 0;
int InVar3 = 0;
int InVar4 = 0;

//Ende Button Config

//LED Leuchtmelder


void setup() {
  //Variablen
//KeyCode-Tabelle initalliesieren
  KeyTable[10] = ' ';
  KeyTable[11] = ' ';
  KeyTable[12] = '6';
  KeyTable[13] = '7';
  KeyTable[14] = '8';
  KeyTable[15] = ' ';
  KeyTable[16] = ' ';
  KeyTable[17] = ' ';
  KeyTable[20] = ' ';
  KeyTable[21] = ' ';
  KeyTable[22] = ' ';
  KeyTable[23] = ' ';
  KeyTable[24] = ' ';
  KeyTable[25] = ' ';
  KeyTable[26] = '1';
  KeyTable[27] = '2';
  KeyTable[30] = 'D';
  KeyTable[31] = 'N';
  KeyTable[32] = 'R';
  KeyTable[33] = 'B';
  KeyTable[34] = '-';
  KeyTable[35] = '/';
  KeyTable[36] = '*';
  KeyTable[37] = ' ';
  KeyTable[40] = 'M';
  KeyTable[41] = ' ';
  KeyTable[42] = 'E';
  KeyTable[43] = 'L';
  KeyTable[44] = ' ';
  KeyTable[45] = ' ';
  KeyTable[46] = ' ';
  KeyTable[47] = ' ';
 //Buttons

 Keyboard.begin();
pinMode(SelectOut1, OUTPUT);
  pinMode(SelectOut2, OUTPUT);
  pinMode(SelectOut3, OUTPUT);
 pinMode(13, OUTPUT);
  pinMode(Input1, INPUT);
  pinMode(Input2, INPUT);
  pinMode(Input3, INPUT);
  pinMode(Input4, INPUT);
 digitalWrite(Input1, HIGH);
  digitalWrite(Input2, HIGH);
  digitalWrite(Input3, HIGH);
  digitalWrite(Input4, HIGH);
  Serial.begin(9600);

  for (int i = 0; i <= 7; i++) {
    old[i][0] = HIGH;
    old[i][1] = HIGH;
    old[i][2] = HIGH;
    old[i][3] = HIGH;
  }
}

int GetKeyCode(int ICNum, int PinNum) {
 return 10 * ICNum + PinNum;
}
char GetKey(int KeyCodeNum) {
  return KeyTable[KeyCodeNum];
}

bool PressKey(int keyNum) {
  Keyboard.write(GetKey(keyNum));
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  Serial.write("Taste Gedrueckt: ");
  Serial.write(GetKey(keyNum));
  Serial.println("");
  return true;
}


void loop() }

  for (int i = 0; i <= 7; i++) {
    // Bit aus dem zaehler bekommen
    bit1 = bitRead(i, 0);
    bit2 = bitRead(i, 1);
    bit3 = bitRead(i, 2);
    //Ausgabe an Select Pins
    digitalWrite(SelectOut1, bit1);
    digitalWrite(SelectOut2, bit2);
    digitalWrite(SelectOut3, bit3);
    //    InVar1 = digitalRead(Input1);
    //    InVar2 = digitalRead(Input2);
    //    InVar3 = digitalRead(Input3);
    //    InVar4 = digitalRead(Input4);

    data[i][0] = digitalRead(Input1);
    data[i][1] = digitalRead(Input2);
    data[i][2] = digitalRead(Input3);
    data[i][3] = digitalRead(Input4);





  }
  for (int i = 0; i <= 7; i++) {
    if (old[i][0] != data[i][0]) {

      key = GetKeyCode(1, i);
      PressKey(key);
      old[i][0] = data[i][0];

    }
   if (old[i][1] != data[i][1]) {
     key = GetKeyCode(2, i);
      PressKey(key);
      old[i][1] = data[i][1];
    }
   if (old[i][2] != data[i][2]) {
     key = GetKeyCode(3, i);
      PressKey(key);
      old[i][2] = data[i][2];

    }
   if (old[i][3] != data[i][3]) {
      key = GetKeyCode(4, i);
      PressKey(key);
      old[i][3] = data[i][3];
  }

 }

  delay(100);
}

Ich komm grad echt nicht weiter.

Danke schon mal im Vorraus.

MfG
David1611

Der Kontroller des Arduino Leonardo macht die USB-Verbindung und führt Deinen Sketch aus.
Darum kann bei einem blockierenden Sketch die USB-Schnittstelle nicht mehr funktionieren.
Lade den Blink Sketch, notfalls mit manuellem Reset, drauf und der Leonardo wird wieder funktionieren.
Dann mußt Du den Fehler in Deinem Sketch finden. Poste ihn mal.
Grüße Uwe

Schau dir mal an wie das mit Arrays so funktioniert.

Ich bin bei weitem kein Code-Experte, aber schon beim schnellen Drüberschauen über deinen Sketch, fällt mir folgendes auf:
Du deklarierst zuerst

char KeyTable[45];

KeyTable geht also von KeyTable[0] bis KeyTable[44] - das sind die 45 Werte, die du deklarierst. Weiter unten schreibst du dann:

  KeyTable[45] = ' ';
  KeyTable[46] = ' ';
  KeyTable[47] = ' ';

dabei schreibst du über den Arraybereich hinaus. Im Endeffekt schreibst du wahrscheinlich in den Wertebereich einer anderen Variablen und es gibt "interessante" Ergebnisse.
Das ist zugegeben bei C/C++ etwas anders als bei anderen Programmiersprachen und eine ziemliche Fallgrube für Anfänger und "Amateure". Der Compiler lässt das auch noch ziemlich ohne Meckern durchgehen - obwohl der sonst bei "jeder Kleinigkeit" gleich Zeter und Mordio schreit :slight_smile:

Außerdem (noch ein Array-Problem), deklarierst du:

int old[7][3];

das bedeutet old geht also von old[0][0] bis old[6][2]
weiter unten schreibst du

  for (int i = 0; i <= 7; i++) {
    old[i][0] = HIGH;
    old[i][1] = HIGH;
    old[i][2] = HIGH;
    old[i][3] = HIGH;
  }

auch hier wird - bei old[6][3] der Array-Bereich überschrieben.

Wünsche gutes Gelingen!

Vielen Dank euch beiden!

Ich habe einfach den überblick bei meinen Arrays verloren.

Besonders dir uxomm für deine Erklärung und die ausführliche Antwort.

Jetzt macht der Arduino wieder Spaß!! :slight_smile:

Schöner Sonntag noch
David1611