USB klávesnice

Odpovědět
Uživatelský avatar
Diego
Příspěvky: 166
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

USB klávesnice

Příspěvek od Diego » 26 dub 2023, 17:54

Ahoj všem,
mám USB host modul zapojený podle tohodle návodu: https://www.hackster.io/usini/plug-any- ... 266-e0ca8a

Modul funguje akorát se peru s programem. Snažim se připojit klávesnici a po seriáku vypisovat stisknuté klávesy. Základní čísla a písmena mi fungujou, akorát je to v anglické verzi.
Snažim se pochopit jak z programu dostat jednu proměnnou v které bude kód hex stisknuté klávesy (včetně modifikace Shift, Ctrl, Alt).

Poradíte někdo?

Díky

Upravený příklad programu:

Kód: Vybrat vše

#include <hidboot.h>
#include <usbhub.h>

// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

class KbdRptParser : public KeyboardReportParser
{
    void PrintKey(uint8_t mod, uint8_t key);

  protected:
    void OnControlKeysChanged(uint8_t before, uint8_t after);

    void OnKeyDown	(uint8_t mod, uint8_t key);
    void OnKeyUp	(uint8_t mod, uint8_t key);
    void OnKeyPressed(uint8_t key);
};

void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
  MODIFIERKEYS mod;
  *((uint8_t*)&mod) = m;
  //Serial.print((mod.bmLeftCtrl   == 1) ? "C" : " ");
  //Serial.print((mod.bmLeftShift  == 1) ? "S" : " ");
 // Serial.print((mod.bmLeftAlt    == 1) ? "A" : " ");
 // Serial.print((mod.bmLeftGUI    == 1) ? "G" : " ");

  //Serial.print(" >");
 // PrintHex<uint8_t>(key, 0x80);
  //Serial.print("< ");

  //Serial.print((mod.bmRightCtrl   == 1) ? "C" : " ");
  //Serial.print((mod.bmRightShift  == 1) ? "S" : " ");
  //Serial.print((mod.bmRightAlt    == 1) ? "A" : " ");
 // Serial.println((mod.bmRightGUI    == 1) ? "G" : " ");
};

void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
  //Serial.print("DN ");
  PrintKey(mod, key);
  uint8_t c = OemToAscii(mod, key);

  if (c)
    OnKeyPressed(c);
}

void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) {

  MODIFIERKEYS beforeMod;
  *((uint8_t*)&beforeMod) = before;

  MODIFIERKEYS afterMod;
  *((uint8_t*)&afterMod) = after;

  if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl) {
    //Serial.println("LeftCtrl changed");
  }
  if (beforeMod.bmLeftShift != afterMod.bmLeftShift) {
   // Serial.println("LeftShift changed");
  }
  if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt) {
   // Serial.println("LeftAlt changed");
  }
  if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI) {
    //Serial.println("LeftGUI changed");
  }

  if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl) {
    //Serial.println("RightCtrl changed");
  }
  if (beforeMod.bmRightShift != afterMod.bmRightShift) {
    //Serial.println("RightShift changed");
  }
  if (beforeMod.bmRightAlt != afterMod.bmRightAlt) {
    //Serial.println("RightAlt changed");
  }
  if (beforeMod.bmRightGUI != afterMod.bmRightGUI) {
    //Serial.println("RightGUI changed");
  }

}

void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
  //Serial.print("UP ");
  PrintKey(mod, key);
}

void KbdRptParser::OnKeyPressed(uint8_t key)
{
  //Serial.print("ASCII: ");
  Serial.print((char)key);
  Serial.print(" = ");
  PrintHex<uint8_t>(key, 0x80);
  Serial.println();
};

USB     Usb;
//USBHub     Hub(&Usb);
HIDBoot<USB_HID_PROTOCOL_KEYBOARD>    HidKeyboard(&Usb);

KbdRptParser Prs;

void setup()
{
  Serial.begin( 115200 );
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  Serial.println("Start");

  if (Usb.Init() == -1)
    Serial.println("OSC did not start.");

  delay( 200 );

  HidKeyboard.SetReportParser(0, &Prs);
}

void loop()
{
  Usb.Task();
}

https://arze.cz - ARduino Zapojení Elektronika

Uživatelský avatar
Diego
Příspěvky: 166
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: USB klávesnice

Příspěvek od Diego » 26 dub 2023, 18:43

Ještě doplním:
Z kódu klávesy už bych si podle tabulky zvolil co se má poslat za znak. (To v příkladu taky neni, nevim jak to kóduje)
https://arze.cz - ARduino Zapojení Elektronika

Uživatelský avatar
Diego
Příspěvky: 166
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: USB klávesnice

Příspěvek od Diego » 30 dub 2023, 08:12

Tak už jsem si poradil. Upravil jsem příklad a teď to funguje jak sem chtěl. Ještě dořešim komunikaci po i2c a pak sem dam výsledek ;)
https://arze.cz - ARduino Zapojení Elektronika

Uživatelský avatar
Diego
Příspěvky: 166
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: USB klávesnice

Příspěvek od Diego » 06 kvě 2023, 06:48

Tak už mám hotový modul na převod USB klávesnice na I2C sběrnici: https://www.arze.cz/USBtoI2C.html
https://arze.cz - ARduino Zapojení Elektronika

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů