NicoHood / HoodLoader2

16u2 Bootloader to reprogram 16u2 + 328/2560 with Arduino IDE
http://www.nicohood.de
734 stars 186 forks source link

dosnt get recognized after including Keyboard Library #140

Closed Mcletsplay001 closed 3 months ago

Mcletsplay001 commented 3 months ago

Hello I'm trining to make a HID device with a arduino Mega so far I got the Mouse to work but if I try to include the keyboard Library and restart the arduino dosn't get recognized anymore it shows up as unrecognized device My Code:


#include "HID.h"

#include "Mouse.h"
#include "Keyboard.h"
//#include "HID-Project.h"

const int joystickCenterX = 512; // Beispielmittelpunkt des Joysticks für die X-Achse
const int joystickCenterY = 512; // Beispielmittelpunkt des Joysticks für die Y-Achse
const int joystickDeadzone = 10; // Totzone zur Vermeidung von Drift um den Mittelpunkt
const float scalingFactor = 0.05; // Skalierungsfaktor für die Mausbewegung

void setup() {
  Serial1.begin(115200); // Starte die serielle Kommunikation mit dem IO-MCU
   Mouse.begin();
  Keyboard.begin(); // Starte die Tastatur
  // Starte die Maus
  Serial.begin(115200); // Starte die serielle Kommunikation für Debugging

}

void loop() {
  if (Serial1.available()) {

    char zeile[100]; 
    Serial1.readBytesUntil('\n', zeile, 100);
    zeile[strlen(zeile) - 1] = '\0'; 

    processValues(zeile);
  }
}

void processValues(char* zeile) {
  // Beispielhafte Verarbeitung der empfangenen Werte
  // blinkerR, blinkerL, WarnB, Hand, Horn, Z0, Z1, Z2, Z3, L1, Mousex, Mousey, MouseR, MouseL, MouseM
  int blinkerR, blinkerL, WarnB, Hand, Horn, Z0, Z1, Z2, Z3, L1, Mousex, Mousey, MouseR, MouseL, MouseM;
  sscanf(zeile, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d",
         &blinkerR, &blinkerL, &WarnB, &Hand, &Horn, &Z0, &Z1, &Z2, &Z3, &L1, &Mousex, &Mousey, &MouseR, &MouseL, &MouseM);

// Debugging-Nachrichten für die empfangenen Werte

  if (blinkerR == 1) {

    Keyboard.write(KEY_KP_7);
  }

  if (blinkerL == 1) {

    Keyboard.write(',');
  }

  if (WarnB == 1) {

    Keyboard.write(KEY_KP_8);
  }

  if (Hand == 1) {

    Keyboard.write('p');
  }

  if (Horn == 1) {

    Keyboard.write('h');
  }
  if (Z0 == 1) {

    Keyboard.write(KEY_F20);
  }

  if (Z1 == 1) {

    Keyboard.write(KEY_F22);
  }

  if (Z2 == 1) {

    Keyboard.write(KEY_F23);
  }

  if (Z3 == 1) {
    // Aktion für Hupe
    Keyboard.write(KEY_F24);
  }
  if (L1 == 1) {
    // Aktion für Hupe
    Keyboard.write('n');
  }

  // Debugging-Nachrichten für die empfangenen Werte

  //Serial.print(Mousex);

 // Serial.println(Mousey);

  // Anpassung der Mausbewegung basierend auf dem Joystick-Mittelpunkt
  int deltaX = Mousex - joystickCenterX;
  int deltaY = Mousey - joystickCenterY;

  // Vermeidung von Drift um den Mittelpunkt
  if (abs(deltaX) < joystickDeadzone) deltaX = 0;
  if (abs(deltaY) < joystickDeadzone) deltaY = 0;

  // Skalierung der Bewegungen für präzisere Steuerung
  deltaX *= scalingFactor;
  deltaY *= scalingFactor;

  // Bewege die Maus basierend auf den berechneten Deltas
  Mouse.move(deltaX, deltaY, 0);
  if (MouseR == 1) {
    Mouse.press(MOUSE_RIGHT);
  } else  {
    Mouse.release(MOUSE_RIGHT);
  }

  if (MouseL == 1) {
    Mouse.press(MOUSE_LEFT);
  } else  {
    Mouse.release(MOUSE_LEFT);
  }

  if (MouseM == 1) {
    Mouse.press(MOUSE_MIDDLE);
  } else  {
    Mouse.release(MOUSE_MIDDLE);
  }
}
Mcletsplay001 commented 3 months ago

forgot to add the error (in German) : Dieses Gerät wurde angehalten, weil es Fehler gemeldet hat. (Code 43) Fehler bei einer Anforderung des USB-Gerätedeskriptors.

Mcletsplay001 commented 3 months ago

yes I fixt it had to change the way it recived the values

#include <Mouse.h>
#include <Keyboard.h>

const int joystickCenterX = 512; // Beispielmittelpunkt des Joysticks für die X-Achse
const int joystickCenterY = 512; // Beispielmittelpunkt des Joysticks für die Y-Achse
const int joystickDeadzone = 10; // Totzone zur Vermeidung von Drift um den Mittelpunkt
const float scalingFactor = 0.05; // Skalierungsfaktor für die Mausbewegung

void setup() {
  // Starten der HID-Bibliotheken
  Keyboard.begin();
  Mouse.begin();
  // HID().begin();
  // Serielle Kommunikation initialisieren
  Serial1.begin(115200); // Kommunikation mit dem IO-MCU
  //Serial.begin(74880); // Debugging
}

void loop() {
  if (Serial1.available()) {
    char zeile[100];
    Serial1.readBytesUntil('\n', zeile, 100);
    zeile[strlen(zeile) - 1] = '\0';
    processValues(zeile);
  }
}

void processValues(char* zeile) {
  int values[15];
  int i = 0;

  // Tokenisierung des Strings
  char* token = strtok(zeile, ";");
  while (token != nullptr && i < 15) {
    values[i] = atoi(token); // ASCII to Integer
    token = strtok(nullptr, ";");
    i++;
  }

  // Werte in Variablen zuweisen
  int blinkerR = values[0];
  int blinkerL = values[1];
  int WarnB = values[2];
  int Hand = values[3];
  int Horn = values[4];
  int Z0 = values[5];
  int Z1 = values[6];
  int Z2 = values[7];
  int Z3 = values[8];
  int L1 = values[9];
  int Mousex = values[10];
  int Mousey = values[11];
  int MouseR = values[12];
  int MouseL = values[13];
  int MouseM = values[14];

    if (blinkerR == 1) {
      Keyboard.press(KEY_KP_7);
      Keyboard.release(KEY_KP_7);
    }

    if (blinkerL == 1) {
      Keyboard.press(',');
      Keyboard.release(',');
    }

    if (WarnB == 1) {
      Keyboard.press(KEY_KP_8);
      Keyboard.release(KEY_KP_8);
    }

    if (Hand == 1) {
      Keyboard.press('p');
      Keyboard.release('p');
    }

    if (Horn == 1) {
      Keyboard.press('h');
      Keyboard.release('h');
    }

    if (Z0 == 1) {
      Keyboard.press(KEY_F20);
      Keyboard.release(KEY_F20);
    }

    if (Z1 == 1) {
      Keyboard.press(KEY_F22);
      Keyboard.release(KEY_F22);
    }

    if (Z2 == 1) {
      Keyboard.press(KEY_F23);
      Keyboard.release(KEY_F23);
    }

    if (Z3 == 1) {
      Keyboard.press(KEY_F24);
      Keyboard.release(KEY_F24);
    }

    if (L1 == 1) {
      Keyboard.press('n');
      Keyboard.release('n');
    }

  //Serial.print(Mousex);
  //Serial.println(Mousey);

  int deltaX = Mousex - joystickCenterX;
  int deltaY = Mousey - joystickCenterY;

  if (abs(deltaX) < joystickDeadzone) deltaX = 0;
  if (abs(deltaY) < joystickDeadzone) deltaY = 0;
  deltaY = -deltaY;
  deltaX *= scalingFactor;
  deltaY *= scalingFactor;

  Mouse.move(deltaX, deltaY, 0);

  if (MouseR == 1) {
    Mouse.press(MOUSE_RIGHT);
  } else {
    Mouse.release(MOUSE_RIGHT);
  }

  if (MouseL == 1) {
    Mouse.press(MOUSE_LEFT);
  } else {
    Mouse.release(MOUSE_LEFT);
  }

  if (MouseM == 1) {
    Mouse.press(MOUSE_MIDDLE);
  } else {
    Mouse.release(MOUSE_MIDDLE);
  }